summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.mailmap2
-rwxr-xr-xbin/spack4
-rw-r--r--etc/spack/repos.yaml8
-rw-r--r--lib/spack/llnl/util/lang.py33
-rw-r--r--lib/spack/llnl/util/tty/colify.py7
-rw-r--r--lib/spack/spack/__init__.py25
-rw-r--r--lib/spack/spack/build_environment.py25
-rw-r--r--lib/spack/spack/cmd/checksum.py2
-rw-r--r--lib/spack/spack/cmd/clean.py2
-rw-r--r--lib/spack/spack/cmd/compiler.py7
-rw-r--r--lib/spack/spack/cmd/config.py12
-rw-r--r--lib/spack/spack/cmd/create.py14
-rw-r--r--lib/spack/spack/cmd/diy.py4
-rw-r--r--lib/spack/spack/cmd/edit.py37
-rw-r--r--lib/spack/spack/cmd/extensions.py3
-rw-r--r--lib/spack/spack/cmd/fetch.py4
-rw-r--r--lib/spack/spack/cmd/find.py2
-rw-r--r--lib/spack/spack/cmd/info.py2
-rw-r--r--lib/spack/spack/cmd/install.py2
-rw-r--r--lib/spack/spack/cmd/list.py2
-rw-r--r--lib/spack/spack/cmd/location.py6
-rw-r--r--lib/spack/spack/cmd/mirror.py6
-rw-r--r--lib/spack/spack/cmd/package-list.py2
-rw-r--r--lib/spack/spack/cmd/patch.py2
-rw-r--r--lib/spack/spack/cmd/pkg.py2
-rw-r--r--lib/spack/spack/cmd/providers.py2
-rw-r--r--lib/spack/spack/cmd/repo.py135
-rw-r--r--lib/spack/spack/cmd/restage.py2
-rw-r--r--lib/spack/spack/cmd/stage.py2
-rw-r--r--lib/spack/spack/cmd/test-install.py8
-rw-r--r--lib/spack/spack/cmd/uninstall.py9
-rw-r--r--lib/spack/spack/cmd/urls.py2
-rw-r--r--lib/spack/spack/cmd/versions.py2
-rw-r--r--lib/spack/spack/compilers/__init__.py76
-rw-r--r--lib/spack/spack/config.py567
-rw-r--r--lib/spack/spack/database.py5
-rw-r--r--lib/spack/spack/directives.py3
-rw-r--r--lib/spack/spack/directory_layout.py1
-rw-r--r--lib/spack/spack/graph.py2
-rw-r--r--lib/spack/spack/package.py10
-rw-r--r--lib/spack/spack/packages.py210
-rw-r--r--lib/spack/spack/patch.py6
-rw-r--r--lib/spack/spack/repository.py665
-rw-r--r--lib/spack/spack/resource.py8
-rw-r--r--lib/spack/spack/spec.py83
-rw-r--r--lib/spack/spack/stage.py5
-rw-r--r--lib/spack/spack/test/__init__.py3
-rw-r--r--lib/spack/spack/test/concretize.py12
-rw-r--r--lib/spack/spack/test/config.py92
-rw-r--r--lib/spack/spack/test/database.py3
-rw-r--r--lib/spack/spack/test/directory_layout.py17
-rw-r--r--lib/spack/spack/test/git_fetch.py2
-rw-r--r--lib/spack/spack/test/hg_fetch.py2
-rw-r--r--lib/spack/spack/test/install.py2
-rw-r--r--lib/spack/spack/test/mirror.py2
-rw-r--r--lib/spack/spack/test/mock_packages_test.py51
-rw-r--r--lib/spack/spack/test/multimethod.py48
-rw-r--r--lib/spack/spack/test/namespace_trie.py114
-rw-r--r--lib/spack/spack/test/package_sanity.py19
-rw-r--r--lib/spack/spack/test/packages.py56
-rw-r--r--lib/spack/spack/test/python_version.py4
-rw-r--r--lib/spack/spack/test/spec_dag.py12
-rw-r--r--lib/spack/spack/test/spec_semantics.py32
-rw-r--r--lib/spack/spack/test/svn_fetch.py2
-rw-r--r--lib/spack/spack/test/unit_install.py41
-rw-r--r--lib/spack/spack/test/url_substitution.py1
-rw-r--r--lib/spack/spack/util/naming.py126
-rw-r--r--var/spack/repos/builtin.mock/packages/a/package.py (renamed from var/spack/mock_packages/a/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/b/package.py (renamed from var/spack/mock_packages/b/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/c/package.py (renamed from var/spack/mock_packages/c/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/callpath/package.py (renamed from var/spack/mock_packages/callpath/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/direct_mpich/package.py (renamed from var/spack/mock_packages/direct_mpich/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/dyninst/package.py (renamed from var/spack/mock_packages/dyninst/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/e/package.py (renamed from var/spack/mock_packages/e/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/fake/package.py (renamed from var/spack/mock_packages/fake/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/git-test/package.py (renamed from var/spack/mock_packages/git-test/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/hg-test/package.py (renamed from var/spack/mock_packages/hg-test/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/indirect_mpich/package.py (renamed from var/spack/mock_packages/indirect_mpich/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/libdwarf/package.py (renamed from var/spack/mock_packages/libdwarf/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/libelf/package.py (renamed from var/spack/mock_packages/libelf/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/mpich/package.py (renamed from var/spack/mock_packages/mpich/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/mpich2/package.py (renamed from var/spack/mock_packages/mpich2/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/mpileaks/package.py (renamed from var/spack/mock_packages/mpileaks/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/multimethod/package.py (renamed from var/spack/mock_packages/multimethod/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/netlib-blas/package.py (renamed from var/spack/mock_packages/netlib-blas/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/netlib-lapack/package.py (renamed from var/spack/mock_packages/netlib-lapack/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/openblas/package.py (renamed from var/spack/mock_packages/openblas/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py (renamed from var/spack/mock_packages/optional-dep-test-2/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py (renamed from var/spack/mock_packages/optional-dep-test-3/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/optional-dep-test/package.py (renamed from var/spack/mock_packages/optional-dep-test/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/svn-test/package.py (renamed from var/spack/mock_packages/svn-test/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/trivial_install_test_package/package.py (renamed from var/spack/mock_packages/trivial_install_test_package/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/packages/zmpi/package.py (renamed from var/spack/mock_packages/zmpi/package.py)0
-rw-r--r--var/spack/repos/builtin.mock/repo.yaml2
-rw-r--r--var/spack/repos/builtin/packages/ImageMagick/package.py (renamed from var/spack/packages/ImageMagick/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/Mitos/package.py (renamed from var/spack/packages/Mitos/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/R/package.py (renamed from var/spack/packages/R/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/SAMRAI/no-tool-build.patch (renamed from var/spack/packages/SAMRAI/no-tool-build.patch)0
-rw-r--r--var/spack/repos/builtin/packages/SAMRAI/package.py (renamed from var/spack/packages/SAMRAI/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/activeharmony/package.py (renamed from var/spack/packages/activeharmony/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/adept-utils/package.py (renamed from var/spack/packages/adept-utils/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/apex/package.py (renamed from var/spack/packages/apex/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/arpack/package.py (renamed from var/spack/packages/arpack/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/asciidoc/package.py (renamed from var/spack/packages/asciidoc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/atk/package.py (renamed from var/spack/packages/atk/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/atlas/package.py (renamed from var/spack/packages/atlas/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/autoconf/package.py (renamed from var/spack/packages/autoconf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/automaded/package.py (renamed from var/spack/packages/automaded/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/automake/package.py (renamed from var/spack/packages/automake/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/bear/package.py (renamed from var/spack/packages/bear/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/bib2xhtml/package.py (renamed from var/spack/packages/bib2xhtml/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/binutils/binutilskrell-2.24.patch (renamed from var/spack/packages/binutils/binutilskrell-2.24.patch)0
-rw-r--r--var/spack/repos/builtin/packages/binutils/package.py (renamed from var/spack/packages/binutils/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/bison/package.py (renamed from var/spack/packages/bison/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/boost/package.py (renamed from var/spack/packages/boost/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/bowtie2/bowtie2-2.5.patch (renamed from var/spack/packages/bowtie2/bowtie2-2.5.patch)0
-rw-r--r--var/spack/repos/builtin/packages/bowtie2/package.py (renamed from var/spack/packages/bowtie2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/boxlib/package.py (renamed from var/spack/packages/boxlib/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/bzip2/package.py (renamed from var/spack/packages/bzip2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cairo/package.py (renamed from var/spack/packages/cairo/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/callpath/package.py (renamed from var/spack/packages/callpath/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cblas/package.py (renamed from var/spack/packages/cblas/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cbtf-argonavis/package.py (renamed from var/spack/packages/cbtf-argonavis/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cbtf-krell/package.py (renamed from var/spack/packages/cbtf-krell/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cbtf-lanl/package.py (renamed from var/spack/packages/cbtf-lanl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cbtf/package.py (renamed from var/spack/packages/cbtf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cfitsio/package.py (renamed from var/spack/packages/cfitsio/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cgm/package.py (renamed from var/spack/packages/cgm/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cityhash/package.py (renamed from var/spack/packages/cityhash/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/clang/package.py (renamed from var/spack/packages/clang/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cleverleaf/package.py (renamed from var/spack/packages/cleverleaf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cloog/package.py (renamed from var/spack/packages/cloog/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cmake/package.py (renamed from var/spack/packages/cmake/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/coreutils/package.py (renamed from var/spack/packages/coreutils/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cppcheck/package.py (renamed from var/spack/packages/cppcheck/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cram/package.py (renamed from var/spack/packages/cram/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cscope/package.py (renamed from var/spack/packages/cscope/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/cube/package.py (renamed from var/spack/packages/cube/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/curl/package.py (renamed from var/spack/packages/curl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/czmq/package.py (renamed from var/spack/packages/czmq/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/damselfly/package.py (renamed from var/spack/packages/damselfly/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/dbus/package.py (renamed from var/spack/packages/dbus/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/docbook-xml/package.py (renamed from var/spack/packages/docbook-xml/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/doxygen/package.py (renamed from var/spack/packages/doxygen/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/dri2proto/package.py (renamed from var/spack/packages/dri2proto/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/dtcmp/package.py (renamed from var/spack/packages/dtcmp/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/dyninst/package.py (renamed from var/spack/packages/dyninst/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/elfutils/package.py (renamed from var/spack/packages/elfutils/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/expat/package.py (renamed from var/spack/packages/expat/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/extrae/package.py (renamed from var/spack/packages/extrae/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/exuberant-ctags/package.py (renamed from var/spack/packages/exuberant-ctags/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/fftw/package.py (renamed from var/spack/packages/fftw/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/fish/package.py (renamed from var/spack/packages/fish/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/flex/package.py (renamed from var/spack/packages/flex/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/flux/package.py (renamed from var/spack/packages/flux/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/fontconfig/package.py (renamed from var/spack/packages/fontconfig/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/freetype/package.py (renamed from var/spack/packages/freetype/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gasnet/package.py (renamed from var/spack/packages/gasnet/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gcc/package.py (renamed from var/spack/packages/gcc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gdb/package.py (renamed from var/spack/packages/gdb/package.py)2
-rw-r--r--var/spack/repos/builtin/packages/gdk-pixbuf/package.py (renamed from var/spack/packages/gdk-pixbuf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/geos/package.py (renamed from var/spack/packages/geos/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gflags/package.py (renamed from var/spack/packages/gflags/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ghostscript/package.py (renamed from var/spack/packages/ghostscript/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/git/package.py (renamed from var/spack/packages/git/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/glib/package.py (renamed from var/spack/packages/glib/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/glm/package.py (renamed from var/spack/packages/glm/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/global/package.py (renamed from var/spack/packages/global/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/glog/package.py (renamed from var/spack/packages/glog/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gmp/package.py (renamed from var/spack/packages/gmp/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gnuplot/package.py (renamed from var/spack/packages/gnuplot/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gnutls/package.py (renamed from var/spack/packages/gnutls/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gperf/package.py (renamed from var/spack/packages/gperf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gperftools/package.py (renamed from var/spack/packages/gperftools/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/graphlib/package.py (renamed from var/spack/packages/graphlib/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/graphviz/package.py (renamed from var/spack/packages/graphviz/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gsl/package.py (renamed from var/spack/packages/gsl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/gtkplus/package.py (renamed from var/spack/packages/gtkplus/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/harfbuzz/package.py (renamed from var/spack/packages/harfbuzz/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/hdf5/package.py (renamed from var/spack/packages/hdf5/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/hwloc/package.py (renamed from var/spack/packages/hwloc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/hypre/package.py (renamed from var/spack/packages/hypre/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/icu/package.py (renamed from var/spack/packages/icu/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/icu4c/package.py (renamed from var/spack/packages/icu4c/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/isl/package.py (renamed from var/spack/packages/isl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/jdk/package.py (renamed from var/spack/packages/jdk/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/jemalloc/package.py (renamed from var/spack/packages/jemalloc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/jpeg/package.py (renamed from var/spack/packages/jpeg/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/judy/package.py (renamed from var/spack/packages/judy/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/launchmon/package.py (renamed from var/spack/packages/launchmon/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/launchmon/patch.lmon_install_dir (renamed from var/spack/packages/launchmon/patch.lmon_install_dir)0
-rw-r--r--var/spack/repos/builtin/packages/lcms/package.py (renamed from var/spack/packages/lcms/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/leveldb/package.py (renamed from var/spack/packages/leveldb/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libNBC/package.py (renamed from var/spack/packages/libNBC/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libarchive/package.py (renamed from var/spack/packages/libarchive/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libcerf/package.py (renamed from var/spack/packages/libcerf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libcircle/package.py (renamed from var/spack/packages/libcircle/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libdrm/package.py (renamed from var/spack/packages/libdrm/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libdwarf/package.py (renamed from var/spack/packages/libdwarf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libelf/package.py (renamed from var/spack/packages/libelf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libevent/package.py (renamed from var/spack/packages/libevent/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libffi/package.py (renamed from var/spack/packages/libffi/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libgcrypt/package.py (renamed from var/spack/packages/libgcrypt/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libgd/package.py (renamed from var/spack/packages/libgd/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libgpg-error/package.py (renamed from var/spack/packages/libgpg-error/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libjpeg-turbo/package.py (renamed from var/spack/packages/libjpeg-turbo/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libjson-c/package.py (renamed from var/spack/packages/libjson-c/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libmng/package.py (renamed from var/spack/packages/libmng/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0000.patch (renamed from var/spack/packages/libmonitor/libmonitorkrell-0000.patch)0
-rw-r--r--var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0001.patch (renamed from var/spack/packages/libmonitor/libmonitorkrell-0001.patch)0
-rw-r--r--var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0002.patch (renamed from var/spack/packages/libmonitor/libmonitorkrell-0002.patch)0
-rw-r--r--var/spack/repos/builtin/packages/libmonitor/package.py (renamed from var/spack/packages/libmonitor/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libpciaccess/package.py (renamed from var/spack/packages/libpciaccess/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libpng/package.py (renamed from var/spack/packages/libpng/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libsodium/package.py (renamed from var/spack/packages/libsodium/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libtiff/package.py (renamed from var/spack/packages/libtiff/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libtool/package.py (renamed from var/spack/packages/libtool/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libunwind/package.py (renamed from var/spack/packages/libunwind/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libuuid/package.py (renamed from var/spack/packages/libuuid/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libxcb/package.py (renamed from var/spack/packages/libxcb/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libxml2/package.py (renamed from var/spack/packages/libxml2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libxshmfence/package.py (renamed from var/spack/packages/libxshmfence/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/libxslt/package.py (renamed from var/spack/packages/libxslt/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/llvm-lld/package.py (renamed from var/spack/packages/llvm-lld/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/llvm/package.py (renamed from var/spack/packages/llvm/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/lmdb/package.py (renamed from var/spack/packages/lmdb/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/lmod/package.py (renamed from var/spack/packages/lmod/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/lua/package.py (renamed from var/spack/packages/lua/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/lwgrp/package.py (renamed from var/spack/packages/lwgrp/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/lwm2/package.py (renamed from var/spack/packages/lwm2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/matio/package.py (renamed from var/spack/packages/matio/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/memaxes/package.py (renamed from var/spack/packages/memaxes/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mesa/package.py (renamed from var/spack/packages/mesa/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/metis/package.py (renamed from var/spack/packages/metis/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mpc/package.py (renamed from var/spack/packages/mpc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mpe2/mpe2.patch (renamed from var/spack/packages/mpe2/mpe2.patch)0
-rw-r--r--var/spack/repos/builtin/packages/mpe2/package.py (renamed from var/spack/packages/mpe2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mpfr/package.py (renamed from var/spack/packages/mpfr/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mpibash/mpibash-4.3.patch (renamed from var/spack/packages/mpibash/mpibash-4.3.patch)0
-rw-r--r--var/spack/repos/builtin/packages/mpibash/package.py (renamed from var/spack/packages/mpibash/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mpich/package.py (renamed from var/spack/packages/mpich/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mpileaks/package.py (renamed from var/spack/packages/mpileaks/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mrnet/package.py (renamed from var/spack/packages/mrnet/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/munge/package.py (renamed from var/spack/packages/munge/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/muster/package.py (renamed from var/spack/packages/muster/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/mvapich2/ad_lustre_rwcontig_open_source.patch (renamed from var/spack/packages/mvapich2/ad_lustre_rwcontig_open_source.patch)0
-rw-r--r--var/spack/repos/builtin/packages/mvapich2/package.py (renamed from var/spack/packages/mvapich2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/nasm/package.py (renamed from var/spack/packages/nasm/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ncdu/package.py (renamed from var/spack/packages/ncdu/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ncurses/package.py (renamed from var/spack/packages/ncurses/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ncurses/patch_gcc_5.txt (renamed from var/spack/packages/ncurses/patch_gcc_5.txt)0
-rw-r--r--var/spack/repos/builtin/packages/netcdf/netcdf-4.3.3-mpi.patch (renamed from var/spack/packages/netcdf/netcdf-4.3.3-mpi.patch)0
-rw-r--r--var/spack/repos/builtin/packages/netcdf/package.py (renamed from var/spack/packages/netcdf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/netgauge/package.py (renamed from var/spack/packages/netgauge/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/netlib-blas/package.py (renamed from var/spack/packages/netlib-blas/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/netlib-lapack/package.py (renamed from var/spack/packages/netlib-lapack/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/nettle/package.py (renamed from var/spack/packages/nettle/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ompss/package.py (renamed from var/spack/packages/ompss/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ompt-openmp/package.py (renamed from var/spack/packages/ompt-openmp/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/opari2/package.py (renamed from var/spack/packages/opari2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/openblas/package.py (renamed from var/spack/packages/openblas/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/openmpi/ad_lustre_rwcontig_open_source.patch (renamed from var/spack/packages/openmpi/ad_lustre_rwcontig_open_source.patch)0
-rw-r--r--var/spack/repos/builtin/packages/openmpi/configure.patch (renamed from var/spack/packages/openmpi/configure.patch)0
-rw-r--r--var/spack/repos/builtin/packages/openmpi/llnl-platforms.patch (renamed from var/spack/packages/openmpi/llnl-platforms.patch)0
-rw-r--r--var/spack/repos/builtin/packages/openmpi/package.py (renamed from var/spack/packages/openmpi/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/openspeedshop/package.py (renamed from var/spack/packages/openspeedshop/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/openssl/package.py (renamed from var/spack/packages/openssl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/otf/package.py (renamed from var/spack/packages/otf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/otf2/package.py (renamed from var/spack/packages/otf2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pango/package.py (renamed from var/spack/packages/pango/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/papi/package.py (renamed from var/spack/packages/papi/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/paraver/package.py (renamed from var/spack/packages/paraver/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/paraview/package.py (renamed from var/spack/packages/paraview/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/parmetis/package.py (renamed from var/spack/packages/parmetis/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/parpack/package.py (renamed from var/spack/packages/parpack/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pcre/package.py (renamed from var/spack/packages/pcre/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pdt/package.py (renamed from var/spack/packages/pdt/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/petsc/package.py (renamed from var/spack/packages/petsc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pidx/package.py (renamed from var/spack/packages/pidx/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pixman/package.py (renamed from var/spack/packages/pixman/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pkg-config/package.py (renamed from var/spack/packages/pkg-config/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/pmgr_collective/package.py (renamed from var/spack/packages/pmgr_collective/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/postgresql/package.py (renamed from var/spack/packages/postgresql/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ppl/package.py (renamed from var/spack/packages/ppl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/protobuf/package.py (renamed from var/spack/packages/protobuf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-basemap/package.py (renamed from var/spack/packages/py-basemap/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-biopython/package.py (renamed from var/spack/packages/py-biopython/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-cffi/package.py (renamed from var/spack/packages/py-cffi/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-cython/package.py (renamed from var/spack/packages/py-cython/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-dateutil/package.py (renamed from var/spack/packages/py-dateutil/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-epydoc/package.py (renamed from var/spack/packages/py-epydoc/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-genders/package.py (renamed from var/spack/packages/py-genders/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-gnuplot/package.py (renamed from var/spack/packages/py-gnuplot/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-h5py/package.py (renamed from var/spack/packages/py-h5py/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-ipython/package.py (renamed from var/spack/packages/py-ipython/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-libxml2/package.py (renamed from var/spack/packages/py-libxml2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-lockfile/package.py (renamed from var/spack/packages/py-lockfile/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-mako/package.py (renamed from var/spack/packages/py-mako/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-matplotlib/package.py (renamed from var/spack/packages/py-matplotlib/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-mock/package.py (renamed from var/spack/packages/py-mock/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-mpi4py/package.py (renamed from var/spack/packages/py-mpi4py/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-mx/package.py (renamed from var/spack/packages/py-mx/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-nose/package.py (renamed from var/spack/packages/py-nose/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-numpy/package.py (renamed from var/spack/packages/py-numpy/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pandas/package.py (renamed from var/spack/packages/py-pandas/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pexpect/package.py (renamed from var/spack/packages/py-pexpect/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pil/package.py (renamed from var/spack/packages/py-pil/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pillow/package.py (renamed from var/spack/packages/py-pillow/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pmw/package.py (renamed from var/spack/packages/py-pmw/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pychecker/package.py (renamed from var/spack/packages/py-pychecker/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pycparser/package.py (renamed from var/spack/packages/py-pycparser/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pyelftools/package.py (renamed from var/spack/packages/py-pyelftools/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pygments/package.py (renamed from var/spack/packages/py-pygments/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pylint/package.py (renamed from var/spack/packages/py-pylint/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pypar/package.py (renamed from var/spack/packages/py-pypar/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pyparsing/package.py (renamed from var/spack/packages/py-pyparsing/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pyqt/package.py (renamed from var/spack/packages/py-pyqt/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pyside/package.py (renamed from var/spack/packages/py-pyside/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-python-daemon/package.py (renamed from var/spack/packages/py-python-daemon/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-pytz/package.py (renamed from var/spack/packages/py-pytz/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-rpy2/package.py (renamed from var/spack/packages/py-rpy2/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-scientificpython/package.py (renamed from var/spack/packages/py-scientificpython/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-scikit-learn/package.py (renamed from var/spack/packages/py-scikit-learn/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-scipy/package.py (renamed from var/spack/packages/py-scipy/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-setuptools/package.py (renamed from var/spack/packages/py-setuptools/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-shiboken/package.py (renamed from var/spack/packages/py-shiboken/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-sip/package.py (renamed from var/spack/packages/py-sip/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-six/package.py (renamed from var/spack/packages/py-six/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-sphinx/package.py (renamed from var/spack/packages/py-sphinx/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-sympy/package.py (renamed from var/spack/packages/py-sympy/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-twisted/package.py (renamed from var/spack/packages/py-twisted/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-virtualenv/package.py (renamed from var/spack/packages/py-virtualenv/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/py-yapf/package.py (renamed from var/spack/packages/py-yapf/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/python/package.py (renamed from var/spack/packages/python/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/qhull/package.py (renamed from var/spack/packages/qhull/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/qt/package.py (renamed from var/spack/packages/qt/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/qt/qt3krell.patch (renamed from var/spack/packages/qt/qt3krell.patch)0
-rw-r--r--var/spack/repos/builtin/packages/qthreads/package.py (renamed from var/spack/packages/qthreads/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ravel/package.py (renamed from var/spack/packages/ravel/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/readline/package.py (renamed from var/spack/packages/readline/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/rose/add_spack_compiler_recognition.patch (renamed from var/spack/packages/rose/add_spack_compiler_recognition.patch)0
-rw-r--r--var/spack/repos/builtin/packages/rose/package.py (renamed from var/spack/packages/rose/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/rsync/package.py (renamed from var/spack/packages/rsync/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/ruby/package.py (renamed from var/spack/packages/ruby/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/samtools/package.py (renamed from var/spack/packages/samtools/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/samtools/samtools1.2.patch (renamed from var/spack/packages/samtools/samtools1.2.patch)0
-rw-r--r--var/spack/repos/builtin/packages/scalasca/package.py (renamed from var/spack/packages/scalasca/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/scorep/package.py (renamed from var/spack/packages/scorep/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/scotch/package.py (renamed from var/spack/packages/scotch/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/scr/package.py (renamed from var/spack/packages/scr/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/silo/package.py (renamed from var/spack/packages/silo/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/snappy/package.py (renamed from var/spack/packages/snappy/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/sparsehash/package.py (renamed from var/spack/packages/sparsehash/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/spindle/package.py (renamed from var/spack/packages/spindle/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/spot/package.py (renamed from var/spack/packages/spot/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/sqlite/package.py (renamed from var/spack/packages/sqlite/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/stat/configure_mpicxx.patch (renamed from var/spack/packages/stat/configure_mpicxx.patch)0
-rw-r--r--var/spack/repos/builtin/packages/stat/package.py (renamed from var/spack/packages/stat/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/sundials/package.py (renamed from var/spack/packages/sundials/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/swig/package.py (renamed from var/spack/packages/swig/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/task/package.py (renamed from var/spack/packages/task/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/taskd/package.py (renamed from var/spack/packages/taskd/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/tau/package.py (renamed from var/spack/packages/tau/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/tcl/package.py (renamed from var/spack/packages/tcl/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/texinfo/package.py (renamed from var/spack/packages/texinfo/package.py)2
-rw-r--r--var/spack/repos/builtin/packages/the_silver_searcher/package.py (renamed from var/spack/packages/the_silver_searcher/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/thrift/package.py (renamed from var/spack/packages/thrift/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/tk/package.py (renamed from var/spack/packages/tk/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/tmux/package.py (renamed from var/spack/packages/tmux/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/tmuxinator/package.py (renamed from var/spack/packages/tmuxinator/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/trilinos/package.py (renamed from var/spack/packages/trilinos/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/uncrustify/package.py (renamed from var/spack/packages/uncrustify/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/util-linux/package.py (renamed from var/spack/packages/util-linux/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/valgrind/package.py (renamed from var/spack/packages/valgrind/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/vim/package.py (renamed from var/spack/packages/vim/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/vtk/package.py (renamed from var/spack/packages/vtk/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/wget/package.py (renamed from var/spack/packages/wget/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/wx/package.py (renamed from var/spack/packages/wx/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/wxpropgrid/package.py (renamed from var/spack/packages/wxpropgrid/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/xcb-proto/package.py (renamed from var/spack/packages/xcb-proto/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/xerces-c/package.py (renamed from var/spack/packages/xerces-c/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/xz/package.py (renamed from var/spack/packages/xz/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/yasm/package.py (renamed from var/spack/packages/yasm/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/zeromq/package.py (renamed from var/spack/packages/zeromq/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/zlib/package.py (renamed from var/spack/packages/zlib/package.py)0
-rw-r--r--var/spack/repos/builtin/packages/zsh/package.py (renamed from var/spack/packages/zsh/package.py)0
-rw-r--r--var/spack/repos/builtin/repo.yaml2
388 files changed, 1923 insertions, 745 deletions
diff --git a/.gitignore b/.gitignore
index 1c6ca4c99e..4b97de5d50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
/etc/spackconfig
/share/spack/dotkit
/share/spack/modules
+/TAGS
diff --git a/.mailmap b/.mailmap
index 1cc13c1eb1..1b99da32b5 100644
--- a/.mailmap
+++ b/.mailmap
@@ -9,3 +9,5 @@ Saravan Pantham <saravan.pantham@gmail.com> Saravan Pantham <pantham1@su
Tom Scogland <tscogland@llnl.gov> Tom Scogland <scogland1@llnl.gov>
Tom Scogland <tscogland@llnl.gov> Tom Scogland <tom.scogland@gmail.com>
Joachim Protze <protze@rz.rwth-aachen.de> jprotze <protze@rz.rwth-aachen.de>
+Gregory L. Lee <lee218@llnl.gov> Gregory L. Lee <lee218@surface86.llnl.gov>
+Gregory L. Lee <lee218@llnl.gov> Gregory Lee <lee218@llnl.gov>
diff --git a/bin/spack b/bin/spack
index cd46cf6180..a84cd36da1 100755
--- a/bin/spack
+++ b/bin/spack
@@ -132,8 +132,8 @@ def main():
spack.spack_working_dir = working_dir
if args.mock:
- from spack.packages import PackageDB
- spack.db = PackageDB(spack.mock_packages_path)
+ 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:
diff --git a/etc/spack/repos.yaml b/etc/spack/repos.yaml
new file mode 100644
index 0000000000..2d4ff54ce6
--- /dev/null
+++ b/etc/spack/repos.yaml
@@ -0,0 +1,8 @@
+# -------------------------------------------------------------------------
+# This is the default spack repository configuration.
+#
+# Changes to this file will affect all users of this spack install,
+# although users can override these settings in their ~/.spack/repos.yaml.
+# -------------------------------------------------------------------------
+repos:
+ - $spack/var/spack/repos/builtin
diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py
index c84828951d..1c4d1ed623 100644
--- a/lib/spack/llnl/util/lang.py
+++ b/lib/spack/llnl/util/lang.py
@@ -26,6 +26,7 @@ import os
import re
import sys
import functools
+import collections
import inspect
# Ignore emacs backups when listing modules
@@ -167,16 +168,32 @@ def has_method(cls, name):
return False
-def memoized(obj):
+class memoized(object):
"""Decorator that caches the results of a function, storing them
in an attribute of that function."""
- cache = obj.cache = {}
- @functools.wraps(obj)
- def memoizer(*args, **kwargs):
- if args not in cache:
- cache[args] = obj(*args, **kwargs)
- return cache[args]
- return memoizer
+ def __init__(self, func):
+ self.func = func
+ self.cache = {}
+
+
+ def __call__(self, *args):
+ if not isinstance(args, collections.Hashable):
+ # Not hashable, so just call the function.
+ return self.func(*args)
+
+ if args not in self.cache:
+ self.cache[args] = self.func(*args)
+ return self.cache[args]
+
+
+ def __get__(self, obj, objtype):
+ """Support instance methods."""
+ return functools.partial(self.__call__, obj)
+
+
+ def clear(self):
+ """Expunge cache so that self.func will be called again."""
+ self.cache.clear()
def list_modules(directory, **kwargs):
diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py
index 5545cf0311..47c3cc4f8f 100644
--- a/lib/spack/llnl/util/tty/colify.py
+++ b/lib/spack/llnl/util/tty/colify.py
@@ -210,6 +210,13 @@ def colify(elts, **options):
def colify_table(table, **options):
+ """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
+ row in a table. Regular colify displays a sequential list of
+ values in columns.
+ """
if table is None:
raise TypeError("Can't call colify_table on NoneType")
elif not table or not table[0]:
diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py
index 92cb417a85..de1a98d092 100644
--- a/lib/spack/spack/__init__.py
+++ b/lib/spack/spack/__init__.py
@@ -23,9 +23,11 @@
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import os
+import sys
import tempfile
import getpass
from llnl.util.filesystem import *
+import llnl.util.tty as tty
# This lives in $prefix/lib/spack/spack/__file__
spack_root = ancestor(__file__, 4)
@@ -42,6 +44,7 @@ test_path = join_path(module_path, "test")
hooks_path = join_path(module_path, "hooks")
var_path = join_path(spack_root, "var", "spack")
stage_path = join_path(var_path, "stage")
+repos_path = join_path(var_path, "repos")
share_path = join_path(spack_root, "share", "spack")
prefix = spack_root
@@ -50,11 +53,18 @@ install_path = join_path(opt_path, "spack")
etc_path = join_path(prefix, "etc")
#
-# Set up the packages database.
+# Set up the default packages database.
#
-from spack.packages import PackageDB
-packages_path = join_path(var_path, "packages")
-db = PackageDB(packages_path)
+import spack.repository
+_repo_paths = spack.config.get_repos_config()
+if not _repo_paths:
+ tty.die("Spack configuration contains no package repositories.")
+
+try:
+ repo = spack.repository.RepoPath(*_repo_paths)
+ sys.meta_path.append(repo)
+except spack.repository.BadRepoError, e:
+ tty.die('Bad repository. %s' % e.message)
#
# Set up the installed packages database
@@ -63,9 +73,10 @@ from spack.database import Database
installed_db = Database(install_path)
#
-# Paths to mock files for testing.
+# Paths to built-in Spack repositories.
#
-mock_packages_path = join_path(var_path, "mock_packages")
+packages_path = join_path(repos_path, "builtin")
+mock_packages_path = join_path(repos_path, "builtin.mock")
mock_config_path = join_path(var_path, "mock_configs")
mock_site_config = join_path(mock_config_path, "site_spackconfig")
@@ -149,7 +160,7 @@ sys_type = None
# When packages call 'from spack import *', this extra stuff is brought in.
#
# Spack internal code should call 'import spack' and accesses other
-# variables (spack.db, paths, etc.) directly.
+# variables (spack.repo, paths, etc.) directly.
#
# TODO: maybe this should be separated out and should go in build_environment.py?
# TODO: it's not clear where all the stuff that needs to be included in packages
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index 84c2f6015b..b2db83acb7 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -173,7 +173,7 @@ def set_build_environment_variables(pkg):
path_set("PKG_CONFIG_PATH", pkg_config_dirs)
-def set_module_variables_for_package(pkg):
+def set_module_variables_for_package(pkg, m):
"""Populate the module scope of install() with some useful functions.
This makes things easier for package writers.
"""
@@ -244,11 +244,32 @@ def get_rpaths(pkg):
return rpaths
+def parent_class_modules(cls):
+ """Get list of super class modules that are all descend from spack.Package"""
+ if not issubclass(cls, spack.Package) or issubclass(spack.Package, cls):
+ return []
+ result = []
+ module = sys.modules.get(cls.__module__)
+ if module:
+ result = [ module ]
+ for c in cls.__bases__:
+ result.extend(parent_class_modules(c))
+ return result
+
+
def setup_package(pkg):
"""Execute all environment setup routines."""
set_compiler_environment_variables(pkg)
set_build_environment_variables(pkg)
- set_module_variables_for_package(pkg)
+
+ # If a user makes their own package repo, e.g.
+ # spack.repos.mystuff.libelf.Libelf, and they inherit from
+ # an existing class like spack.repos.original.libelf.Libelf,
+ # then set the module variables for both classes so the
+ # parent class can still use them if it gets called.
+ modules = parent_class_modules(pkg.__class__)
+ for mod in modules:
+ set_module_variables_for_package(pkg, mod)
# Allow dependencies to set up environment as well.
for dep_spec in pkg.spec.traverse(root=False):
diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py
index 6b7022a7a1..b1ad89dbb8 100644
--- a/lib/spack/spack/cmd/checksum.py
+++ b/lib/spack/spack/cmd/checksum.py
@@ -81,7 +81,7 @@ def get_checksums(versions, urls, **kwargs):
def checksum(parser, args):
# get the package we're going to generate checksums for
- pkg = spack.db.get(args.package)
+ pkg = spack.repo.get(args.package)
# If the user asked for specific versions, use those.
if args.versions:
diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py
index c3409887fb..6e7179122c 100644
--- a/lib/spack/spack/cmd/clean.py
+++ b/lib/spack/spack/cmd/clean.py
@@ -42,5 +42,5 @@ def clean(parser, args):
specs = spack.cmd.parse_specs(args.packages, concretize=True)
for spec in specs:
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
package.do_clean()
diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py
index 589ca87fb5..af1a22c9dd 100644
--- a/lib/spack/spack/cmd/compiler.py
+++ b/lib/spack/spack/cmd/compiler.py
@@ -65,10 +65,11 @@ def compiler_add(args):
if c.spec not in spack.compilers.all_compilers()]
if compilers:
- spack.compilers.add_compilers_to_config('user', *compilers)
+ spack.compilers.add_compilers_to_config('user', compilers)
n = len(compilers)
- tty.msg("Added %d new compiler%s to %s" % (
- n, 's' if n > 1 else '', spack.config.get_config_scope_filename('user', 'compilers')))
+ s = 's' if n > 1 else ''
+ filename = spack.config.get_config_filename('user', 'compilers')
+ tty.msg("Added %d new compiler%s to %s" % (n, s, filename))
colify(reversed(sorted(c.spec for c in compilers)), indent=4)
else:
tty.msg("Found no new compilers")
diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py
index a6e914131e..5e6d4e4d7d 100644
--- a/lib/spack/spack/cmd/config.py
+++ b/lib/spack/spack/cmd/config.py
@@ -44,22 +44,22 @@ def setup_parser(subparser):
sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='config_command')
get_parser = sp.add_parser('get', help='Print configuration values.')
- get_parser.add_argument('category', help="Configuration category to print.")
+ get_parser.add_argument('section', help="Configuration section to print.")
edit_parser = sp.add_parser('edit', help='Edit configuration file.')
- edit_parser.add_argument('category', help="Configuration category to edit")
+ edit_parser.add_argument('section', help="Configuration section to edit")
def config_get(args):
- spack.config.print_category(args.category)
+ spack.config.print_section(args.section)
def config_edit(args):
if not args.scope:
args.scope = 'user'
- if not args.category:
- args.category = None
- config_file = spack.config.get_config_scope_filename(args.scope, args.category)
+ if not args.section:
+ args.section = None
+ config_file = spack.config.get_config_filename(args.scope, args.section)
spack.editor(config_file)
diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py
index 9ecb709110..1a60875de8 100644
--- a/lib/spack/spack/cmd/create.py
+++ b/lib/spack/spack/cmd/create.py
@@ -94,6 +94,9 @@ def setup_parser(subparser):
'-n', '--name', dest='alternate_name', default=None,
help="Override the autodetected name for the created package.")
subparser.add_argument(
+ '-p', '--package-repo', dest='package_repo', default=None,
+ help="Create the package in the specified packagerepo.")
+ subparser.add_argument(
'-f', '--force', action='store_true', dest='force',
help="Overwrite any existing package file with the same name.")
@@ -160,12 +163,21 @@ def create(parser, args):
tty.die("Couldn't guess a name for this package. Try running:", "",
"spack create --name <name> <url>")
+ package_repo = args.package_repo
+
if not valid_module_name(name):
tty.die("Package name can only contain A-Z, a-z, 0-9, '_' and '-'")
tty.msg("This looks like a URL for %s version %s." % (name, version))
tty.msg("Creating template for package %s" % name)
+ # Create a directory for the new package.
+ pkg_path = spack.repo.filename_for_package_name(name, package_repo)
+ if os.path.exists(pkg_path) and not args.force:
+ tty.die("%s already exists." % pkg_path)
+ else:
+ mkdirp(os.path.dirname(pkg_path))
+
versions = spack.util.web.find_versions_of_archive(url)
rkeys = sorted(versions.keys(), reverse=True)
versions = OrderedDict(zip(rkeys, (versions[v] for v in rkeys)))
@@ -202,7 +214,7 @@ def create(parser, args):
name = 'py-%s' % name
# Create a directory for the new package.
- pkg_path = spack.db.filename_for_package_name(name)
+ pkg_path = spack.repo.filename_for_package_name(name)
if os.path.exists(pkg_path) and not args.force:
tty.die("%s already exists." % pkg_path)
else:
diff --git a/lib/spack/spack/cmd/diy.py b/lib/spack/spack/cmd/diy.py
index ebe8424f09..1acbebbc15 100644
--- a/lib/spack/spack/cmd/diy.py
+++ b/lib/spack/spack/cmd/diy.py
@@ -61,7 +61,7 @@ def diy(self, args):
# Take a write lock before checking for existence.
with spack.installed_db.write_transaction():
spec = specs[0]
- if not spack.db.exists(spec.name):
+ if not spack.repo.exists(spec.name):
tty.warn("No such package: %s" % spec.name)
create = tty.get_yes_or_no("Create this package?", default=False)
if not create:
@@ -76,7 +76,7 @@ def diy(self, args):
tty.die("spack diy spec must have a single, concrete version.")
spec.concretize()
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
if package.installed:
tty.error("Already installed in %s" % package.prefix)
diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py
index b168d967b9..e0688dc96b 100644
--- a/lib/spack/spack/cmd/edit.py
+++ b/lib/spack/spack/cmd/edit.py
@@ -54,7 +54,7 @@ class ${class_name}(Package):
def edit_package(name, force=False):
- path = spack.db.filename_for_package_name(name)
+ path = spack.repo.filename_for_package_name(name)
if os.path.exists(path):
if not os.path.isfile(path):
@@ -78,9 +78,18 @@ def setup_parser(subparser):
subparser.add_argument(
'-f', '--force', dest='force', action='store_true',
help="Open a new file in $EDITOR even if package doesn't exist.")
- subparser.add_argument(
- '-c', '--command', dest='edit_command', action='store_true',
- help="Edit the command with the supplied name instead of a package.")
+
+ filetypes = subparser.add_mutually_exclusive_group()
+ filetypes.add_argument(
+ '-c', '--command', dest='path', action='store_const',
+ const=spack.cmd.command_path, help="Edit the command with the supplied name.")
+ filetypes.add_argument(
+ '-t', '--test', dest='path', action='store_const',
+ const=spack.test_path, help="Edit the test with the supplied name.")
+ filetypes.add_argument(
+ '-m', '--module', dest='path', action='store_const',
+ const=spack.module_path, help="Edit the main spack module with the supplied name.")
+
subparser.add_argument(
'name', nargs='?', default=None, help="name of package to edit")
@@ -88,19 +97,17 @@ def setup_parser(subparser):
def edit(parser, args):
name = args.name
- if args.edit_command:
- if not name:
- path = spack.cmd.command_path
- else:
- path = join_path(spack.cmd.command_path, name + ".py")
- if not os.path.exists(path):
+ path = spack.packages_path
+ if args.path:
+ path = args.path
+ if name:
+ path = join_path(path, name + ".py")
+ if not args.force and not os.path.exists(path):
tty.die("No command named '%s'." % name)
spack.editor(path)
+ elif name:
+ edit_package(name, args.force)
else:
# By default open the directory where packages or commands live.
- if not name:
- path = spack.packages_path
- spack.editor(path)
- else:
- edit_package(name, args.force)
+ spack.editor(path)
diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py
index 2ce6f406ca..ccb0fe4e1f 100644
--- a/lib/spack/spack/cmd/extensions.py
+++ b/lib/spack/spack/cmd/extensions.py
@@ -74,8 +74,7 @@ def extensions(parser, args):
#
# List package names of extensions
- #
- extensions = spack.db.extensions_for(spec)
+ extensions = spack.repo.extensions_for(spec)
if not extensions:
tty.msg("%s has no extensions." % spec.cshort_spec)
return
diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py
index 57d6f6b63b..adad545cae 100644
--- a/lib/spack/spack/cmd/fetch.py
+++ b/lib/spack/spack/cmd/fetch.py
@@ -52,10 +52,10 @@ def fetch(parser, args):
if args.missing or args.dependencies:
to_fetch = set()
for s in spec.traverse():
- package = spack.db.get(s)
+ package = spack.repo.get(s)
if args.missing and package.installed:
continue
package.do_fetch()
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
package.do_fetch()
diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py
index c7a376fd8d..d951c37fe0 100644
--- a/lib/spack/spack/cmd/find.py
+++ b/lib/spack/spack/cmd/find.py
@@ -137,7 +137,7 @@ def find(parser, args):
# Filter out specs that don't exist.
query_specs = spack.cmd.parse_specs(args.query_specs)
query_specs, nonexisting = partition_list(
- query_specs, lambda s: spack.db.exists(s.name))
+ query_specs, lambda s: spack.repo.exists(s.name))
if nonexisting:
msg = "No such package%s: " % ('s' if len(nonexisting) > 1 else '')
diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py
index 8040e23936..e7abe7f4a5 100644
--- a/lib/spack/spack/cmd/info.py
+++ b/lib/spack/spack/cmd/info.py
@@ -105,5 +105,5 @@ def print_text_info(pkg):
def info(parser, args):
- pkg = spack.db.get(args.name)
+ pkg = spack.repo.get(args.name)
print_text_info(pkg)
diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py
index 5ee7bc01b7..1fef750c80 100644
--- a/lib/spack/spack/cmd/install.py
+++ b/lib/spack/spack/cmd/install.py
@@ -70,7 +70,7 @@ def install(parser, args):
specs = spack.cmd.parse_specs(args.packages, concretize=True)
for spec in specs:
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
with spack.installed_db.write_transaction():
package.do_install(
keep_prefix=args.keep_prefix,
diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py
index b51d5b429a..7c50ccb9cd 100644
--- a/lib/spack/spack/cmd/list.py
+++ b/lib/spack/spack/cmd/list.py
@@ -43,7 +43,7 @@ def setup_parser(subparser):
def list(parser, args):
# Start with all package names.
- pkgs = spack.db.all_package_names()
+ pkgs = spack.repo.all_package_names()
# filter if a filter arg was provided
if args.filter:
diff --git a/lib/spack/spack/cmd/location.py b/lib/spack/spack/cmd/location.py
index e805cc4012..39c225e9b2 100644
--- a/lib/spack/spack/cmd/location.py
+++ b/lib/spack/spack/cmd/location.py
@@ -72,7 +72,7 @@ def location(parser, args):
print spack.prefix
elif args.packages:
- print spack.db.root
+ print spack.repo.root
elif args.stages:
print spack.stage_path
@@ -94,12 +94,12 @@ def location(parser, args):
if args.package_dir:
# This one just needs the spec name.
- print join_path(spack.db.root, spec.name)
+ print join_path(spack.repo.root, spec.name)
else:
# These versions need concretized specs.
spec.concretize()
- pkg = spack.db.get(spec)
+ pkg = spack.repo.get(spec)
if args.stage_dir:
print pkg.stage.path
diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py
index 89d51bbe04..a2d2e80f5e 100644
--- a/lib/spack/spack/cmd/mirror.py
+++ b/lib/spack/spack/cmd/mirror.py
@@ -78,7 +78,7 @@ def mirror_add(args):
url = 'file://' + url
mirror_dict = { args.name : url }
- spack.config.add_to_mirror_config({ args.name : url })
+ spack.config.update_config('mirrors', { args.name : url }, 'user')
def mirror_remove(args):
@@ -92,7 +92,7 @@ def mirror_remove(args):
def mirror_list(args):
"""Print out available mirrors to the console."""
- sec_names = spack.config.get_mirror_config()
+ sec_names = spack.config.get_config('mirrors')
if not sec_names:
tty.msg("No mirrors configured.")
return
@@ -130,7 +130,7 @@ def mirror_create(args):
# If nothing is passed, use all packages.
if not specs:
- specs = [Spec(n) for n in spack.db.all_package_names()]
+ specs = [Spec(n) for n in spack.repo.all_package_names()]
specs.sort(key=lambda s: s.format("$_$@").lower())
if args.dependencies:
diff --git a/lib/spack/spack/cmd/package-list.py b/lib/spack/spack/cmd/package-list.py
index eca9f918f1..5e37d5c16b 100644
--- a/lib/spack/spack/cmd/package-list.py
+++ b/lib/spack/spack/cmd/package-list.py
@@ -48,7 +48,7 @@ def rst_table(elts):
def print_rst_package_list():
"""Print out information on all packages in restructured text."""
- pkgs = sorted(spack.db.all_packages(), key=lambda s:s.name.lower())
+ pkgs = sorted(spack.repo.all_packages(), key=lambda s:s.name.lower())
print ".. _package-list:"
print
diff --git a/lib/spack/spack/cmd/patch.py b/lib/spack/spack/cmd/patch.py
index 8fc6f1383e..44fc8696db 100644
--- a/lib/spack/spack/cmd/patch.py
+++ b/lib/spack/spack/cmd/patch.py
@@ -47,5 +47,5 @@ def patch(parser, args):
specs = spack.cmd.parse_specs(args.packages, concretize=True)
for spec in specs:
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
package.do_patch()
diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py
index 1ebc5ce3ee..448f762841 100644
--- a/lib/spack/spack/cmd/pkg.py
+++ b/lib/spack/spack/cmd/pkg.py
@@ -85,7 +85,7 @@ def list_packages(rev):
def pkg_add(args):
for pkg_name in args.packages:
- filename = spack.db.filename_for_package_name(pkg_name)
+ filename = spack.repo.filename_for_package_name(pkg_name)
if not os.path.isfile(filename):
tty.die("No such package: %s. Path does not exist:" % pkg_name, filename)
diff --git a/lib/spack/spack/cmd/providers.py b/lib/spack/spack/cmd/providers.py
index 0472f9bbe4..49d6ac192a 100644
--- a/lib/spack/spack/cmd/providers.py
+++ b/lib/spack/spack/cmd/providers.py
@@ -39,4 +39,4 @@ def setup_parser(subparser):
def providers(parser, args):
for spec in spack.cmd.parse_specs(args.vpkg_spec):
- colify(sorted(spack.db.providers_for(spec)), indent=4)
+ colify(sorted(spack.repo.providers_for(spec)), indent=4)
diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py
new file mode 100644
index 0000000000..991d306c04
--- /dev/null
+++ b/lib/spack/spack/cmd/repo.py
@@ -0,0 +1,135 @@
+##############################################################################
+# 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://llnl.github.io/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License (as published by
+# the Free Software Foundation) version 2.1 dated February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+import os
+import re
+import shutil
+
+from external import argparse
+import llnl.util.tty as tty
+from llnl.util.filesystem import join_path, mkdirp
+
+import spack.spec
+import spack.config
+from spack.util.environment import get_path
+from spack.repository import packages_dir_name, repo_config_name, Repo
+
+description = "Manage package source repositories."
+
+def setup_parser(subparser):
+ sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='repo_command')
+
+ # Create
+ create_parser = sp.add_parser('create', help=repo_create.__doc__)
+ create_parser.add_argument(
+ 'namespace', help="Namespace to identify packages in the repository.")
+ create_parser.add_argument(
+ 'directory', help="Directory to create the repo in. Defaults to same as namespace.", nargs='?')
+
+ # List
+ list_parser = sp.add_parser('list', help=repo_list.__doc__)
+
+
+def repo_create(args):
+ """Create a new package repo for a particular namespace."""
+ namespace = args.namespace
+ if not re.match(r'\w[\.\w-]*', namespace):
+ tty.die("Invalid namespace: '%s'" % namespace)
+
+ root = args.directory
+ if not root:
+ root = namespace
+
+ existed = False
+ if os.path.exists(root):
+ if os.path.isfile(root):
+ tty.die('File %s already exists and is not a directory' % root)
+ elif os.path.isdir(root):
+ if not os.access(root, os.R_OK | os.W_OK):
+ tty.die('Cannot create new repo in %s: cannot access directory.' % root)
+ if os.listdir(root):
+ tty.die('Cannot create new repo in %s: directory is not empty.' % root)
+ existed = True
+
+ full_path = os.path.realpath(root)
+ parent = os.path.dirname(full_path)
+ if not os.access(parent, os.R_OK | os.W_OK):
+ tty.die("Cannot create repository in %s: can't access parent!" % root)
+
+ try:
+ config_path = os.path.join(root, repo_config_name)
+ packages_path = os.path.join(root, packages_dir_name)
+
+ mkdirp(packages_path)
+ with open(config_path, 'w') as config:
+ config.write("repo:\n")
+ config.write(" namespace: '%s'\n" % namespace)
+
+ except (IOError, OSError) as e:
+ tty.die('Failed to create new repository in %s.' % root,
+ "Caused by %s: %s" % (type(e), e))
+
+ # try to clean up.
+ if existed:
+ shutil.rmtree(config_path, ignore_errors=True)
+ shutil.rmtree(packages_path, ignore_errors=True)
+ else:
+ shutil.rmtree(root, ignore_errors=True)
+
+ tty.msg("Created repo with namespace '%s'." % namespace)
+ tty.msg("To register it with Spack, add a line like this to ~/.spack/repos.yaml:",
+ 'repos:',
+ ' - ' + full_path)
+
+
+def repo_add(args):
+ """Remove a package source from the Spack configuration"""
+ # FIXME: how to deal with this with the current config architecture?
+ # FIXME: Repos do not have mnemonics, which I assumed would be simpler... should they have them after all?
+
+
+def repo_remove(args):
+ """Remove a package source from the Spack configuration"""
+ # FIXME: see above.
+
+
+def repo_list(args):
+ """List package sources and their mnemoics"""
+ roots = spack.config.get_repos_config()
+ repos = [Repo(r) for r in roots]
+
+ msg = "%d package repositor" % len(repos)
+ msg += "y." if len(repos) == 1 else "ies."
+ tty.msg(msg)
+
+ 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)
+
+
+def repo(parser, args):
+ action = { 'create' : repo_create,
+ 'list' : repo_list }
+ action[args.repo_command](args)
diff --git a/lib/spack/spack/cmd/restage.py b/lib/spack/spack/cmd/restage.py
index 703ae30a04..540c2ef2a5 100644
--- a/lib/spack/spack/cmd/restage.py
+++ b/lib/spack/spack/cmd/restage.py
@@ -42,5 +42,5 @@ def restage(parser, args):
specs = spack.cmd.parse_specs(args.packages, concretize=True)
for spec in specs:
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
package.do_restage()
diff --git a/lib/spack/spack/cmd/stage.py b/lib/spack/spack/cmd/stage.py
index 7638cf31c4..5786780efb 100644
--- a/lib/spack/spack/cmd/stage.py
+++ b/lib/spack/spack/cmd/stage.py
@@ -49,5 +49,5 @@ def stage(parser, args):
specs = spack.cmd.parse_specs(args.specs, concretize=True)
for spec in specs:
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
package.do_stage()
diff --git a/lib/spack/spack/cmd/test-install.py b/lib/spack/spack/cmd/test-install.py
index e37554155f..74017f59fb 100644
--- a/lib/spack/spack/cmd/test-install.py
+++ b/lib/spack/spack/cmd/test-install.py
@@ -115,7 +115,7 @@ def fetch_log(path):
def failed_dependencies(spec):
return set(childSpec for childSpec in spec.dependencies.itervalues() if not
- spack.db.get(childSpec).installed)
+ spack.repo.get(childSpec).installed)
def create_test_output(topSpec, newInstalls, output, getLogFunc=fetch_log):
@@ -126,7 +126,7 @@ def create_test_output(topSpec, newInstalls, output, getLogFunc=fetch_log):
continue
failedDeps = failed_dependencies(spec)
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
if failedDeps:
result = TestResult.SKIPPED
dep = iter(failedDeps).next()
@@ -171,7 +171,7 @@ def test_install(parser, args):
newInstalls = set()
for spec in topSpec.traverse():
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
if not package.installed:
newInstalls.add(spec)
@@ -188,7 +188,7 @@ def test_install(parser, args):
# Calling do_install for the top-level package would be sufficient but
# this attempts to keep going if any package fails (other packages which
# are not dependents may succeed)
- package = spack.db.get(spec)
+ package = spack.repo.get(spec)
if (not failed_dependencies(spec)) and (not package.installed):
try:
package.do_install(
diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py
index 03873bb5f8..d01aa2136b 100644
--- a/lib/spack/spack/cmd/uninstall.py
+++ b/lib/spack/spack/cmd/uninstall.py
@@ -30,7 +30,7 @@ from llnl.util.tty.colify import colify
import spack
import spack.cmd
-import spack.packages
+import spack.repository
from spack.cmd.find import display_specs
from spack.package import PackageStillNeededError
@@ -79,10 +79,9 @@ def uninstall(parser, args):
try:
# should work if package is known to spack
pkgs.append(s.package)
-
- except spack.packages.UnknownPackageError, e:
- # The package.py file has gone away -- but still want to
- # uninstall.
+ except spack.repository.UnknownPackageError, e:
+ # The package.py file has gone away -- but still
+ # want to uninstall.
spack.Package(s).do_uninstall(force=True)
# Sort packages to be uninstalled by the number of installed dependents
diff --git a/lib/spack/spack/cmd/urls.py b/lib/spack/spack/cmd/urls.py
index a544b6153b..ebab65f7d1 100644
--- a/lib/spack/spack/cmd/urls.py
+++ b/lib/spack/spack/cmd/urls.py
@@ -41,7 +41,7 @@ def setup_parser(subparser):
def urls(parser, args):
urls = set()
- for pkg in spack.db.all_packages():
+ for pkg in spack.repo.all_packages():
url = getattr(pkg.__class__, 'url', None)
if url:
urls.add(url)
diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py
index 494f13d36d..bba75dae96 100644
--- a/lib/spack/spack/cmd/versions.py
+++ b/lib/spack/spack/cmd/versions.py
@@ -34,7 +34,7 @@ def setup_parser(subparser):
def versions(parser, args):
- pkg = spack.db.get(args.package)
+ pkg = spack.repo.get(args.package)
safe_versions = pkg.versions
fetched_versions = pkg.fetch_remote_versions()
diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py
index 66e608cf79..321452fddb 100644
--- a/lib/spack/spack/compilers/__init__.py
+++ b/lib/spack/spack/compilers/__init__.py
@@ -35,6 +35,7 @@ import spack
import spack.error
import spack.spec
import spack.config
+import spack.architecture
from spack.util.multiproc import parmap
from spack.compiler import Compiler
@@ -55,23 +56,48 @@ def _auto_compiler_spec(function):
return converter
-def _get_config():
- """Get a Spack config, but make sure it has compiler configuration
- first."""
+def _to_dict(compiler):
+ """Return a dict version of compiler suitable to insert in YAML."""
+ return {
+ str(compiler.spec) : dict(
+ (attr, getattr(compiler, attr, None))
+ for attr in _required_instance_vars)
+ }
+
+
+def get_compiler_config(arch=None):
+ """Return the compiler configuration for the specified architecture.
+
+ If the compiler configuration designates some compilers for
+ 'all' architectures, those are merged into the result, as well.
+
+ """
# If any configuration file has compilers, just stick with the
# ones already configured.
- config = spack.config.get_compilers_config()
- existing = [spack.spec.CompilerSpec(s)
- for s in config]
- if existing:
- return config
+ config = spack.config.get_config('compilers')
+
+ if arch is None:
+ arch = spack.architecture.sys_type()
- compilers = find_compilers(*get_path('PATH'))
- add_compilers_to_config('user', *compilers)
+ if arch not in config:
+ config[arch] = {}
+ compilers = find_compilers(*get_path('PATH'))
+ for compiler in compilers:
+ config[arch].update(_to_dict(compiler))
+ spack.config.update_config('compilers', config, 'user')
- # After writing compilers to the user config, return a full config
- # from all files.
- return spack.config.get_compilers_config()
+ # Merge 'all' compilers with arch-specific ones.
+ merged_config = config.get('all', {})
+ merged_config = spack.config._merge_yaml(merged_config, config[arch])
+
+ return merged_config
+
+
+def all_compilers(arch=None):
+ """Return a set of specs for all the compiler versions currently
+ available to build with. These are instances of CompilerSpec.
+ """
+ return [spack.spec.CompilerSpec(s) for s in get_compiler_config(arch)]
_cached_default_compiler = None
@@ -123,20 +149,6 @@ def find_compilers(*path):
return clist
-def add_compilers_to_config(scope, *compilers):
- compiler_config_tree = {}
- for compiler in compilers:
- compiler_entry = {}
- for c in _required_instance_vars:
- val = getattr(compiler, c)
- if not val:
- val = "None"
- compiler_entry[c] = val
- compiler_config_tree[str(compiler.spec)] = compiler_entry
- spack.config.add_to_compiler_config(compiler_config_tree, scope)
-
-
-
def supported_compilers():
"""Return a set of names of compilers supported by Spack.
@@ -152,14 +164,6 @@ def supported(compiler_spec):
return compiler_spec.name in supported_compilers()
-def all_compilers():
- """Return a set of specs for all the compiler versions currently
- available to build with. These are instances of CompilerSpec.
- """
- configuration = _get_config()
- return [spack.spec.CompilerSpec(s) for s in configuration]
-
-
@_auto_compiler_spec
def find(compiler_spec):
"""Return specs of available compilers that match the supplied
@@ -172,7 +176,7 @@ def compilers_for_spec(compiler_spec):
"""This gets all compilers that satisfy the supplied CompilerSpec.
Returns an empty list if none are found.
"""
- config = _get_config()
+ config = get_compiler_config()
def get_compiler(cspec):
items = config[str(cspec)]
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index c127f6a28f..b401f59d7f 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -45,11 +45,11 @@ several configuration files, such as compilers.yaml or mirrors.yaml.
Configuration file format
===============================
-Configuration files are formatted using YAML syntax.
-This format is implemented by Python's
-yaml class, and it's easy to read and versatile.
+Configuration files are formatted using YAML syntax. This format is
+implemented by libyaml (included with Spack as an external module),
+and it's easy to read and versatile.
-The config files are structured as trees, like this ``compiler`` section::
+Config files are structured as trees, like this ``compiler`` section::
compilers:
chaos_5_x86_64_ib:
@@ -67,274 +67,339 @@ In this example, entries like ''compilers'' and ''xlc@12.1'' are used to
categorize entries beneath them in the tree. At the root of the tree,
entries like ''cc'' and ''cxx'' are specified as name/value pairs.
-Spack returns these trees as nested dicts. The dict for the above example
-would looks like:
-
- { 'compilers' :
- { 'chaos_5_x86_64_ib' :
- { 'gcc@4.4.7' :
- { 'cc' : '/usr/bin/gcc',
- 'cxx' : '/usr/bin/g++'
- 'f77' : '/usr/bin/gfortran'
- 'fc' : '/usr/bin/gfortran' }
- }
- { 'bgqos_0' :
- { 'cc' : '/usr/local/bin/mpixlc' }
- }
- }
-
-Some routines, like get_mirrors_config and get_compilers_config may strip
-off the top-levels of the tree and return subtrees.
+``config.get_config()`` returns these trees as nested dicts, but it
+strips the first level off. So, ``config.get_config('compilers')``
+would return something like this for the above example:
+
+ { 'chaos_5_x86_64_ib' :
+ { 'gcc@4.4.7' :
+ { 'cc' : '/usr/bin/gcc',
+ 'cxx' : '/usr/bin/g++'
+ 'f77' : '/usr/bin/gfortran'
+ 'fc' : '/usr/bin/gfortran' }
+ }
+ { 'bgqos_0' :
+ { 'cc' : '/usr/local/bin/mpixlc' } }
+
+Likewise, the ``mirrors.yaml`` file's first line must be ``mirrors:``,
+but ``get_config()`` strips that off too.
+
+Precedence
+===============================
+
+``config.py`` routines attempt to recursively merge configuration
+across scopes. So if there are ``compilers.py`` files in both the
+site scope and the user scope, ``get_config('compilers')`` will return
+merged dictionaries of *all* the compilers available. If a user
+compiler conflicts with a site compiler, Spack will overwrite the site
+configuration wtih the user configuration. If both the user and site
+``mirrors.yaml`` files contain lists of mirrors, then ``get_config()``
+will return a concatenated list of mirrors, with the user config items
+first.
+
+Sometimes, it is useful to *completely* override a site setting with a
+user one. To accomplish this, you can use *two* colons at the end of
+a key in a configuration file. For example, this:
+
+ compilers::
+ chaos_5_x86_64_ib:
+ gcc@4.4.7:
+ cc: /usr/bin/gcc
+ cxx: /usr/bin/g++
+ f77: /usr/bin/gfortran
+ fc: /usr/bin/gfortran
+ bgqos_0:
+ xlc@12.1:
+ cc: /usr/local/bin/mpixlc
+ ...
+
+Will make Spack take compilers *only* from the user configuration, and
+the site configuration will be ignored.
+
"""
import os
-import exceptions
import sys
-
-from ordereddict_backport import OrderedDict
-from llnl.util.lang import memoized
-import spack.error
-
+import copy
import yaml
from yaml.error import MarkedYAMLError
+
import llnl.util.tty as tty
from llnl.util.filesystem import mkdirp
-_config_sections = {}
-class _ConfigCategory:
- name = None
- filename = None
- merge = True
- def __init__(self, n, f, m):
- self.name = n
- self.filename = f
- self.merge = m
- self.files_read_from = []
- self.result_dict = {}
- _config_sections[n] = self
-
-_ConfigCategory('compilers', 'compilers.yaml', True)
-_ConfigCategory('mirrors', 'mirrors.yaml', True)
-_ConfigCategory('view', 'views.yaml', True)
-_ConfigCategory('order', 'orders.yaml', True)
-
-"""Names of scopes and their corresponding configuration files."""
-config_scopes = [('site', os.path.join(spack.etc_path, 'spack')),
- ('user', os.path.expanduser('~/.spack'))]
-
-_compiler_by_arch = {}
-_read_config_file_result = {}
+import spack
+from spack.error import SpackError
+
+"""List of valid config sections."""
+valid_sections = ('compilers', 'mirrors', 'repos')
+
+
+def check_section(section):
+ """Raise a ValueError if the section is not a valid section."""
+ if section not in valid_sections:
+ raise ValueError("Invalid config section: '%s'. Options are %s."
+ % (section, valid_sections))
+
+
+class ConfigScope(object):
+ """This class represents a configuration scope.
+
+ A scope is one directory containing named configuration files.
+ Each file is a config "section" (e.g., mirrors, compilers, etc).
+ """
+ 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.
+
+
+ def get_section_filename(self, section):
+ check_section(section)
+ return os.path.join(self.path, "%s.yaml" % section)
+
+
+ def get_section(self, section):
+ if not section in self.sections:
+ path = self.get_section_filename(section)
+ data = _read_config_file(path)
+ self.sections[section] = {} if data is None else data
+ return self.sections[section]
+
+
+ def write_section(self, section):
+ filename = self.get_section_filename(section)
+ data = self.get_section(section)
+ try:
+ mkdirp(self.path)
+ with open(filename, 'w') as f:
+ yaml.dump(data, stream=f, default_flow_style=False)
+ except (yaml.YAMLError, IOError) as e:
+ raise ConfigFileError("Error writing to config file: '%s'" % str(e))
+
+
+ def clear(self):
+ """Empty cached config information."""
+ self.sections = {}
+
+
+"""List of config scopes by name.
+ Later scopes in the list will override earlier scopes.
+"""
+config_scopes = [
+ ConfigScope('site', os.path.join(spack.etc_path, 'spack')),
+ ConfigScope('user', os.path.expanduser('~/.spack'))]
+
+"""List of valid scopes, for convenience."""
+valid_scopes = (s.name for s in config_scopes)
+
+
+def check_scope(scope):
+ if scope is None:
+ return 'user'
+ elif scope not in valid_scopes:
+ raise ValueError("Invalid config scope: '%s'. Must be one of %s."
+ % (scope, valid_scopes))
+ return scope
+
+
+def get_scope(scope):
+ scope = check_scope(scope)
+ return next(s for s in config_scopes if s.name == scope)
+
+
def _read_config_file(filename):
- """Read a given YAML configuration file"""
- global _read_config_file_result
- if filename in _read_config_file_result:
- return _read_config_file_result[filename]
+ """Read a YAML configuration file."""
+ # Ignore nonexisting files.
+ if not os.path.exists(filename):
+ return None
+
+ elif not os.path.isfile(filename):
+ raise ConfigFileError(
+ "Invlaid configuration. %s exists but is not a file." % filename)
+
+ elif not os.access(filename, os.R_OK):
+ raise ConfigFileError("Config file is not readable: %s." % filename)
try:
with open(filename) as f:
- ydict = yaml.load(f)
+ return yaml.load(f)
+
except MarkedYAMLError, e:
- tty.die("Error parsing yaml%s: %s" % (str(e.context_mark), e.problem))
- except exceptions.IOError, e:
- _read_config_file_result[filename] = None
- return None
- _read_config_file_result[filename] = ydict
- return ydict
+ raise ConfigFileError(
+ "Error parsing yaml%s: %s" % (str(e.context_mark), e.problem))
+
+ except IOError, e:
+ raise ConfigFileError(
+ "Error reading configuration file %s: %s" % (filename, str(e)))
def clear_config_caches():
"""Clears the caches for configuration files, which will cause them
to be re-read upon the next request"""
- for key,s in _config_sections.iteritems():
- s.files_read_from = []
- s.result_dict = {}
- spack.config._read_config_file_result = {}
- spack.config._compiler_by_arch = {}
- spack.compilers._cached_default_compiler = None
-
-
-def _merge_dicts(d1, d2):
- """Recursively merges two configuration trees, with entries
- in d2 taking precedence over d1"""
- if not d1:
- return d2.copy()
- if not d2:
- return d1
-
- for key2, val2 in d2.iteritems():
- if not key2 in d1:
- d1[key2] = val2
- continue
- val1 = d1[key2]
- if isinstance(val1, dict) and isinstance(val2, dict):
- d1[key2] = _merge_dicts(val1, val2)
- continue
- if isinstance(val1, list) and isinstance(val2, list):
- val1.extend(val2)
- seen = set()
- d1[key2] = [ x for x in val1 if not (x in seen or seen.add(x)) ]
- continue
- d1[key2] = val2
- return d1
-
-
-def get_config(category_name):
- """Get the confguration tree for the names category. Strips off the
- top-level category entry from the dict"""
- global config_scopes
- category = _config_sections[category_name]
- if category.result_dict:
- return category.result_dict
-
- category.result_dict = {}
- for scope, scope_path in config_scopes:
- path = os.path.join(scope_path, category.filename)
- result = _read_config_file(path)
- if not result:
- continue
- if not category_name in result:
- continue
- category.files_read_from.insert(0, path)
- result = result[category_name]
- if category.merge:
- category.result_dict = _merge_dicts(category.result_dict, result)
- else:
- category.result_dict = result
- return category.result_dict
-
-
-def get_compilers_config(arch=None):
- """Get the compiler configuration from config files for the given
- architecture. Strips off the architecture component of the
- configuration"""
- global _compiler_by_arch
- if not arch:
- arch = spack.architecture.sys_type()
- if arch in _compiler_by_arch:
- return _compiler_by_arch[arch]
-
- cc_config = get_config('compilers')
- if arch in cc_config and 'all' in cc_config:
- arch_compiler = dict(cc_config[arch])
- _compiler_by_arch[arch] = _merge_dict(arch_compiler, cc_config['all'])
- elif arch in cc_config:
- _compiler_by_arch[arch] = cc_config[arch]
- elif 'all' in cc_config:
- _compiler_by_arch[arch] = cc_config['all']
- else:
- _compiler_by_arch[arch] = {}
- return _compiler_by_arch[arch]
-
-
-def get_mirror_config():
- """Get the mirror configuration from config files"""
- return get_config('mirrors')
-
-
-def get_config_scope_dirname(scope):
- """For a scope return the config directory"""
- global config_scopes
- for s,p in config_scopes:
- if s == scope:
- return p
- tty.die("Unknown scope %s. Valid options are %s" %
- (scope, ", ".join([s for s,p in config_scopes])))
-
-
-def get_config_scope_filename(scope, category_name):
- """For some scope and category, get the name of the configuration file"""
- if not category_name in _config_sections:
- tty.die("Unknown config category %s. Valid options are: %s" %
- (category_name, ", ".join([s for s in _config_sections])))
- return os.path.join(get_config_scope_dirname(scope), _config_sections[category_name].filename)
-
-
-def add_to_config(category_name, addition_dict, scope=None):
- """Merge a new dict into a configuration tree and write the new
- configuration to disk"""
- global _read_config_file_result
- get_config(category_name)
- category = _config_sections[category_name]
-
- #If scope is specified, use it. Otherwise use the last config scope that
- #we successfully parsed data from.
- file = None
- path = None
- if not scope and not category.files_read_from:
- scope = 'user'
- if scope:
- try:
- dir = get_config_scope_dirname(scope)
- if not os.path.exists(dir):
- mkdirp(dir)
- path = os.path.join(dir, category.filename)
- file = open(path, 'w')
- except exceptions.IOError, e:
- pass
+ for scope in config_scopes:
+ scope.clear()
+
+
+def _merge_yaml(dest, source):
+ """Merges source into dest; entries in source take precedence over dest.
+
+ This routine may modify dest and should be assigned to dest, in
+ case dest was None to begin with, e.g.:
+
+ dest = _merge_yaml(dest, source)
+
+ Config file authors can optionally end any attribute in a dict
+ with `::` instead of `:`, and the key will override that of the
+ parent instead of merging.
+
+ """
+ def they_are(t):
+ return isinstance(dest, t) and isinstance(source, t)
+
+ # If both are None, handle specially and return None.
+ if source is None and dest is None:
+ return None
+
+ # If source is None, overwrite with source.
+ elif source is None:
+ return None
+
+ # Source list is prepended (for precedence)
+ if they_are(list):
+ seen = set(source)
+ dest[:] = source + [x for x in dest if x not in seen]
+ return dest
+
+ # Source dict is merged into dest. Extra ':' means overwrite.
+ elif they_are(dict):
+ for sk, sv in source.iteritems():
+ # allow total override with, e.g., repos::
+ override = sk.endswith(':')
+ if override:
+ sk = sk.rstrip(':')
+
+ if override or not sk in dest:
+ dest[sk] = copy.copy(sv)
+ else:
+ dest[sk] = _merge_yaml(dest[sk], source[sk])
+ return dest
+
+ # In any other case, overwrite with a copy of the source value.
else:
- for p in category.files_read_from:
- try:
- file = open(p, 'w')
- except exceptions.IOError, e:
- pass
- if file:
- path = p
- break;
- if not file:
- tty.die('Unable to write to config file %s' % path)
-
- #Merge the new information into the existing file info, then write to disk
- new_dict = _read_config_file_result[path]
- if new_dict and category_name in new_dict:
- new_dict = new_dict[category_name]
- new_dict = _merge_dicts(new_dict, addition_dict)
- new_dict = { category_name : new_dict }
- _read_config_file_result[path] = new_dict
- yaml.dump(new_dict, stream=file, default_flow_style=False)
- file.close()
-
- #Merge the new information into the cached results
- category.result_dict = _merge_dicts(category.result_dict, addition_dict)
-
-
-def add_to_mirror_config(addition_dict, scope=None):
- """Add mirrors to the configuration files"""
- add_to_config('mirrors', addition_dict, scope)
-
-
-def add_to_compiler_config(addition_dict, scope=None, arch=None):
- """Add compilerss to the configuration files"""
- if not arch:
- arch = spack.architecture.sys_type()
- add_to_config('compilers', { arch : addition_dict }, scope)
- clear_config_caches()
-
-
-def remove_from_config(category_name, key_to_rm, scope=None):
- """Remove a configuration key and write a new configuration to disk"""
- global config_scopes
- get_config(category_name)
- scopes_to_rm_from = [scope] if scope else [s for s,p in config_scopes]
- category = _config_sections[category_name]
-
- rmd_something = False
- for s in scopes_to_rm_from:
- path = get_config_scope_filename(scope, category_name)
- result = _read_config_file(path)
- if not result:
+ return copy.copy(source)
+
+
+def substitute_spack_prefix(path):
+ """Replaces instances of $spack with Spack's prefix."""
+ return path.replace('$spack', spack.prefix)
+
+
+def get_config(section):
+ """Get configuration settings for a section.
+
+ Strips off the top-level section name from the YAML dict.
+ """
+ check_section(section)
+ merged_section = {}
+
+ for scope in config_scopes:
+ # read potentially cached data from the scope.
+ data = scope.get_section(section)
+ if not data or not section in data:
continue
- if not key_to_rm in result[category_name]:
+
+ # extract data under the section name header
+ data = data[section]
+
+ # ignore empty sections for easy commenting of single-line configs.
+ if not data:
continue
- with open(path, 'w') as f:
- result[category_name].pop(key_to_rm, None)
- yaml.dump(result, stream=f, default_flow_style=False)
- category.result_dict.pop(key_to_rm, None)
- rmd_something = True
- return rmd_something
+
+ # merge config data from scopes.
+ merged_section = _merge_yaml(merged_section, data)
+
+ return merged_section
+
+
+def get_repos_config():
+ repo_list = get_config('repos')
+ if repo_list is None:
+ return []
+
+ if not isinstance(repo_list, list):
+ tty.die("Bad repository configuration. 'repos' element does not contain a list.")
+
+ def expand_repo_path(path):
+ path = substitute_spack_prefix(path)
+ path = os.path.expanduser(path)
+ return path
+ return [expand_repo_path(repo) for repo in repo_list]
+
+
+def get_config_filename(scope, section):
+ """For some scope and section, get the name of the configuration file"""
+ scope = get_scope(scope)
+ return scope.get_section_filename(section)
+
+
+def update_config(section, update_data, scope=None):
+ """Update the configuration file for a particular scope.
+
+ Merges contents of update_data into the scope's data for the
+ specified section, then writes out the config file.
+
+ update_data shoudl contain only the section's data, with the
+ top-level name stripped off. This can be a list, dict, or any
+ other yaml-ish structure.
+
+ """
+ # read in the config to ensure we've got current data
+ get_config(section)
+
+ check_section(section) # validate section name
+ scope = get_scope(scope) # get ConfigScope object from string.
+
+ # read only the requested section's data.
+ data = scope.get_section(section)
+ data = _merge_yaml(data, { section : update_data })
+ scope.write_section(section)
+
+
+def remove_from_config(section, key_to_rm, scope=None):
+ """Remove a configuration key and write updated configuration to disk.
+
+ Return True if something was removed, False otherwise.
+
+ """
+ # ensure configs are current by reading in.
+ get_config(section)
+
+ # check args and get the objects we need.
+ scope = get_scope(scope)
+ data = scope.get_section(section)
+ filename = scope.get_section_filename(section)
+
+ # do some checks
+ if not data:
+ return False
+
+ if not section in data:
+ raise ConfigFileError("Invalid configuration file: '%s'" % filename)
+
+ if key_to_rm not in section[section]:
+ return False
+
+ # remove the key from the section's configuration
+ del data[section][key_to_rm]
+ scope.write_section(section)
"""Print a configuration to stdout"""
-def print_category(category_name):
- if not category_name in _config_sections:
- tty.die("Unknown config category %s. Valid options are: %s" %
- (category_name, ", ".join([s for s in _config_sections])))
- yaml.dump(get_config(category_name), stream=sys.stdout, default_flow_style=False)
+def print_section(section):
+ try:
+ yaml.dump(get_config(section), stream=sys.stdout, default_flow_style=False)
+ except (yaml.YAMLError, IOError) as e:
+ raise ConfigError("Error reading configuration: %s" % section)
+
+
+class ConfigError(SpackError): pass
+class ConfigFileError(ConfigError): pass
diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py
index a6f1cc5077..0fa18db34b 100644
--- a/lib/spack/spack/database.py
+++ b/lib/spack/spack/database.py
@@ -54,7 +54,7 @@ import spack.spec
from spack.version import Version
from spack.spec import Spec
from spack.error import SpackError
-from spack.packages import UnknownPackageError
+from spack.repository import UnknownPackageError
# DB goes in this directory underneath the root
_db_dirname = '.spack-db'
@@ -215,7 +215,6 @@ class Database(object):
# Specs from the database need to be marked concrete because
# they represent actual installations.
spec._mark_concrete()
-
return spec
@@ -554,7 +553,7 @@ class Database(object):
for key, rec in self._data.items():
if installed is not any and rec.installed != installed:
continue
- if known is not any and spack.db.exists(rec.spec.name) != known:
+ if known is not any and spack.repo.exists(rec.spec.name) != known:
continue
if query_spec is any or rec.spec.satisfies(query_spec):
results.append(rec.spec)
diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py
index aa9fbd8d33..0b98211cb9 100644
--- a/lib/spack/spack/directives.py
+++ b/lib/spack/spack/directives.py
@@ -244,11 +244,10 @@ def patch(pkg, url_or_filename, level=1, when=None):
if when is None:
when = pkg.name
when_spec = parse_anonymous_spec(when, pkg.name)
-
cur_patches = pkg.patches.setdefault(when_spec, [])
# if this spec is identical to some other, then append this
# patch to the existing list.
- cur_patches.append(Patch(pkg.name, url_or_filename, level))
+ cur_patches.append(Patch(pkg, url_or_filename, level))
@directive('variants')
diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index d91fbe9f4e..3e416a6a1f 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -213,7 +213,6 @@ class YamlDirectoryLayout(DirectoryLayout):
# Specs read from actual installations are always concrete
spec._mark_concrete()
-
return spec
diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py
index e8c5cfb080..f3732dfbff 100644
--- a/lib/spack/spack/graph.py
+++ b/lib/spack/spack/graph.py
@@ -523,7 +523,7 @@ def graph_dot(*specs, **kwargs):
return '"%s"' % string
if not specs:
- specs = [p.name for p in spack.db.all_packages()]
+ specs = [p.name for p in spack.repo.all_packages()]
else:
roots = specs
specs = set()
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index b44554e418..5db83064b5 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -372,7 +372,7 @@ class Package(object):
self._total_time = 0.0
if self.is_extension:
- spack.db.get(self.extendee_spec)._check_extendable()
+ spack.repo.get(self.extendee_spec)._check_extendable()
@property
@@ -564,7 +564,7 @@ class Package(object):
yield spec
continue
- for pkg in spack.db.get(name).preorder_traversal(visited, **kwargs):
+ for pkg in spack.repo.get(name).preorder_traversal(visited, **kwargs):
yield pkg
@@ -774,6 +774,12 @@ class Package(object):
tty.msg("Patched %s" % self.name)
+ @property
+ def namespace(self):
+ namespace, dot, module = self.__module__.rpartition('.')
+ return namespace
+
+
def do_fake_install(self):
"""Make a fake install directory contaiing a 'fake' file in bin."""
mkdirp(self.prefix.bin)
diff --git a/lib/spack/spack/packages.py b/lib/spack/spack/packages.py
deleted file mode 100644
index 080644fb90..0000000000
--- a/lib/spack/spack/packages.py
+++ /dev/null
@@ -1,210 +0,0 @@
-##############################################################################
-# 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 os
-import sys
-import inspect
-import glob
-import imp
-
-import llnl.util.tty as tty
-from llnl.util.filesystem import join_path
-from llnl.util.lang import *
-
-import spack.error
-import spack.spec
-from spack.virtual import ProviderIndex
-from spack.util.naming import mod_to_class, validate_module_name
-
-# Name of module under which packages are imported
-_imported_packages_module = 'spack.packages'
-
-# Name of the package file inside a package directory
-_package_file_name = 'package.py'
-
-
-def _autospec(function):
- """Decorator that automatically converts the argument of a single-arg
- function to a Spec."""
- def converter(self, spec_like, **kwargs):
- if not isinstance(spec_like, spack.spec.Spec):
- spec_like = spack.spec.Spec(spec_like)
- return function(self, spec_like, **kwargs)
- return converter
-
-
-class PackageDB(object):
- def __init__(self, root):
- """Construct a new package database from a root directory."""
- self.root = root
- self.instances = {}
- self.provider_index = None
-
-
- @_autospec
- def get(self, spec, **kwargs):
- if spec.virtual:
- raise UnknownPackageError(spec.name)
-
- key = hash(spec)
- if kwargs.get('new', False):
- if key in self.instances:
- del self.instances[key]
-
- if not key in self.instances:
- package_class = self.get_class_for_package_name(spec.name)
- try:
- copy = spec.copy() # defensive copy. Package owns its spec.
- self.instances[key] = package_class(copy)
- except Exception, e:
- if spack.debug:
- sys.excepthook(*sys.exc_info())
- raise FailedConstructorError(spec.name, e)
-
- return self.instances[key]
-
-
- @_autospec
- def delete(self, spec):
- """Force a package to be recreated."""
- del self.instances[spec.dag_hash()]
-
-
- def purge(self):
- """Clear entire package instance cache."""
- self.instances.clear()
-
-
- @_autospec
- def providers_for(self, vpkg_spec):
- if self.provider_index is None:
- self.provider_index = ProviderIndex(self.all_package_names())
-
- providers = self.provider_index.providers_for(vpkg_spec)
- if not providers:
- raise UnknownPackageError(vpkg_spec.name)
- return providers
-
-
- @_autospec
- def extensions_for(self, extendee_spec):
- return [p for p in self.all_packages() if p.extends(extendee_spec)]
-
-
- def dirname_for_package_name(self, pkg_name):
- """Get the directory name for a particular package. This is the
- directory that contains its package.py file."""
- return join_path(self.root, pkg_name)
-
-
- def filename_for_package_name(self, pkg_name):
- """Get the filename for the module we should load for a particular
- package. Packages for a pacakge DB live in
- ``$root/<package_name>/package.py``
-
- This will return a proper package.py path even if the
- package doesn't exist yet, so callers will need to ensure
- the package exists before importing.
- """
- validate_module_name(pkg_name)
- pkg_dir = self.dirname_for_package_name(pkg_name)
- return join_path(pkg_dir, _package_file_name)
-
-
- @memoized
- def all_package_names(self):
- """Generator function for all packages. This looks for
- ``<pkg_name>/package.py`` files within the root direcotry"""
- all_package_names = []
- for pkg_name in os.listdir(self.root):
- pkg_dir = join_path(self.root, pkg_name)
- pkg_file = join_path(pkg_dir, _package_file_name)
- if os.path.isfile(pkg_file):
- all_package_names.append(pkg_name)
- all_package_names.sort()
- return all_package_names
-
-
- def all_packages(self):
- for name in self.all_package_names():
- yield self.get(name)
-
-
- @memoized
- def exists(self, pkg_name):
- """Whether a package with the supplied name exists ."""
- return os.path.exists(self.filename_for_package_name(pkg_name))
-
-
- @memoized
- def get_class_for_package_name(self, pkg_name):
- """Get an instance of the class for a particular package.
-
- This method uses Python's ``imp`` package to load python
- source from a Spack package's ``package.py`` file. A
- normal python import would only load each package once, but
- because we do this dynamically, the method needs to be
- memoized to ensure there is only ONE package class
- instance, per package, per database.
- """
- file_path = self.filename_for_package_name(pkg_name)
-
- if os.path.exists(file_path):
- if not os.path.isfile(file_path):
- tty.die("Something's wrong. '%s' is not a file!" % file_path)
- if not os.access(file_path, os.R_OK):
- tty.die("Cannot read '%s'!" % file_path)
- else:
- raise UnknownPackageError(pkg_name)
-
- class_name = mod_to_class(pkg_name)
- try:
- module_name = _imported_packages_module + '.' + pkg_name
- module = imp.load_source(module_name, file_path)
-
- except ImportError, e:
- tty.die("Error while importing %s from %s:\n%s" % (
- pkg_name, file_path, e.message))
-
- cls = getattr(module, class_name)
- if not inspect.isclass(cls):
- tty.die("%s.%s is not a class" % (pkg_name, class_name))
-
- return cls
-
-
-class UnknownPackageError(spack.error.SpackError):
- """Raised when we encounter a package spack doesn't have."""
- def __init__(self, name):
- super(UnknownPackageError, self).__init__("Package '%s' not found." % name)
- self.name = name
-
-
-class FailedConstructorError(spack.error.SpackError):
- """Raised when a package's class constructor fails."""
- def __init__(self, name, reason):
- super(FailedConstructorError, self).__init__(
- "Class constructor failed for package '%s'." % name,
- str(reason))
- self.name = name
diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py
index 42f2105f52..b82a047753 100644
--- a/lib/spack/spack/patch.py
+++ b/lib/spack/spack/patch.py
@@ -41,8 +41,8 @@ class Patch(object):
"""This class describes a patch to be applied to some expanded
source code."""
- def __init__(self, pkg_name, path_or_url, level):
- self.pkg_name = pkg_name
+ def __init__(self, pkg, path_or_url, level):
+ self.pkg_name = pkg.name
self.path_or_url = path_or_url
self.path = None
self.url = None
@@ -54,7 +54,7 @@ class Patch(object):
if '://' in path_or_url:
self.url = path_or_url
else:
- pkg_dir = spack.db.dirname_for_package_name(pkg_name)
+ pkg_dir = spack.repo.dirname_for_package_name(self.pkg_name)
self.path = join_path(pkg_dir, path_or_url)
if not os.path.isfile(self.path):
raise NoSuchPatchFileError(pkg_name, self.path)
diff --git a/lib/spack/spack/repository.py b/lib/spack/spack/repository.py
new file mode 100644
index 0000000000..4e91855db0
--- /dev/null
+++ b/lib/spack/spack/repository.py
@@ -0,0 +1,665 @@
+##############################################################################
+# 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://llnl.github.io/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License (as published by
+# the Free Software Foundation) version 2.1 dated February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+import os
+import exceptions
+import sys
+import inspect
+import imp
+import re
+import traceback
+from bisect import bisect_left
+from external import yaml
+
+import llnl.util.tty as tty
+from llnl.util.filesystem import join_path
+
+import spack.error
+import spack.spec
+from spack.virtual import ProviderIndex
+from spack.util.naming import *
+
+#
+# Super-namespace for all packages.
+# Package modules are imported as spack.pkg.<namespace>.<pkg-name>.
+#
+repo_namespace = 'spack.pkg'
+
+#
+# These names describe how repos should be laid out in the filesystem.
+#
+repo_config_name = 'repo.yaml' # Top-level filename for repo config.
+packages_dir_name = 'packages' # Top-level repo directory containing pkgs.
+package_file_name = 'package.py' # Filename for packages in a repository.
+
+def _autospec(function):
+ """Decorator that automatically converts the argument of a single-arg
+ function to a Spec."""
+ def converter(self, spec_like, *args, **kwargs):
+ if not isinstance(spec_like, spack.spec.Spec):
+ spec_like = spack.spec.Spec(spec_like)
+ return function(self, spec_like, *args, **kwargs)
+ return converter
+
+
+def _make_namespace_module(ns):
+ module = imp.new_module(ns)
+ module.__file__ = "(spack namespace)"
+ module.__path__ = []
+ module.__package__ = ns
+ return module
+
+
+class RepoPath(object):
+ """A RepoPath is a list of repos that function as one.
+
+ It functions exactly like a Repo, but it operates on the
+ combined results of the Repos in its list instead of on a
+ single package repository.
+ """
+ def __init__(self, *repo_dirs, **kwargs):
+ # super-namespace for all packages in the RepoPath
+ self.super_namespace = kwargs.get('namespace', repo_namespace)
+
+ self.repos = []
+ self.by_namespace = NamespaceTrie()
+ self.by_path = {}
+
+ self._all_package_names = []
+ self._provider_index = None
+
+ # Add each repo to this path.
+ for root in repo_dirs:
+ repo = Repo(root, self.super_namespace)
+ self.put_last(repo)
+
+
+ def swap(self, other):
+ """Convenience function to make swapping repostiories easier.
+
+ This is currently used by mock tests.
+ TODO: Maybe there is a cleaner way.
+
+ """
+ attrs = ['repos',
+ 'by_namespace',
+ 'by_path',
+ '_all_package_names',
+ '_provider_index']
+ for attr in attrs:
+ tmp = getattr(self, attr)
+ setattr(self, attr, getattr(other, attr))
+ setattr(other, attr, tmp)
+
+
+ def _add(self, repo):
+ """Add a repository to the namespace and path indexes.
+
+ Checks for duplicates -- two repos can't have the same root
+ directory, and they provide have the same namespace.
+
+ """
+ if repo.root in self.by_path:
+ raise DuplicateRepoError("Package repos are the same",
+ repo, self.by_path[repo.root])
+
+ if repo.namespace in self.by_namespace:
+ raise DuplicateRepoError("Package repos cannot provide the same namespace",
+ repo, self.by_namespace[repo.namespace])
+
+ # Add repo to the pkg indexes
+ self.by_namespace[repo.full_namespace] = repo
+ self.by_path[repo.root] = repo
+
+ # add names to the cached name list
+ new_pkgs = set(repo.all_package_names())
+ new_pkgs.update(set(self._all_package_names))
+ self._all_package_names = sorted(new_pkgs, key=lambda n:n.lower())
+
+
+ def put_first(self, repo):
+ """Add repo first in the search path."""
+ self._add(repo)
+ self.repos.insert(0, repo)
+
+
+ def put_last(self, repo):
+ """Add repo last in the search path."""
+ self._add(repo)
+ self.repos.append(repo)
+
+
+ def remove(self, repo):
+ """Remove a repo from the search path."""
+ if repo in self.repos:
+ self.repos.remove(repo)
+
+
+ def all_package_names(self):
+ """Return all unique package names in all repositories."""
+ return self._all_package_names
+
+
+ def all_packages(self):
+ for name in self.all_package_names():
+ yield self.get(name)
+
+
+ @_autospec
+ def providers_for(self, vpkg_spec):
+ if self._provider_index is None:
+ self._provider_index = ProviderIndex(self.all_package_names())
+
+ providers = self._provider_index.providers_for(vpkg_spec)
+ if not providers:
+ raise UnknownPackageError(vpkg_spec.name)
+ return providers
+
+
+ def find_module(self, fullname, path=None):
+ """Implements precedence for overlaid namespaces.
+
+ Loop checks each namespace in self.repos for packages, and
+ also handles loading empty containing namespaces.
+
+ """
+ # namespaces are added to repo, and package modules are leaves.
+ namespace, dot, module_name = fullname.rpartition('.')
+
+ # If it's a module in some repo, or if it is the repo's
+ # namespace, let the repo handle it.
+ for repo in self.repos:
+ if namespace == repo.full_namespace:
+ if repo.real_name(module_name):
+ return repo
+ elif fullname == repo.full_namespace:
+ return repo
+
+ # No repo provides the namespace, but it is a valid prefix of
+ # something in the RepoPath.
+ if self.by_namespace.is_prefix(fullname):
+ return self
+
+ return None
+
+
+ def load_module(self, fullname):
+ """Handles loading container namespaces when necessary.
+
+ See ``Repo`` for how actual package modules are loaded.
+ """
+ if fullname in sys.modules:
+ return sys.modules[fullname]
+
+
+ # partition fullname into prefix and module name.
+ namespace, dot, module_name = fullname.rpartition('.')
+
+ if not self.by_namespace.is_prefix(fullname):
+ raise ImportError("No such Spack repo: %s" % fullname)
+
+ module = _make_namespace_module(namespace)
+ module.__loader__ = self
+ sys.modules[fullname] = module
+ return module
+
+
+ def repo_for_pkg(self, pkg_name):
+ for repo in self.repos:
+ if pkg_name in repo:
+ return repo
+ raise UnknownPackageError(pkg_name)
+
+
+ @_autospec
+ def get(self, spec, new=False):
+ """Find a repo that contains the supplied spec's package.
+
+ Raises UnknownPackageError if not found.
+ """
+ # if the spec has a fully qualified namespace, we grab it
+ # directly and ignore overlay precedence.
+ if spec.namespace:
+ fullspace = '%s.%s' % (self.super_namespace, spec.namespace)
+ if not fullspace in self.by_namespace:
+ raise UnknownPackageError(
+ "No configured repository contains package %s." % spec.fullname)
+ return self.by_namespace[fullspace].get(spec)
+ else:
+ return self.repo_for_pkg(spec.name).get(spec)
+
+
+ def dirname_for_package_name(self, pkg_name):
+ return self.repo_for_pkg(pkg_name).dirname_for_package_name(pkg_name)
+
+
+ def filename_for_package_name(self, pkg_name):
+ return self.repo_for_pkg(pkg_name).filename_for_package_name(pkg_name)
+
+
+ def exists(self, pkg_name):
+ return any(repo.exists(pkg_name) for repo in self.repos)
+
+
+ def __contains__(self, pkg_name):
+ return self.exists(pkg_name)
+
+
+
+class Repo(object):
+ """Class representing a package repository in the filesystem.
+
+ Each package repository must have a top-level configuration file
+ called `repo.yaml`.
+
+ Currently, `repo.yaml` this must define:
+
+ `namespace`:
+ A Python namespace where the repository's packages should live.
+
+ """
+ def __init__(self, root, namespace=repo_namespace):
+ """Instantiate a package repository from a filesystem path.
+
+ Arguments:
+ root The root directory of the repository.
+
+ namespace A super-namespace that will contain the repo-defined
+ namespace (this is generally jsut `spack.pkg`). The
+ super-namespace is Spack's way of separating repositories
+ from other python namespaces.
+
+ """
+ # Root directory, containing _repo.yaml and package dirs
+ self.root = root
+
+ # super-namespace for all packages in the Repo
+ self.super_namespace = namespace
+
+ # check and raise BadRepoError on fail.
+ def check(condition, msg):
+ if not condition: raise BadRepoError(msg)
+
+ # Validate repository layout.
+ self.config_file = join_path(self.root, repo_config_name)
+ check(os.path.isfile(self.config_file),
+ "No %s found in '%s'" % (repo_config_name, root))
+ self.packages_path = join_path(self.root, packages_dir_name)
+ check(os.path.isdir(self.packages_path),
+ "No directory '%s' found in '%s'" % (repo_config_name, root))
+
+ # Read configuration and validate namespace
+ config = self._read_config()
+ check('namespace' in config, '%s must define a namespace.'
+ % join_path(self.root, repo_config_name))
+
+ self.namespace = config['namespace']
+ check(re.match(r'[a-zA-Z][a-zA-Z0-9_.]+', self.namespace),
+ ("Invalid namespace '%s' in repo '%s'. " % (self.namespace, self.root)) +
+ "Namespaces must be valid python identifiers separated by '.'")
+
+ # Set up 'full_namespace' to include the super-namespace
+ if self.super_namespace:
+ self.full_namespace = "%s.%s" % (self.super_namespace, self.namespace)
+ else:
+ self.full_namespace = self.namespace
+
+ # Keep name components around for checking prefixes.
+ self._names = self.full_namespace.split('.')
+
+ # These are internal cache variables.
+ self._modules = {}
+ self._classes = {}
+ self._instances = {}
+ self._provider_index = None
+ self._all_package_names = None
+
+ # make sure the namespace for packages in this repo exists.
+ self._create_namespace()
+
+
+ def _create_namespace(self):
+ """Create this repo's namespace module and insert it into sys.modules.
+
+ Ensures that modules loaded via the repo have a home, and that
+ we don't get runtime warnings from Python's module system.
+
+ """
+ parent = None
+ for l in range(1, len(self._names)+1):
+ ns = '.'.join(self._names[:l])
+ if not ns in sys.modules:
+ module = _make_namespace_module(ns)
+ module.__loader__ = self
+ sys.modules[ns] = module
+
+ # Ensure the namespace is an atrribute of its parent,
+ # if it has not been set by something else already.
+ #
+ # This ensures that we can do things like:
+ # import spack.pkg.builtin.mpich as mpich
+ if parent:
+ modname = self._names[l-1]
+ if not hasattr(parent, modname):
+ setattr(parent, modname, module)
+ else:
+ # no need to set up a module, but keep track of the parent.
+ module = sys.modules[ns]
+ parent = module
+
+
+ def real_name(self, import_name):
+ """Allow users to import Spack packages using Python identifiers.
+
+ A python identifier might map to many different Spack package
+ names due to hyphen/underscore ambiguity.
+
+ Easy example:
+ num3proxy -> 3proxy
+
+ Ambiguous:
+ foo_bar -> foo_bar, foo-bar
+
+ More ambiguous:
+ foo_bar_baz -> foo_bar_baz, foo-bar-baz, foo_bar-baz, foo-bar_baz
+ """
+ if import_name in self:
+ return import_name
+
+ options = possible_spack_module_names(import_name)
+ options.remove(import_name)
+ for name in options:
+ if name in self:
+ return name
+ return None
+
+
+ def is_prefix(self, fullname):
+ """True if fullname is a prefix of this Repo's namespace."""
+ parts = fullname.split('.')
+ return self._names[:len(parts)] == parts
+
+
+ def find_module(self, fullname, path=None):
+ """Python find_module import hook.
+
+ Returns this Repo if it can load the module; None if not.
+ """
+ if self.is_prefix(fullname):
+ return self
+
+ namespace, dot, module_name = fullname.rpartition('.')
+ if namespace == self.full_namespace:
+ if self.real_name(module_name):
+ return self
+
+ return None
+
+
+ def load_module(self, fullname):
+ """Python importer load hook.
+
+ Tries to load the module; raises an ImportError if it can't.
+ """
+ if fullname in sys.modules:
+ return sys.modules[fullname]
+
+ namespace, dot, module_name = fullname.rpartition('.')
+
+ if self.is_prefix(fullname):
+ module = _make_namespace_module(fullname)
+
+ elif namespace == self.full_namespace:
+ real_name = self.real_name(module_name)
+ if not real_name:
+ raise ImportError("No module %s in %s" % (module_name, self))
+ module = self._get_pkg_module(real_name)
+
+ else:
+ raise ImportError("No module %s in %s" % (fullname, self))
+
+ module.__loader__ = self
+ sys.modules[fullname] = module
+ return module
+
+
+ def _read_config(self):
+ """Check for a YAML config file in this db's root directory."""
+ try:
+ with open(self.config_file) as reponame_file:
+ yaml_data = yaml.load(reponame_file)
+
+ if (not yaml_data or 'repo' not in yaml_data or
+ not isinstance(yaml_data['repo'], dict)):
+ tty.die("Invalid %s in repository %s"
+ % (repo_config_name, self.root))
+
+ return yaml_data['repo']
+
+ except exceptions.IOError, e:
+ tty.die("Error reading %s when opening %s"
+ % (self.config_file, self.root))
+
+
+ @_autospec
+ def get(self, spec, new=False):
+ if spec.virtual:
+ raise UnknownPackageError(spec.name)
+
+ if spec.namespace and spec.namespace != self.namespace:
+ raise UnknownPackageError("Repository %s does not contain package %s."
+ % (self.namespace, spec.fullname))
+
+ key = hash(spec)
+ if new or key not in self._instances:
+ package_class = self._get_pkg_class(spec.name)
+ try:
+ copy = spec.copy() # defensive copy. Package owns its spec.
+ self._instances[key] = package_class(copy)
+ except Exception, e:
+ if spack.debug:
+ sys.excepthook(*sys.exc_info())
+ raise FailedConstructorError(spec.fullname, *sys.exc_info())
+
+ return self._instances[key]
+
+
+ def purge(self):
+ """Clear entire package instance cache."""
+ self._instances.clear()
+
+
+ @_autospec
+ def providers_for(self, vpkg_spec):
+ if self._provider_index is None:
+ self._provider_index = ProviderIndex(self.all_package_names())
+
+ providers = self._provider_index.providers_for(vpkg_spec)
+ if not providers:
+ raise UnknownPackageError(vpkg_spec.name)
+ return providers
+
+
+ @_autospec
+ def extensions_for(self, extendee_spec):
+ return [p for p in self.all_packages() if p.extends(extendee_spec)]
+
+
+ def dirname_for_package_name(self, pkg_name):
+ """Get the directory name for a particular package. This is the
+ directory that contains its package.py file."""
+ return join_path(self.packages_path, pkg_name)
+
+
+ def filename_for_package_name(self, pkg_name):
+ """Get the filename for the module we should load for a particular
+ package. Packages for a Repo live in
+ ``$root/<package_name>/package.py``
+
+ This will return a proper package.py path even if the
+ package doesn't exist yet, so callers will need to ensure
+ the package exists before importing.
+ """
+ validate_module_name(pkg_name)
+ pkg_dir = self.dirname_for_package_name(pkg_name)
+ return join_path(pkg_dir, package_file_name)
+
+
+ def all_package_names(self):
+ """Returns a sorted list of all package names in the Repo."""
+ if self._all_package_names is None:
+ self._all_package_names = []
+
+ 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)
+ if not os.path.isdir(pkg_dir):
+ continue
+
+ # Skip directories without a package.py in them.
+ pkg_file = join_path(self.packages_path, pkg_name, package_file_name)
+ if not os.path.isfile(pkg_file):
+ continue
+
+ # Warn about invalid names that look like packages.
+ if not valid_module_name(pkg_name):
+ tty.warn("Skipping package at %s. '%s' is not a valid Spack module name."
+ % (pkg_dir, pkg_name))
+ continue
+
+ # All checks passed. Add it to the list.
+ self._all_package_names.append(pkg_name)
+ self._all_package_names.sort()
+
+ return self._all_package_names
+
+
+ def all_packages(self):
+ for name in self.all_package_names():
+ yield self.get(name)
+
+
+ def exists(self, pkg_name):
+ """Whether a package with the supplied name exists."""
+ # 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)
+
+
+ def _get_pkg_module(self, pkg_name):
+ """Create a module for a particular package.
+
+ This caches the module within this Repo *instance*. It does
+ *not* add it to ``sys.modules``. So, you can construct
+ multiple Repos for testing and ensure that the module will be
+ loaded once per repo.
+
+ """
+ if pkg_name not in self._modules:
+ file_path = self.filename_for_package_name(pkg_name)
+
+ if not os.path.exists(file_path):
+ raise UnknownPackageError(pkg_name, self)
+
+ if not os.path.isfile(file_path):
+ tty.die("Something's wrong. '%s' is not a file!" % file_path)
+
+ if not os.access(file_path, os.R_OK):
+ tty.die("Cannot read '%s'!" % file_path)
+
+ # e.g., spack.pkg.builtin.mpich
+ fullname = "%s.%s" % (self.full_namespace, pkg_name)
+
+ module = imp.load_source(fullname, file_path)
+ module.__package__ = self.full_namespace
+ module.__loader__ = self
+ self._modules[pkg_name] = module
+
+ return self._modules[pkg_name]
+
+
+ def _get_pkg_class(self, pkg_name):
+ """Get the class for the package out of its module.
+
+ First loads (or fetches from cache) a module for the
+ package. Then extracts the package class from the module
+ according to Spack's naming convention.
+ """
+ class_name = mod_to_class(pkg_name)
+ module = self._get_pkg_module(pkg_name)
+
+ cls = getattr(module, class_name)
+ if not inspect.isclass(cls):
+ tty.die("%s.%s is not a class" % (pkg_name, class_name))
+
+ return cls
+
+
+ def __str__(self):
+ return "[Repo '%s' at '%s']" % (self.namespace, self.root)
+
+
+ def __repr__(self):
+ return self.__str__()
+
+
+ def __contains__(self, pkg_name):
+ return self.exists(pkg_name)
+
+
+class BadRepoError(spack.error.SpackError):
+ """Raised when repo layout is invalid."""
+ def __init__(self, msg):
+ super(BadRepoError, self).__init__(msg)
+
+
+class UnknownPackageError(spack.error.SpackError):
+ """Raised when we encounter a package spack doesn't have."""
+ def __init__(self, name, repo=None):
+ msg = None
+ if repo:
+ msg = "Package %s not found in repository %s." % (name, repo)
+ else:
+ msg = "Package %s not found." % name
+ super(UnknownPackageError, self).__init__(msg)
+ self.name = name
+
+
+class DuplicateRepoError(spack.error.SpackError):
+ """Raised when duplicate repos are added to a RepoPath."""
+ def __init__(self, msg, repo1, repo2):
+ super(UnknownPackageError, self).__init__(
+ "%s: %s, %s" % (msg, repo1, repo2))
+
+
+class FailedConstructorError(spack.error.SpackError):
+ """Raised when a package's class constructor fails."""
+ def __init__(self, name, exc_type, exc_obj, exc_tb):
+ super(FailedConstructorError, self).__init__(
+ "Class constructor failed for package '%s'." % name,
+ '\nCaused by:\n' +
+ ('%s: %s\n' % (exc_type.__name__, exc_obj)) +
+ ''.join(traceback.format_tb(exc_tb)))
+ self.name = name
diff --git a/lib/spack/spack/resource.py b/lib/spack/spack/resource.py
index 8d081b45c9..2bf92947fd 100644
--- a/lib/spack/spack/resource.py
+++ b/lib/spack/spack/resource.py
@@ -6,7 +6,7 @@
# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
-# For details, see https://scalability-llnl.github.io/spack
+# For details, see https://llnl.github.io/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
@@ -22,9 +22,11 @@
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
-"""
-Describes an optional resource needed for a build. Typically a bunch of sources that can be built in-tree within another
+"""Describes an optional resource needed for a build.
+
+Typically a bunch of sources that can be built in-tree within another
package to enable optional features.
+
"""
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 037ec97a5e..10e246bf2e 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -412,6 +412,7 @@ class Spec(object):
self.dependencies = other.dependencies
self.variants = other.variants
self.variants.spec = self
+ self.namespace = other.namespace
# Specs are by default not assumed to be normal, but in some
# cases we've read them from a file want to assume normal.
@@ -464,6 +465,13 @@ class Spec(object):
self.dependencies[spec.name] = spec
spec.dependents[self.name] = self
+ #
+ # Public interface
+ #
+ @property
+ def fullname(self):
+ return '%s.%s' % (self.namespace, self.name) if self.namespace else self.name
+
@property
def root(self):
@@ -486,7 +494,7 @@ class Spec(object):
@property
def package(self):
- return spack.db.get(self)
+ return spack.repo.get(self)
@property
@@ -504,7 +512,7 @@ class Spec(object):
@staticmethod
def is_virtual(name):
"""Test if a name is virtual without requiring a Spec."""
- return not spack.db.exists(name)
+ return not spack.repo.exists(name)
@property
@@ -517,11 +525,13 @@ class Spec(object):
return True
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.compiler and self.compiler.concrete
and self.dependencies.concrete)
+
return self._concrete
@@ -657,6 +667,12 @@ class Spec(object):
'dependencies' : dict((d, self.dependencies[d].dag_hash())
for d in sorted(self.dependencies))
}
+
+ # Older concrete specs do not have a namespace. Omit for
+ # consistent hashing.
+ if not self.concrete or self.namespace:
+ d['namespace'] = self.namespace
+
if self.compiler:
d.update(self.compiler.to_dict())
else:
@@ -681,6 +697,7 @@ class Spec(object):
node = node[name]
spec = Spec(name)
+ spec.namespace = node.get('namespace', None)
spec.versions = VersionList.from_dict(node)
spec.architecture = node['arch']
@@ -797,7 +814,7 @@ class Spec(object):
return changed
for spec in virtuals:
- providers = spack.db.providers_for(spec)
+ providers = spack.repo.providers_for(spec)
concrete = spack.concretizer.choose_provider(spec, providers)
concrete = concrete.copy()
spec._replace_with(concrete)
@@ -833,6 +850,19 @@ class Spec(object):
changed = any(changes)
force=True
+ for s in self.traverse():
+ # After concretizing, assign namespaces to anything left.
+ # Note that this doesn't count as a "change". The repository
+ # configuration is constant throughout a spack run, and
+ # normalize and concretize evaluate Packages using Repo.get(),
+ # which respects precedence. So, a namespace assignment isn't
+ # changing how a package name would have been interpreted and
+ # we can do it as late as possible to allow as much
+ # compatibility across repositories as possible.
+ if s.namespace is None:
+ s.namespace = spack.repo.repo_for_pkg(s.name).namespace
+
+ # Mark everything in the spec as concrete, as well.
self._mark_concrete()
@@ -919,7 +949,7 @@ class Spec(object):
the dependency. If no conditions are True (and we don't
depend on it), return None.
"""
- pkg = spack.db.get(self.name)
+ pkg = spack.repo.get(self.fullname)
conditions = pkg.dependencies[name]
# evaluate when specs to figure out constraints on the dependency.
@@ -1047,7 +1077,7 @@ class Spec(object):
any_change = False
changed = True
- pkg = spack.db.get(self.name)
+ pkg = spack.repo.get(self.fullname)
while changed:
changed = False
for dep_name in pkg.dependencies:
@@ -1068,18 +1098,17 @@ class Spec(object):
the root, and ONLY the ones that were explicitly provided are there.
Normalization turns a partial flat spec into a DAG, where:
- 1. ALL dependencies of the root package are in the DAG.
- 2. Each node's dependencies dict only contains its direct deps.
+ 1. Known dependencies of the root package are in the DAG.
+ 2. Each node's dependencies dict only contains its known direct deps.
3. There is only ONE unique spec for each package in the DAG.
* This includes virtual packages. If there a non-virtual
package that provides a virtual package that is in the spec,
then we replace the virtual package with the non-virtual one.
- 4. The spec DAG matches package DAG, including default variant values.
-
TODO: normalize should probably implement some form of cycle detection,
to ensure that the spec is actually a DAG.
+
"""
if self._normal and not force:
return False
@@ -1125,7 +1154,7 @@ class Spec(object):
for spec in self.traverse():
# Don't get a package for a virtual name.
if not spec.virtual:
- spack.db.get(spec.name)
+ spack.repo.get(spec.fullname)
# validate compiler in addition to the package name.
if spec.compiler:
@@ -1148,6 +1177,10 @@ class Spec(object):
if not self.name == other.name:
raise UnsatisfiableSpecNameError(self.name, other.name)
+ if other.namespace is not None:
+ if self.namespace is not None and other.namespace != self.namespace:
+ raise UnsatisfiableSpecNameError(self.fullname, other.fullname)
+
if not self.versions.overlaps(other.versions):
raise UnsatisfiableVersionSpecError(self.versions, other.versions)
@@ -1191,7 +1224,7 @@ class Spec(object):
# TODO: might want more detail than this, e.g. specific deps
# in violation. if this becomes a priority get rid of this
- # check and be more specici about what's wrong.
+ # check and be more specific about what's wrong.
if not other.satisfies_dependencies(self):
raise UnsatisfiableDependencySpecError(other, self)
@@ -1264,7 +1297,7 @@ class Spec(object):
# A concrete provider can satisfy a virtual dependency.
if not self.virtual and other.virtual:
- pkg = spack.db.get(self.name)
+ pkg = spack.repo.get(self.fullname)
if pkg.provides(other.name):
for provided, when_spec in pkg.provided.items():
if self.satisfies(when_spec, deps=False, strict=strict):
@@ -1276,6 +1309,11 @@ class Spec(object):
if self.name != other.name:
return False
+ # namespaces either match, or other doesn't require one.
+ if other.namespace is not None:
+ if self.namespace is not None and self.namespace != other.namespace:
+ return False
+
if self.versions and other.versions:
if not self.versions.satisfies(other.versions, strict=strict):
return False
@@ -1375,6 +1413,7 @@ class Spec(object):
self.dependencies = DependencyMap()
self.variants = other.variants.copy()
self.variants.spec = self
+ self.namespace = other.namespace
# If we copy dependencies, preserve DAG structure in the new spec
if kwargs.get('deps', True):
@@ -1493,6 +1532,7 @@ class Spec(object):
def _cmp_node(self):
"""Comparison key for just *this node* and not its deps."""
return (self.name,
+ self.namespace,
self.versions,
self.variants,
self.architecture,
@@ -1530,6 +1570,7 @@ class Spec(object):
in the format string. The format strings you can provide are::
$_ Package name
+ $. Full package name (with namespace)
$@ Version
$% Compiler
$%@ Compiler & compiler version
@@ -1577,6 +1618,8 @@ class Spec(object):
if c == '_':
out.write(fmt % self.name)
+ elif c == '.':
+ out.write(fmt % self.fullname)
elif c == '@':
if self.versions and self.versions != _any_version:
write(fmt % (c + str(self.versions)), c)
@@ -1725,17 +1768,23 @@ class SpecParser(spack.parse.Parser):
def spec(self):
"""Parse a spec out of the input. If a spec is supplied, then initialize
and return it instead of creating a new one."""
- self.check_identifier()
+
+ spec_namespace, dot, spec_name = self.token.value.rpartition('.')
+ if not spec_namespace:
+ spec_namespace = None
+
+ self.check_identifier(spec_name)
# This will init the spec without calling __init__.
spec = Spec.__new__(Spec)
- spec.name = self.token.value
+ spec.name = spec_name
spec.versions = VersionList()
spec.variants = VariantMap(spec)
spec.architecture = None
spec.compiler = None
spec.dependents = DependencyMap()
spec.dependencies = DependencyMap()
+ spec.namespace = spec_namespace
spec._normal = False
spec._concrete = False
@@ -1829,12 +1878,14 @@ class SpecParser(spack.parse.Parser):
return compiler
- def check_identifier(self):
+ def check_identifier(self, id=None):
"""The only identifiers that can contain '.' are versions, but version
ids are context-sensitive so we have to check on a case-by-case
basis. Call this if we detect a version id where it shouldn't be.
"""
- if '.' in self.token.value:
+ if not id:
+ id = self.token.value
+ if '.' in id:
self.last_token_error("Identifier cannot contain '.'")
diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py
index 754344fc01..543a3a6223 100644
--- a/lib/spack/spack/stage.py
+++ b/lib/spack/spack/stage.py
@@ -242,7 +242,8 @@ class Stage(object):
# TODO: move mirror logic out of here and clean it up!
if self.mirror_path:
- urls = ["%s/%s" % (m, self.mirror_path) for m in _get_mirrors()]
+ urls = ["%s/%s" % (u, self.mirror_path)
+ for name, u in spack.config.get_config('mirrors')]
digest = None
if isinstance(self.fetcher, fs.URLFetchStrategy):
@@ -345,7 +346,7 @@ class DIYStage(object):
def _get_mirrors():
"""Get mirrors from spack configuration."""
- config = spack.config.get_mirror_config()
+ config = spack.config.get_config('mirrors')
return [val for name, val in config.iteritems()]
diff --git a/lib/spack/spack/test/__init__.py b/lib/spack/spack/test/__init__.py
index 13cb1d2b78..081e6c7b06 100644
--- a/lib/spack/spack/test/__init__.py
+++ b/lib/spack/spack/test/__init__.py
@@ -59,7 +59,8 @@ test_names = ['versions',
'configure_guess',
'unit_install',
'lock',
- 'database']
+ 'database',
+ 'namespace_trie']
def list_tests():
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index 2f8e0c7ec0..7f2938aec5 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -125,22 +125,22 @@ class ConcretizeTest(MockPackagesTest):
we ask for some advanced version.
"""
self.assertTrue(not any(spec.satisfies('mpich2@:1.0')
- for spec in spack.db.providers_for('mpi@2.1')))
+ for spec in spack.repo.providers_for('mpi@2.1')))
self.assertTrue(not any(spec.satisfies('mpich2@:1.1')
- for spec in spack.db.providers_for('mpi@2.2')))
+ for spec in spack.repo.providers_for('mpi@2.2')))
self.assertTrue(not any(spec.satisfies('mpich2@:1.1')
- for spec in spack.db.providers_for('mpi@2.2')))
+ for spec in spack.repo.providers_for('mpi@2.2')))
self.assertTrue(not any(spec.satisfies('mpich@:1')
- for spec in spack.db.providers_for('mpi@2')))
+ for spec in spack.repo.providers_for('mpi@2')))
self.assertTrue(not any(spec.satisfies('mpich@:1')
- for spec in spack.db.providers_for('mpi@3')))
+ for spec in spack.repo.providers_for('mpi@3')))
self.assertTrue(not any(spec.satisfies('mpich2')
- for spec in spack.db.providers_for('mpi@3')))
+ for spec in spack.repo.providers_for('mpi@3')))
def test_virtual_is_fully_expanded_for_callpath(self):
diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py
index ed11e34c69..f56287aa98 100644
--- a/lib/spack/spack/test/config.py
+++ b/lib/spack/spack/test/config.py
@@ -27,48 +27,90 @@ import shutil
import os
from tempfile import mkdtemp
import spack
-from spack.packages import PackageDB
+import spack.config
from spack.test.mock_packages_test import *
+# Some sample compiler config data
+a_comps = {
+ "gcc@4.7.3" : {
+ "cc" : "/gcc473",
+ "cxx" : "/g++473",
+ "f77" : None,
+ "f90" : None },
+ "gcc@4.5.0" : {
+ "cc" : "/gcc450",
+ "cxx" : "/g++450",
+ "f77" : "/gfortran",
+ "f90" : "/gfortran" },
+ "clang@3.3" : {
+ "cc" : "<overwritten>",
+ "cxx" : "<overwritten>",
+ "f77" : "<overwritten>",
+ "f90" : "<overwritten>" }
+}
+
+b_comps = {
+ "icc@10.0" : {
+ "cc" : "/icc100",
+ "cxx" : "/icc100",
+ "f77" : None,
+ "f90" : None },
+ "icc@11.1" : {
+ "cc" : "/icc111",
+ "cxx" : "/icp111",
+ "f77" : "/ifort",
+ "f90" : "/ifort" },
+ "clang@3.3" : {
+ "cc" : "/clang",
+ "cxx" : "/clang++",
+ "f77" : None,
+ "f90" : None}
+}
+
class ConfigTest(MockPackagesTest):
def setUp(self):
- self.initmock()
+ super(ConfigTest, self).setUp()
self.tmp_dir = mkdtemp('.tmp', 'spack-config-test-')
- spack.config.config_scopes = [('test_low_priority', os.path.join(self.tmp_dir, 'low')),
- ('test_high_priority', os.path.join(self.tmp_dir, 'high'))]
+ spack.config.config_scopes = [
+ spack.config.ConfigScope('test_low_priority', os.path.join(self.tmp_dir, 'low')),
+ spack.config.ConfigScope('test_high_priority', os.path.join(self.tmp_dir, 'high'))]
+ spack.config.valid_scopes = ('test_low_priority', 'test_high_priority')
def tearDown(self):
- self.cleanmock()
+ super(ConfigTest, self).tearDown()
shutil.rmtree(self.tmp_dir, True)
- def check_config(self, comps):
- config = spack.config.get_compilers_config()
+
+ def check_config(self, comps, *compiler_names):
+ """Check that named compilers in comps match Spack's config."""
+ config = spack.config.get_config('compilers')
compiler_list = ['cc', 'cxx', 'f77', 'f90']
- for key in comps:
+ for key in compiler_names:
for c in compiler_list:
- if comps[key][c] == '/bad':
- continue
- self.assertEqual(comps[key][c], config[key][c])
+ expected = comps[key][c]
+ actual = config[key][c]
+ self.assertEqual(expected, actual)
- def test_write_key(self):
- a_comps = {"gcc@4.7.3" : { "cc" : "/gcc473", "cxx" : "/g++473", "f77" : None, "f90" : None },
- "gcc@4.5.0" : { "cc" : "/gcc450", "cxx" : "/g++450", "f77" : "/gfortran", "f90" : "/gfortran" },
- "clang@3.3" : { "cc" : "/bad", "cxx" : "/bad", "f77" : "/bad", "f90" : "/bad" }}
+ def test_write_key_in_memory(self):
+ # Write b_comps "on top of" a_comps.
+ spack.config.update_config('compilers', a_comps, 'test_low_priority')
+ spack.config.update_config('compilers', b_comps, 'test_high_priority')
- b_comps = {"icc@10.0" : { "cc" : "/icc100", "cxx" : "/icc100", "f77" : None, "f90" : None },
- "icc@11.1" : { "cc" : "/icc111", "cxx" : "/icp111", "f77" : "/ifort", "f90" : "/ifort" },
- "clang@3.3" : { "cc" : "/clang", "cxx" : "/clang++", "f77" : None, "f90" : None}}
+ # Make sure the config looks how we expect.
+ self.check_config(a_comps, 'gcc@4.7.3', 'gcc@4.5.0')
+ self.check_config(b_comps, 'icc@10.0', 'icc@11.1', 'clang@3.3')
- spack.config.add_to_compiler_config(a_comps, 'test_low_priority')
- spack.config.add_to_compiler_config(b_comps, 'test_high_priority')
- self.check_config(a_comps)
- self.check_config(b_comps)
+ def test_write_key_to_disk(self):
+ # Write b_comps "on top of" a_comps.
+ spack.config.update_config('compilers', a_comps, 'test_low_priority')
+ spack.config.update_config('compilers', b_comps, 'test_high_priority')
+ # Clear caches so we're forced to read from disk.
spack.config.clear_config_caches()
- self.check_config(a_comps)
- self.check_config(b_comps)
-
+ # Same check again, to ensure consistency.
+ self.check_config(a_comps, 'gcc@4.7.3', 'gcc@4.5.0')
+ self.check_config(b_comps, 'icc@10.0', 'icc@11.1', 'clang@3.3')
diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py
index c07d32686e..0205f4b8ce 100644
--- a/lib/spack/spack/test/database.py
+++ b/lib/spack/spack/test/database.py
@@ -79,7 +79,8 @@ class DatabaseTest(MockPackagesTest):
def _mock_install(self, spec):
s = Spec(spec)
- pkg = spack.db.get(s.concretized())
+ s.concretize()
+ pkg = spack.repo.get(s)
pkg.do_install(fake=True)
diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py
index 703ac1b867..107a7a6412 100644
--- a/lib/spack/spack/test/directory_layout.py
+++ b/lib/spack/spack/test/directory_layout.py
@@ -34,7 +34,7 @@ from llnl.util.filesystem import *
import spack
from spack.spec import Spec
-from spack.packages import PackageDB
+from spack.repository import RepoPath
from spack.directory_layout import YamlDirectoryLayout
# number of packages to test (to reduce test time)
@@ -62,7 +62,7 @@ class DirectoryLayoutTest(unittest.TestCase):
finally that the directory can be removed by the directory
layout.
"""
- packages = list(spack.db.all_packages())[:max_packages]
+ packages = list(spack.repo.all_packages())[:max_packages]
for pkg in packages:
spec = pkg.spec
@@ -123,17 +123,17 @@ class DirectoryLayoutTest(unittest.TestCase):
information about installed packages' specs to uninstall
or query them again if the package goes away.
"""
- mock_db = PackageDB(spack.mock_packages_path)
+ mock_db = RepoPath(spack.mock_packages_path)
not_in_mock = set.difference(
- set(spack.db.all_package_names()),
+ set(spack.repo.all_package_names()),
set(mock_db.all_package_names()))
packages = list(not_in_mock)[:max_packages]
# Create all the packages that are not in mock.
installed_specs = {}
for pkg_name in packages:
- spec = spack.db.get(pkg_name).spec
+ spec = spack.repo.get(pkg_name).spec
# If a spec fails to concretize, just skip it. If it is a
# real error, it will be caught by concretization tests.
@@ -145,8 +145,7 @@ class DirectoryLayoutTest(unittest.TestCase):
self.layout.create_install_directory(spec)
installed_specs[spec] = self.layout.path_for_spec(spec)
- tmp = spack.db
- spack.db = mock_db
+ spack.repo.swap(mock_db)
# Now check that even without the package files, we know
# enough to read a spec from the spec file.
@@ -161,12 +160,12 @@ class DirectoryLayoutTest(unittest.TestCase):
self.assertTrue(spec.eq_dag(spec_from_file))
self.assertEqual(spec.dag_hash(), spec_from_file.dag_hash())
- spack.db = tmp
+ spack.repo.swap(mock_db)
def test_find(self):
"""Test that finding specs within an install layout works."""
- packages = list(spack.db.all_packages())[:max_packages]
+ packages = list(spack.repo.all_packages())[:max_packages]
# Create install prefixes for all packages in the list
installed_specs = {}
diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py
index 244680b5d0..3813079065 100644
--- a/lib/spack/spack/test/git_fetch.py
+++ b/lib/spack/spack/test/git_fetch.py
@@ -50,7 +50,7 @@ class GitFetchTest(MockPackagesTest):
spec = Spec('git-test')
spec.concretize()
- self.pkg = spack.db.get(spec, new=True)
+ self.pkg = spack.repo.get(spec, new=True)
def tearDown(self):
diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py
index f8c6571bda..ee8327aec8 100644
--- a/lib/spack/spack/test/hg_fetch.py
+++ b/lib/spack/spack/test/hg_fetch.py
@@ -47,7 +47,7 @@ class HgFetchTest(MockPackagesTest):
spec = Spec('hg-test')
spec.concretize()
- self.pkg = spack.db.get(spec, new=True)
+ self.pkg = spack.repo.get(spec, new=True)
def tearDown(self):
diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py
index 1ef4171fb2..628329a423 100644
--- a/lib/spack/spack/test/install.py
+++ b/lib/spack/spack/test/install.py
@@ -78,7 +78,7 @@ class InstallTest(MockPackagesTest):
self.assertTrue(spec.concrete)
# Get the package
- pkg = spack.db.get(spec)
+ pkg = spack.repo.get(spec)
# Fake the URL for the package so it downloads from a file.
pkg.fetcher = URLFetchStrategy(self.repo.url)
diff --git a/lib/spack/spack/test/mirror.py b/lib/spack/spack/test/mirror.py
index 189a85fb1a..04e9e3db2e 100644
--- a/lib/spack/spack/test/mirror.py
+++ b/lib/spack/spack/test/mirror.py
@@ -55,7 +55,7 @@ class MirrorTest(MockPackagesTest):
spec.concretize()
# Get the package and fix its fetch args to point to a mock repo
- pkg = spack.db.get(spec)
+ pkg = spack.repo.get(spec)
repo = MockRepoClass()
self.repos[name] = repo
diff --git a/lib/spack/spack/test/mock_packages_test.py b/lib/spack/spack/test/mock_packages_test.py
index e4e1b21b53..d000271960 100644
--- a/lib/spack/spack/test/mock_packages_test.py
+++ b/lib/spack/spack/test/mock_packages_test.py
@@ -22,43 +22,64 @@
# 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 unittest
import spack
import spack.config
-from spack.packages import PackageDB
+from spack.repository import RepoPath
from spack.spec import Spec
-def set_pkg_dep(pkg, spec):
- """Alters dependence information for a package.
- Use this to mock up constraints.
- """
- spec = Spec(spec)
- spack.db.get(pkg).dependencies[spec.name] = { Spec(pkg) : spec }
-
-
class MockPackagesTest(unittest.TestCase):
def initmock(self):
# Use the mock packages database for these tests. This allows
# us to set up contrived packages that don't interfere with
# real ones.
- self.real_db = spack.db
- spack.db = PackageDB(spack.mock_packages_path)
+ self.db = RepoPath(spack.mock_packages_path)
+ spack.repo.swap(self.db)
spack.config.clear_config_caches()
self.real_scopes = spack.config.config_scopes
+ self.real_valid_scopes = spack.config.valid_scopes
spack.config.config_scopes = [
- ('site', spack.mock_site_config),
- ('user', spack.mock_user_config)]
+ spack.config.ConfigScope('site', spack.mock_site_config),
+ spack.config.ConfigScope('user', spack.mock_user_config)]
+
+ # Store changes to the package's dependencies so we can
+ # restore later.
+ self.saved_deps = {}
+
+
+ def set_pkg_dep(self, pkg_name, spec):
+ """Alters dependence information for a package.
+
+ Adds a dependency on <spec> to pkg.
+ Use this to mock up constraints.
+ """
+ spec = Spec(spec)
+
+ # Save original dependencies before making any changes.
+ pkg = spack.repo.get(pkg_name)
+ if pkg_name not in self.saved_deps:
+ self.saved_deps[pkg_name] = (pkg, pkg.dependencies.copy())
+
+ # Change dep spec
+ pkg.dependencies[spec.name] = { Spec(pkg_name) : spec }
def cleanmock(self):
"""Restore the real packages path after any test."""
- spack.db = self.real_db
+ spack.repo.swap(self.db)
spack.config.config_scopes = self.real_scopes
+ spack.config.valid_scopes = self.real_valid_scopes
spack.config.clear_config_caches()
+ # Restore dependency changes that happened during the test
+ for pkg_name, (pkg, deps) in self.saved_deps.items():
+ pkg.dependencies.clear()
+ pkg.dependencies.update(deps)
+
def setUp(self):
self.initmock()
@@ -66,5 +87,3 @@ class MockPackagesTest(unittest.TestCase):
def tearDown(self):
self.cleanmock()
-
-
diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py
index d8d61d14c8..7bf4ff0a0a 100644
--- a/lib/spack/spack/test/multimethod.py
+++ b/lib/spack/spack/test/multimethod.py
@@ -38,92 +38,92 @@ from spack.test.mock_packages_test import *
class MultiMethodTest(MockPackagesTest):
def test_no_version_match(self):
- pkg = spack.db.get('multimethod@2.0')
+ pkg = spack.repo.get('multimethod@2.0')
self.assertRaises(NoSuchMethodError, pkg.no_version_2)
def test_one_version_match(self):
- pkg = spack.db.get('multimethod@1.0')
+ pkg = spack.repo.get('multimethod@1.0')
self.assertEqual(pkg.no_version_2(), 1)
- pkg = spack.db.get('multimethod@3.0')
+ pkg = spack.repo.get('multimethod@3.0')
self.assertEqual(pkg.no_version_2(), 3)
- pkg = spack.db.get('multimethod@4.0')
+ pkg = spack.repo.get('multimethod@4.0')
self.assertEqual(pkg.no_version_2(), 4)
def test_version_overlap(self):
- pkg = spack.db.get('multimethod@2.0')
+ pkg = spack.repo.get('multimethod@2.0')
self.assertEqual(pkg.version_overlap(), 1)
- pkg = spack.db.get('multimethod@5.0')
+ pkg = spack.repo.get('multimethod@5.0')
self.assertEqual(pkg.version_overlap(), 2)
def test_mpi_version(self):
- pkg = spack.db.get('multimethod^mpich@3.0.4')
+ pkg = spack.repo.get('multimethod^mpich@3.0.4')
self.assertEqual(pkg.mpi_version(), 3)
- pkg = spack.db.get('multimethod^mpich2@1.2')
+ pkg = spack.repo.get('multimethod^mpich2@1.2')
self.assertEqual(pkg.mpi_version(), 2)
- pkg = spack.db.get('multimethod^mpich@1.0')
+ pkg = spack.repo.get('multimethod^mpich@1.0')
self.assertEqual(pkg.mpi_version(), 1)
def test_undefined_mpi_version(self):
- pkg = spack.db.get('multimethod^mpich@0.4')
+ pkg = spack.repo.get('multimethod^mpich@0.4')
self.assertEqual(pkg.mpi_version(), 1)
- pkg = spack.db.get('multimethod^mpich@1.4')
+ pkg = spack.repo.get('multimethod^mpich@1.4')
self.assertEqual(pkg.mpi_version(), 1)
def test_default_works(self):
- pkg = spack.db.get('multimethod%gcc')
+ pkg = spack.repo.get('multimethod%gcc')
self.assertEqual(pkg.has_a_default(), 'gcc')
- pkg = spack.db.get('multimethod%intel')
+ pkg = spack.repo.get('multimethod%intel')
self.assertEqual(pkg.has_a_default(), 'intel')
- pkg = spack.db.get('multimethod%pgi')
+ pkg = spack.repo.get('multimethod%pgi')
self.assertEqual(pkg.has_a_default(), 'default')
def test_architecture_match(self):
- pkg = spack.db.get('multimethod=x86_64')
+ pkg = spack.repo.get('multimethod=x86_64')
self.assertEqual(pkg.different_by_architecture(), 'x86_64')
- pkg = spack.db.get('multimethod=ppc64')
+ pkg = spack.repo.get('multimethod=ppc64')
self.assertEqual(pkg.different_by_architecture(), 'ppc64')
- pkg = spack.db.get('multimethod=ppc32')
+ pkg = spack.repo.get('multimethod=ppc32')
self.assertEqual(pkg.different_by_architecture(), 'ppc32')
- pkg = spack.db.get('multimethod=arm64')
+ pkg = spack.repo.get('multimethod=arm64')
self.assertEqual(pkg.different_by_architecture(), 'arm64')
- pkg = spack.db.get('multimethod=macos')
+ pkg = spack.repo.get('multimethod=macos')
self.assertRaises(NoSuchMethodError, pkg.different_by_architecture)
def test_dependency_match(self):
- pkg = spack.db.get('multimethod^zmpi')
+ pkg = spack.repo.get('multimethod^zmpi')
self.assertEqual(pkg.different_by_dep(), 'zmpi')
- pkg = spack.db.get('multimethod^mpich')
+ pkg = spack.repo.get('multimethod^mpich')
self.assertEqual(pkg.different_by_dep(), 'mpich')
# If we try to switch on some entirely different dep, it's ambiguous,
# but should take the first option
- pkg = spack.db.get('multimethod^foobar')
+ pkg = spack.repo.get('multimethod^foobar')
self.assertEqual(pkg.different_by_dep(), 'mpich')
def test_virtual_dep_match(self):
- pkg = spack.db.get('multimethod^mpich2')
+ pkg = spack.repo.get('multimethod^mpich2')
self.assertEqual(pkg.different_by_virtual_dep(), 2)
- pkg = spack.db.get('multimethod^mpich@1.0')
+ pkg = spack.repo.get('multimethod^mpich@1.0')
self.assertEqual(pkg.different_by_virtual_dep(), 1)
diff --git a/lib/spack/spack/test/namespace_trie.py b/lib/spack/spack/test/namespace_trie.py
new file mode 100644
index 0000000000..d0d809004d
--- /dev/null
+++ b/lib/spack/spack/test/namespace_trie.py
@@ -0,0 +1,114 @@
+##############################################################################
+# 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://llnl.github.io/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License (as published by
+# the Free Software Foundation) version 2.1 dated February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+import unittest
+from spack.util.naming import NamespaceTrie
+
+
+class NamespaceTrieTest(unittest.TestCase):
+
+ def setUp(self):
+ self.trie = NamespaceTrie()
+
+
+ def test_add_single(self):
+ self.trie['foo'] = 'bar'
+
+ self.assertTrue(self.trie.is_prefix('foo'))
+ self.assertTrue(self.trie.has_value('foo'))
+ self.assertEqual(self.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'))
+
+ self.assertTrue(self.trie.is_prefix('foo.bar'))
+ self.assertTrue(self.trie.has_value('foo.bar'))
+ self.assertEqual(self.trie['foo.bar'], 'baz')
+
+ self.assertFalse(self.trie.is_prefix('foo.bar.baz'))
+ self.assertFalse(self.trie.has_value('foo.bar.baz'))
+
+
+ def test_add_three(self):
+ # add a three-level namespace
+ self.trie['foo.bar.baz'] = 'quux'
+
+ 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'))
+
+ 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')
+
+ self.assertFalse(self.trie.is_prefix('foo.bar.baz.quux'))
+ self.assertFalse(self.trie.has_value('foo.bar.baz.quux'))
+
+ # Try to add a second element in a prefix namespace
+ self.trie['foo.bar'] = 'blah'
+
+ self.assertTrue(self.trie.is_prefix('foo'))
+ self.assertFalse(self.trie.has_value('foo'))
+
+ self.assertTrue(self.trie.is_prefix('foo.bar'))
+ self.assertTrue(self.trie.has_value('foo.bar'))
+ self.assertEqual(self.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')
+
+ self.assertFalse(self.trie.is_prefix('foo.bar.baz.quux'))
+ self.assertFalse(self.trie.has_value('foo.bar.baz.quux'))
+
+
+ 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)
+
+ self.assertFalse(self.trie.is_prefix('foo.bar'))
+ self.assertFalse(self.trie.has_value('foo.bar'))
+
+
+
+ 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'))
+
+ self.assertTrue(self.trie.is_prefix('foo.bar'))
+ self.assertTrue(self.trie.has_value('foo.bar'))
+ self.assertEqual(self.trie['foo.bar'], None)
+
+ self.assertFalse(self.trie.is_prefix('foo.bar.baz'))
+ self.assertFalse(self.trie.has_value('foo.bar.baz'))
diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py
index 370cf676ef..0b075d135d 100644
--- a/lib/spack/spack/test/package_sanity.py
+++ b/lib/spack/spack/test/package_sanity.py
@@ -28,16 +28,15 @@ This test does sanity checks on Spack's builtin package database.
import unittest
import spack
-import spack.url as url
-from spack.packages import PackageDB
+from spack.repository import RepoPath
class PackageSanityTest(unittest.TestCase):
def check_db(self):
"""Get all packages in a DB to make sure they work."""
- for name in spack.db.all_package_names():
- spack.db.get(name)
+ for name in spack.repo.all_package_names():
+ spack.repo.get(name)
def test_get_all_packages(self):
@@ -45,17 +44,17 @@ class PackageSanityTest(unittest.TestCase):
self.check_db()
- def test_get_all_mock_packages(self):
+ def ztest_get_all_mock_packages(self):
"""Get the mock packages once each too."""
- tmp = spack.db
- spack.db = PackageDB(spack.mock_packages_path)
+ db = RepoPath(spack.mock_packages_path)
+ spack.repo.swap(db)
self.check_db()
- spack.db = tmp
+ spack.repo.swap(db)
- def test_url_versions(self):
+ def ztest_url_versions(self):
"""Check URLs for regular packages, if they are explicitly defined."""
- for pkg in spack.db.all_packages():
+ 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.
diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py
index b2daea7b7b..83984dc5f6 100644
--- a/lib/spack/spack/test/packages.py
+++ b/lib/spack/spack/test/packages.py
@@ -27,7 +27,7 @@ import unittest
from llnl.util.filesystem import join_path
import spack
-import spack.packages as packages
+from spack.repository import Repo
from spack.util.naming import mod_to_class
from spack.test.mock_packages_test import *
@@ -35,27 +35,32 @@ from spack.test.mock_packages_test import *
class PackagesTest(MockPackagesTest):
def test_load_package(self):
- pkg = spack.db.get('mpich')
+ pkg = spack.repo.get('mpich')
def test_package_name(self):
- pkg = spack.db.get('mpich')
+ pkg = spack.repo.get('mpich')
self.assertEqual(pkg.name, 'mpich')
def test_package_filename(self):
- filename = spack.db.filename_for_package_name('mpich')
- self.assertEqual(filename, join_path(spack.mock_packages_path, 'mpich', 'package.py'))
+ repo = Repo(spack.mock_packages_path)
+ filename = repo.filename_for_package_name('mpich')
+ self.assertEqual(filename,
+ join_path(spack.mock_packages_path, 'packages', 'mpich', 'package.py'))
def test_package_name(self):
- pkg = spack.db.get('mpich')
+ pkg = spack.repo.get('mpich')
self.assertEqual(pkg.name, 'mpich')
def test_nonexisting_package_filename(self):
- filename = spack.db.filename_for_package_name('some-nonexisting-package')
- self.assertEqual(filename, join_path(spack.mock_packages_path, 'some-nonexisting-package', 'package.py'))
+ repo = Repo(spack.mock_packages_path)
+ filename = repo.filename_for_package_name('some-nonexisting-package')
+ self.assertEqual(
+ filename,
+ join_path(spack.mock_packages_path, 'packages', 'some-nonexisting-package', 'package.py'))
def test_package_class_names(self):
@@ -64,3 +69,38 @@ class PackagesTest(MockPackagesTest):
self.assertEqual('PmgrCollective', mod_to_class('pmgr-collective'))
self.assertEqual('Pmgrcollective', mod_to_class('PmgrCollective'))
self.assertEqual('_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
+
+
+ def test_import_package_as(self):
+ import spack.pkg.builtin.mock.mpich as mp
+
+
+ def test_import_class_from_package(self):
+ from spack.pkg.builtin.mock.mpich import Mpich
+
+
+ def test_import_module_from_package(self):
+ from spack.pkg.builtin.mock import mpich
+
+
+ def test_import_namespace_container_modules(self):
+ import spack.pkg
+ import spack.pkg as p
+ from spack import pkg
+
+ import spack.pkg.builtin
+ import spack.pkg.builtin as b
+ from spack.pkg import builtin
+
+ import spack.pkg.builtin.mock
+ import spack.pkg.builtin.mock as m
+ from spack.pkg.builtin import mock
diff --git a/lib/spack/spack/test/python_version.py b/lib/spack/spack/test/python_version.py
index 2ea5febb11..d74d3b9b7d 100644
--- a/lib/spack/spack/test/python_version.py
+++ b/lib/spack/spack/test/python_version.py
@@ -54,8 +54,8 @@ class PythonVersionTest(unittest.TestCase):
def package_py_files(self):
- for name in spack.db.all_package_names():
- yield spack.db.filename_for_package_name(name)
+ for name in spack.repo.all_package_names():
+ yield spack.repo.filename_for_package_name(name)
def check_python_versions(self, *files):
diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py
index d3a4d77b32..632f777cde 100644
--- a/lib/spack/spack/test/spec_dag.py
+++ b/lib/spack/spack/test/spec_dag.py
@@ -40,8 +40,8 @@ from spack.test.mock_packages_test import *
class SpecDagTest(MockPackagesTest):
def test_conflicting_package_constraints(self):
- set_pkg_dep('mpileaks', 'mpich@1.0')
- set_pkg_dep('callpath', 'mpich@2.0')
+ self.set_pkg_dep('mpileaks', 'mpich@1.0')
+ self.set_pkg_dep('callpath', 'mpich@2.0')
spec = Spec('mpileaks ^mpich ^callpath ^dyninst ^libelf ^libdwarf')
@@ -223,25 +223,25 @@ class SpecDagTest(MockPackagesTest):
def test_unsatisfiable_version(self):
- set_pkg_dep('mpileaks', 'mpich@1.0')
+ self.set_pkg_dep('mpileaks', 'mpich@1.0')
spec = Spec('mpileaks ^mpich@2.0 ^callpath ^dyninst ^libelf ^libdwarf')
self.assertRaises(spack.spec.UnsatisfiableVersionSpecError, spec.normalize)
def test_unsatisfiable_compiler(self):
- set_pkg_dep('mpileaks', 'mpich%gcc')
+ self.set_pkg_dep('mpileaks', 'mpich%gcc')
spec = Spec('mpileaks ^mpich%intel ^callpath ^dyninst ^libelf ^libdwarf')
self.assertRaises(spack.spec.UnsatisfiableCompilerSpecError, spec.normalize)
def test_unsatisfiable_compiler_version(self):
- set_pkg_dep('mpileaks', 'mpich%gcc@4.6')
+ self.set_pkg_dep('mpileaks', 'mpich%gcc@4.6')
spec = Spec('mpileaks ^mpich%gcc@4.5 ^callpath ^dyninst ^libelf ^libdwarf')
self.assertRaises(spack.spec.UnsatisfiableCompilerSpecError, spec.normalize)
def test_unsatisfiable_architecture(self):
- set_pkg_dep('mpileaks', 'mpich=bgqos_0')
+ self.set_pkg_dep('mpileaks', 'mpich=bgqos_0')
spec = Spec('mpileaks ^mpich=sles_10_ppc64 ^callpath ^dyninst ^libelf ^libdwarf')
self.assertRaises(spack.spec.UnsatisfiableArchitectureSpecError, spec.normalize)
diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py
index 1381556aad..44a09cbd7f 100644
--- a/lib/spack/spack/test/spec_semantics.py
+++ b/lib/spack/spack/test/spec_semantics.py
@@ -35,7 +35,10 @@ class SpecSematicsTest(MockPackagesTest):
# ================================================================================
def check_satisfies(self, spec, anon_spec, concrete=False):
left = Spec(spec, concrete=concrete)
- right = parse_anonymous_spec(anon_spec, left.name)
+ try:
+ right = Spec(anon_spec) # if it's not anonymous, allow it.
+ except:
+ right = parse_anonymous_spec(anon_spec, left.name)
# Satisfies is one-directional.
self.assertTrue(left.satisfies(right))
@@ -48,7 +51,10 @@ class SpecSematicsTest(MockPackagesTest):
def check_unsatisfiable(self, spec, anon_spec, concrete=False):
left = Spec(spec, concrete=concrete)
- right = parse_anonymous_spec(anon_spec, left.name)
+ try:
+ right = Spec(anon_spec) # if it's not anonymous, allow it.
+ except:
+ right = parse_anonymous_spec(anon_spec, left.name)
self.assertFalse(left.satisfies(right))
self.assertFalse(left.satisfies(anon_spec))
@@ -88,6 +94,28 @@ class SpecSematicsTest(MockPackagesTest):
self.check_satisfies('libdwarf^libelf@0.8.13', '^libelf@0:1')
+ def test_satisfies_namespace(self):
+ self.check_satisfies('builtin.mpich', 'mpich')
+ self.check_satisfies('builtin.mock.mpich', 'mpich')
+
+ # TODO: only works for deps now, but shouldn't we allow this for root spec?
+ # self.check_satisfies('builtin.mock.mpich', 'mpi')
+
+ self.check_satisfies('builtin.mock.mpich', 'builtin.mock.mpich')
+
+ self.check_unsatisfiable('builtin.mock.mpich', 'builtin.mpich')
+
+
+ def test_satisfies_namespaced_dep(self):
+ """Ensure spec from same or unspecified namespace satisfies namespace constraint."""
+ self.check_satisfies('mpileaks ^builtin.mock.mpich', '^mpich')
+
+ self.check_satisfies('mpileaks ^builtin.mock.mpich', '^mpi')
+ self.check_satisfies('mpileaks ^builtin.mock.mpich', '^builtin.mock.mpich')
+
+ self.check_unsatisfiable('mpileaks ^builtin.mock.mpich', '^builtin.mpich')
+
+
def test_satisfies_compiler(self):
self.check_satisfies('foo%gcc', '%gcc')
self.check_satisfies('foo%intel', '%intel')
diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py
index 9229af76d4..2ee4748fdb 100644
--- a/lib/spack/spack/test/svn_fetch.py
+++ b/lib/spack/spack/test/svn_fetch.py
@@ -49,7 +49,7 @@ class SvnFetchTest(MockPackagesTest):
spec = Spec('svn-test')
spec.concretize()
- self.pkg = spack.db.get(spec, new=True)
+ self.pkg = spack.repo.get(spec, new=True)
def tearDown(self):
diff --git a/lib/spack/spack/test/unit_install.py b/lib/spack/spack/test/unit_install.py
index 41c76a6dfa..24ffc7bb8f 100644
--- a/lib/spack/spack/test/unit_install.py
+++ b/lib/spack/spack/test/unit_install.py
@@ -26,16 +26,16 @@ import unittest
import itertools
import spack
-test_install = __import__("spack.cmd.test-install",
+test_install = __import__("spack.cmd.test-install",
fromlist=["BuildId", "create_test_output", "TestResult"])
class MockOutput(object):
def __init__(self):
self.results = {}
-
+
def add_test(self, buildId, passed=True, buildInfo=None):
self.results[buildId] = passed
-
+
def write_to(self, stream):
pass
@@ -45,14 +45,14 @@ class MockSpec(object):
self.name = name
self.version = version
self.hash = hashStr if hashStr else hash((name, version))
-
+
def traverse(self, order=None):
- allDeps = itertools.chain.from_iterable(i.traverse() for i in
+ allDeps = itertools.chain.from_iterable(i.traverse() for i in
self.dependencies.itervalues())
return set(itertools.chain([self], allDeps))
-
+
def dag_hash(self):
- return self.hash
+ return self.hash
def to_yaml(self):
return "<<<MOCK YAML {0}>>>".format(test_install.BuildId(self).stringId())
@@ -75,47 +75,52 @@ class UnitInstallTest(unittest.TestCase):
def setUp(self):
super(UnitInstallTest, self).setUp()
-
+
pkgX.installed = False
pkgY.installed = False
+ self.saved_db = spack.repo
pkgDb = MockPackageDb({specX:pkgX, specY:pkgY})
- spack.db = pkgDb
+ spack.repo = pkgDb
+
def tearDown(self):
super(UnitInstallTest, self).tearDown()
-
+
+ spack.repo = self.saved_db
+
def test_installing_both(self):
mo = MockOutput()
-
+
pkgX.installed = True
pkgY.installed = True
test_install.create_test_output(specX, [specX, specY], mo, getLogFunc=test_fetch_log)
-
- self.assertEqual(mo.results,
- {bIdX:test_install.TestResult.PASSED,
+
+ self.assertEqual(mo.results,
+ {bIdX:test_install.TestResult.PASSED,
bIdY:test_install.TestResult.PASSED})
+
def test_dependency_already_installed(self):
mo = MockOutput()
-
+
pkgX.installed = True
pkgY.installed = True
test_install.create_test_output(specX, [specX], mo, getLogFunc=test_fetch_log)
-
+
self.assertEqual(mo.results, {bIdX:test_install.TestResult.PASSED})
#TODO: add test(s) where Y fails to install
+
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 test_fetch_log(path):
return []
-
diff --git a/lib/spack/spack/test/url_substitution.py b/lib/spack/spack/test/url_substitution.py
index 8b90ee086a..aec8baf4ea 100644
--- a/lib/spack/spack/test/url_substitution.py
+++ b/lib/spack/spack/test/url_substitution.py
@@ -29,7 +29,6 @@ import unittest
import spack
import spack.url as url
-from spack.packages import PackageDB
class PackageSanityTest(unittest.TestCase):
diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py
index 782afbd4bb..26ca86c77f 100644
--- a/lib/spack/spack/util/naming.py
+++ b/lib/spack/spack/util/naming.py
@@ -1,10 +1,15 @@
# Need this because of spack.util.string
from __future__ import absolute_import
import string
+import itertools
import re
+from StringIO import StringIO
import spack
+__all__ = ['mod_to_class', 'spack_module_to_python_module', 'valid_module_name',
+ 'validate_module_name', 'possible_spack_module_names', 'NamespaceTrie']
+
# Valid module names can contain '-' but can't start with it.
_valid_module_re = r'^\w[\w-]*$'
@@ -42,6 +47,33 @@ def mod_to_class(mod_name):
return class_name
+def spack_module_to_python_module(mod_name):
+ """Given a Spack module name, returns the name by which it can be
+ imported in Python.
+ """
+ if re.match(r'[0-9]', mod_name):
+ mod_name = 'num' + mod_name
+
+ return mod_name.replace('-', '_')
+
+
+def possible_spack_module_names(python_mod_name):
+ """Given a Python module name, return a list of all possible spack module
+ names that could correspond to it."""
+ mod_name = re.sub(r'^num(\d)', r'\1', python_mod_name)
+
+ parts = re.split(r'(_)', mod_name)
+ options = [['_', '-']] * mod_name.count('_')
+
+ results = []
+ for subs in itertools.product(*options):
+ s = list(parts)
+ s[1::2] = subs
+ results.append(''.join(s))
+
+ return results
+
+
def valid_module_name(mod_name):
"""Return whether the mod_name is valid for use in Spack."""
return bool(re.match(_valid_module_re, mod_name))
@@ -59,3 +91,97 @@ class InvalidModuleNameError(spack.error.SpackError):
super(InvalidModuleNameError, self).__init__(
"Invalid module name: " + name)
self.name = name
+
+
+class NamespaceTrie(object):
+ class Element(object):
+ def __init__(self, value):
+ self.value = value
+
+
+ def __init__(self, separator='.'):
+ self._subspaces = {}
+ self._value = None
+ self._sep = separator
+
+
+ def __setitem__(self, namespace, value):
+ first, sep, rest = namespace.partition(self._sep)
+
+ if not first:
+ self._value = NamespaceTrie.Element(value)
+ return
+
+ if first not in self._subspaces:
+ self._subspaces[first] = NamespaceTrie()
+
+ self._subspaces[first][rest] = value
+
+
+ def _get_helper(self, namespace, full_name):
+ first, sep, rest = namespace.partition(self._sep)
+ if not first:
+ if not self._value:
+ raise KeyError("Can't find namespace '%s' in trie" % full_name)
+ return self._value.value
+ elif first not in self._subspaces:
+ raise KeyError("Can't find namespace '%s' in trie" % full_name)
+ else:
+ return self._subspaces[first]._get_helper(rest, full_name)
+
+
+ def __getitem__(self, namespace):
+ return self._get_helper(namespace, namespace)
+
+
+ def is_prefix(self, namespace):
+ """True if the namespace has a value, or if it's the prefix of one that does."""
+ first, sep, rest = namespace.partition(self._sep)
+ if not first:
+ return True
+ elif first not in self._subspaces:
+ return False
+ else:
+ return self._subspaces[first].is_prefix(rest)
+
+
+ def is_leaf(self, namespace):
+ """True if this namespace has no children in the trie."""
+ first, sep, rest = namespace.partition(self._sep)
+ if not first:
+ return bool(self._subspaces)
+ elif first not in self._subspaces:
+ return False
+ else:
+ return self._subspaces[first].is_leaf(rest)
+
+
+ def has_value(self, namespace):
+ """True if there is a value set for the given namespace."""
+ first, sep, rest = namespace.partition(self._sep)
+ if not first:
+ return self._value is not None
+ elif first not in self._subspaces:
+ return False
+ else:
+ return self._subspaces[first].has_value(rest)
+
+
+ def __contains__(self, namespace):
+ """Returns whether a value has been set for the namespace."""
+ return self.has_value(namespace)
+
+
+ def _str_helper(self, stream, level=0):
+ indent = (level * ' ')
+ for name in sorted(self._subspaces):
+ stream.write(indent + name + '\n')
+ if self._value:
+ stream.write(indent + ' ' + repr(self._value.value))
+ stream.write(self._subspaces[name]._str_helper(stream, level+1))
+
+
+ def __str__(self):
+ stream = StringIO()
+ self._str_helper(stream)
+ return stream.getvalue()
diff --git a/var/spack/mock_packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py
index fa63c08df0..fa63c08df0 100644
--- a/var/spack/mock_packages/a/package.py
+++ b/var/spack/repos/builtin.mock/packages/a/package.py
diff --git a/var/spack/mock_packages/b/package.py b/var/spack/repos/builtin.mock/packages/b/package.py
index cb88aa2157..cb88aa2157 100644
--- a/var/spack/mock_packages/b/package.py
+++ b/var/spack/repos/builtin.mock/packages/b/package.py
diff --git a/var/spack/mock_packages/c/package.py b/var/spack/repos/builtin.mock/packages/c/package.py
index f51b913fa9..f51b913fa9 100644
--- a/var/spack/mock_packages/c/package.py
+++ b/var/spack/repos/builtin.mock/packages/c/package.py
diff --git a/var/spack/mock_packages/callpath/package.py b/var/spack/repos/builtin.mock/packages/callpath/package.py
index abc576f78f..abc576f78f 100644
--- a/var/spack/mock_packages/callpath/package.py
+++ b/var/spack/repos/builtin.mock/packages/callpath/package.py
diff --git a/var/spack/mock_packages/direct_mpich/package.py b/var/spack/repos/builtin.mock/packages/direct_mpich/package.py
index efe7fc2afc..efe7fc2afc 100644
--- a/var/spack/mock_packages/direct_mpich/package.py
+++ b/var/spack/repos/builtin.mock/packages/direct_mpich/package.py
diff --git a/var/spack/mock_packages/dyninst/package.py b/var/spack/repos/builtin.mock/packages/dyninst/package.py
index ea57950865..ea57950865 100644
--- a/var/spack/mock_packages/dyninst/package.py
+++ b/var/spack/repos/builtin.mock/packages/dyninst/package.py
diff --git a/var/spack/mock_packages/e/package.py b/var/spack/repos/builtin.mock/packages/e/package.py
index 76c6b64c7f..76c6b64c7f 100644
--- a/var/spack/mock_packages/e/package.py
+++ b/var/spack/repos/builtin.mock/packages/e/package.py
diff --git a/var/spack/mock_packages/fake/package.py b/var/spack/repos/builtin.mock/packages/fake/package.py
index 5f81ef20fc..5f81ef20fc 100644
--- a/var/spack/mock_packages/fake/package.py
+++ b/var/spack/repos/builtin.mock/packages/fake/package.py
diff --git a/var/spack/mock_packages/git-test/package.py b/var/spack/repos/builtin.mock/packages/git-test/package.py
index 689185463c..689185463c 100644
--- a/var/spack/mock_packages/git-test/package.py
+++ b/var/spack/repos/builtin.mock/packages/git-test/package.py
diff --git a/var/spack/mock_packages/hg-test/package.py b/var/spack/repos/builtin.mock/packages/hg-test/package.py
index 462f1e4c3a..462f1e4c3a 100644
--- a/var/spack/mock_packages/hg-test/package.py
+++ b/var/spack/repos/builtin.mock/packages/hg-test/package.py
diff --git a/var/spack/mock_packages/indirect_mpich/package.py b/var/spack/repos/builtin.mock/packages/indirect_mpich/package.py
index 0b1773a27b..0b1773a27b 100644
--- a/var/spack/mock_packages/indirect_mpich/package.py
+++ b/var/spack/repos/builtin.mock/packages/indirect_mpich/package.py
diff --git a/var/spack/mock_packages/libdwarf/package.py b/var/spack/repos/builtin.mock/packages/libdwarf/package.py
index e486a5de03..e486a5de03 100644
--- a/var/spack/mock_packages/libdwarf/package.py
+++ b/var/spack/repos/builtin.mock/packages/libdwarf/package.py
diff --git a/var/spack/mock_packages/libelf/package.py b/var/spack/repos/builtin.mock/packages/libelf/package.py
index 5e5b0b7143..5e5b0b7143 100644
--- a/var/spack/mock_packages/libelf/package.py
+++ b/var/spack/repos/builtin.mock/packages/libelf/package.py
diff --git a/var/spack/mock_packages/mpich/package.py b/var/spack/repos/builtin.mock/packages/mpich/package.py
index 55bf97f2cf..55bf97f2cf 100644
--- a/var/spack/mock_packages/mpich/package.py
+++ b/var/spack/repos/builtin.mock/packages/mpich/package.py
diff --git a/var/spack/mock_packages/mpich2/package.py b/var/spack/repos/builtin.mock/packages/mpich2/package.py
index 90f969b898..90f969b898 100644
--- a/var/spack/mock_packages/mpich2/package.py
+++ b/var/spack/repos/builtin.mock/packages/mpich2/package.py
diff --git a/var/spack/mock_packages/mpileaks/package.py b/var/spack/repos/builtin.mock/packages/mpileaks/package.py
index 9a18c5e1f2..9a18c5e1f2 100644
--- a/var/spack/mock_packages/mpileaks/package.py
+++ b/var/spack/repos/builtin.mock/packages/mpileaks/package.py
diff --git a/var/spack/mock_packages/multimethod/package.py b/var/spack/repos/builtin.mock/packages/multimethod/package.py
index ea103fe175..ea103fe175 100644
--- a/var/spack/mock_packages/multimethod/package.py
+++ b/var/spack/repos/builtin.mock/packages/multimethod/package.py
diff --git a/var/spack/mock_packages/netlib-blas/package.py b/var/spack/repos/builtin.mock/packages/netlib-blas/package.py
index 39f2c92ae5..39f2c92ae5 100644
--- a/var/spack/mock_packages/netlib-blas/package.py
+++ b/var/spack/repos/builtin.mock/packages/netlib-blas/package.py
diff --git a/var/spack/mock_packages/netlib-lapack/package.py b/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py
index 331844e544..331844e544 100644
--- a/var/spack/mock_packages/netlib-lapack/package.py
+++ b/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py
diff --git a/var/spack/mock_packages/openblas/package.py b/var/spack/repos/builtin.mock/packages/openblas/package.py
index c7771b92a3..c7771b92a3 100644
--- a/var/spack/mock_packages/openblas/package.py
+++ b/var/spack/repos/builtin.mock/packages/openblas/package.py
diff --git a/var/spack/mock_packages/optional-dep-test-2/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py
index ef0587588e..ef0587588e 100644
--- a/var/spack/mock_packages/optional-dep-test-2/package.py
+++ b/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py
diff --git a/var/spack/mock_packages/optional-dep-test-3/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py
index e6cb3bd6e7..e6cb3bd6e7 100644
--- a/var/spack/mock_packages/optional-dep-test-3/package.py
+++ b/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py
diff --git a/var/spack/mock_packages/optional-dep-test/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py
index bb57576ca9..bb57576ca9 100644
--- a/var/spack/mock_packages/optional-dep-test/package.py
+++ b/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py
diff --git a/var/spack/mock_packages/svn-test/package.py b/var/spack/repos/builtin.mock/packages/svn-test/package.py
index ba4d5522b4..ba4d5522b4 100644
--- a/var/spack/mock_packages/svn-test/package.py
+++ b/var/spack/repos/builtin.mock/packages/svn-test/package.py
diff --git a/var/spack/mock_packages/trivial_install_test_package/package.py b/var/spack/repos/builtin.mock/packages/trivial_install_test_package/package.py
index fec5849e67..fec5849e67 100644
--- a/var/spack/mock_packages/trivial_install_test_package/package.py
+++ b/var/spack/repos/builtin.mock/packages/trivial_install_test_package/package.py
diff --git a/var/spack/mock_packages/zmpi/package.py b/var/spack/repos/builtin.mock/packages/zmpi/package.py
index 201fac2fbf..201fac2fbf 100644
--- a/var/spack/mock_packages/zmpi/package.py
+++ b/var/spack/repos/builtin.mock/packages/zmpi/package.py
diff --git a/var/spack/repos/builtin.mock/repo.yaml b/var/spack/repos/builtin.mock/repo.yaml
new file mode 100644
index 0000000000..30b068da13
--- /dev/null
+++ b/var/spack/repos/builtin.mock/repo.yaml
@@ -0,0 +1,2 @@
+repo:
+ namespace: builtin.mock
diff --git a/var/spack/packages/ImageMagick/package.py b/var/spack/repos/builtin/packages/ImageMagick/package.py
index 753ea80ca6..753ea80ca6 100644
--- a/var/spack/packages/ImageMagick/package.py
+++ b/var/spack/repos/builtin/packages/ImageMagick/package.py
diff --git a/var/spack/packages/Mitos/package.py b/var/spack/repos/builtin/packages/Mitos/package.py
index ea131872dd..ea131872dd 100644
--- a/var/spack/packages/Mitos/package.py
+++ b/var/spack/repos/builtin/packages/Mitos/package.py
diff --git a/var/spack/packages/R/package.py b/var/spack/repos/builtin/packages/R/package.py
index 2e6f65a742..2e6f65a742 100644
--- a/var/spack/packages/R/package.py
+++ b/var/spack/repos/builtin/packages/R/package.py
diff --git a/var/spack/packages/SAMRAI/no-tool-build.patch b/var/spack/repos/builtin/packages/SAMRAI/no-tool-build.patch
index 1adf0cf721..1adf0cf721 100644
--- a/var/spack/packages/SAMRAI/no-tool-build.patch
+++ b/var/spack/repos/builtin/packages/SAMRAI/no-tool-build.patch
diff --git a/var/spack/packages/SAMRAI/package.py b/var/spack/repos/builtin/packages/SAMRAI/package.py
index 2c3b9180af..2c3b9180af 100644
--- a/var/spack/packages/SAMRAI/package.py
+++ b/var/spack/repos/builtin/packages/SAMRAI/package.py
diff --git a/var/spack/packages/activeharmony/package.py b/var/spack/repos/builtin/packages/activeharmony/package.py
index 45dcc7c0e8..45dcc7c0e8 100644
--- a/var/spack/packages/activeharmony/package.py
+++ b/var/spack/repos/builtin/packages/activeharmony/package.py
diff --git a/var/spack/packages/adept-utils/package.py b/var/spack/repos/builtin/packages/adept-utils/package.py
index fb59576c21..fb59576c21 100644
--- a/var/spack/packages/adept-utils/package.py
+++ b/var/spack/repos/builtin/packages/adept-utils/package.py
diff --git a/var/spack/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py
index 8769d97056..8769d97056 100644
--- a/var/spack/packages/apex/package.py
+++ b/var/spack/repos/builtin/packages/apex/package.py
diff --git a/var/spack/packages/arpack/package.py b/var/spack/repos/builtin/packages/arpack/package.py
index 8c67c536f3..8c67c536f3 100644
--- a/var/spack/packages/arpack/package.py
+++ b/var/spack/repos/builtin/packages/arpack/package.py
diff --git a/var/spack/packages/asciidoc/package.py b/var/spack/repos/builtin/packages/asciidoc/package.py
index 828f3b3f4f..828f3b3f4f 100644
--- a/var/spack/packages/asciidoc/package.py
+++ b/var/spack/repos/builtin/packages/asciidoc/package.py
diff --git a/var/spack/packages/atk/package.py b/var/spack/repos/builtin/packages/atk/package.py
index 769805b227..769805b227 100644
--- a/var/spack/packages/atk/package.py
+++ b/var/spack/repos/builtin/packages/atk/package.py
diff --git a/var/spack/packages/atlas/package.py b/var/spack/repos/builtin/packages/atlas/package.py
index fc683363a7..fc683363a7 100644
--- a/var/spack/packages/atlas/package.py
+++ b/var/spack/repos/builtin/packages/atlas/package.py
diff --git a/var/spack/packages/autoconf/package.py b/var/spack/repos/builtin/packages/autoconf/package.py
index 5189faf054..5189faf054 100644
--- a/var/spack/packages/autoconf/package.py
+++ b/var/spack/repos/builtin/packages/autoconf/package.py
diff --git a/var/spack/packages/automaded/package.py b/var/spack/repos/builtin/packages/automaded/package.py
index e0bc7efb8b..e0bc7efb8b 100644
--- a/var/spack/packages/automaded/package.py
+++ b/var/spack/repos/builtin/packages/automaded/package.py
diff --git a/var/spack/packages/automake/package.py b/var/spack/repos/builtin/packages/automake/package.py
index 9115822730..9115822730 100644
--- a/var/spack/packages/automake/package.py
+++ b/var/spack/repos/builtin/packages/automake/package.py
diff --git a/var/spack/packages/bear/package.py b/var/spack/repos/builtin/packages/bear/package.py
index 0d4436fccc..0d4436fccc 100644
--- a/var/spack/packages/bear/package.py
+++ b/var/spack/repos/builtin/packages/bear/package.py
diff --git a/var/spack/packages/bib2xhtml/package.py b/var/spack/repos/builtin/packages/bib2xhtml/package.py
index 7f8e0cfe5a..7f8e0cfe5a 100644
--- a/var/spack/packages/bib2xhtml/package.py
+++ b/var/spack/repos/builtin/packages/bib2xhtml/package.py
diff --git a/var/spack/packages/binutils/binutilskrell-2.24.patch b/var/spack/repos/builtin/packages/binutils/binutilskrell-2.24.patch
index f48291a6c9..f48291a6c9 100644
--- a/var/spack/packages/binutils/binutilskrell-2.24.patch
+++ b/var/spack/repos/builtin/packages/binutils/binutilskrell-2.24.patch
diff --git a/var/spack/packages/binutils/package.py b/var/spack/repos/builtin/packages/binutils/package.py
index 123f4598f6..123f4598f6 100644
--- a/var/spack/packages/binutils/package.py
+++ b/var/spack/repos/builtin/packages/binutils/package.py
diff --git a/var/spack/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py
index 7c526fb958..7c526fb958 100644
--- a/var/spack/packages/bison/package.py
+++ b/var/spack/repos/builtin/packages/bison/package.py
diff --git a/var/spack/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py
index 81dadbbf61..81dadbbf61 100644
--- a/var/spack/packages/boost/package.py
+++ b/var/spack/repos/builtin/packages/boost/package.py
diff --git a/var/spack/packages/bowtie2/bowtie2-2.5.patch b/var/spack/repos/builtin/packages/bowtie2/bowtie2-2.5.patch
index 290be39c73..290be39c73 100644
--- a/var/spack/packages/bowtie2/bowtie2-2.5.patch
+++ b/var/spack/repos/builtin/packages/bowtie2/bowtie2-2.5.patch
diff --git a/var/spack/packages/bowtie2/package.py b/var/spack/repos/builtin/packages/bowtie2/package.py
index 339aab6598..339aab6598 100644
--- a/var/spack/packages/bowtie2/package.py
+++ b/var/spack/repos/builtin/packages/bowtie2/package.py
diff --git a/var/spack/packages/boxlib/package.py b/var/spack/repos/builtin/packages/boxlib/package.py
index 4f1b71132f..4f1b71132f 100644
--- a/var/spack/packages/boxlib/package.py
+++ b/var/spack/repos/builtin/packages/boxlib/package.py
diff --git a/var/spack/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py
index 638ba1fa4d..638ba1fa4d 100644
--- a/var/spack/packages/bzip2/package.py
+++ b/var/spack/repos/builtin/packages/bzip2/package.py
diff --git a/var/spack/packages/cairo/package.py b/var/spack/repos/builtin/packages/cairo/package.py
index e1ac8aaa7d..e1ac8aaa7d 100644
--- a/var/spack/packages/cairo/package.py
+++ b/var/spack/repos/builtin/packages/cairo/package.py
diff --git a/var/spack/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py
index 3d2d96249e..3d2d96249e 100644
--- a/var/spack/packages/callpath/package.py
+++ b/var/spack/repos/builtin/packages/callpath/package.py
diff --git a/var/spack/packages/cblas/package.py b/var/spack/repos/builtin/packages/cblas/package.py
index 3cfe5ee588..3cfe5ee588 100644
--- a/var/spack/packages/cblas/package.py
+++ b/var/spack/repos/builtin/packages/cblas/package.py
diff --git a/var/spack/packages/cbtf-argonavis/package.py b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
index 7b07933911..7b07933911 100644
--- a/var/spack/packages/cbtf-argonavis/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
diff --git a/var/spack/packages/cbtf-krell/package.py b/var/spack/repos/builtin/packages/cbtf-krell/package.py
index 9458ac113c..9458ac113c 100644
--- a/var/spack/packages/cbtf-krell/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-krell/package.py
diff --git a/var/spack/packages/cbtf-lanl/package.py b/var/spack/repos/builtin/packages/cbtf-lanl/package.py
index 2da9e8a1f7..2da9e8a1f7 100644
--- a/var/spack/packages/cbtf-lanl/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-lanl/package.py
diff --git a/var/spack/packages/cbtf/package.py b/var/spack/repos/builtin/packages/cbtf/package.py
index 52e6a07020..52e6a07020 100644
--- a/var/spack/packages/cbtf/package.py
+++ b/var/spack/repos/builtin/packages/cbtf/package.py
diff --git a/var/spack/packages/cfitsio/package.py b/var/spack/repos/builtin/packages/cfitsio/package.py
index ff450cb5f3..ff450cb5f3 100644
--- a/var/spack/packages/cfitsio/package.py
+++ b/var/spack/repos/builtin/packages/cfitsio/package.py
diff --git a/var/spack/packages/cgm/package.py b/var/spack/repos/builtin/packages/cgm/package.py
index 05d6395c5a..05d6395c5a 100644
--- a/var/spack/packages/cgm/package.py
+++ b/var/spack/repos/builtin/packages/cgm/package.py
diff --git a/var/spack/packages/cityhash/package.py b/var/spack/repos/builtin/packages/cityhash/package.py
index 1643cc3b42..1643cc3b42 100644
--- a/var/spack/packages/cityhash/package.py
+++ b/var/spack/repos/builtin/packages/cityhash/package.py
diff --git a/var/spack/packages/clang/package.py b/var/spack/repos/builtin/packages/clang/package.py
index e46e08d5f1..e46e08d5f1 100644
--- a/var/spack/packages/clang/package.py
+++ b/var/spack/repos/builtin/packages/clang/package.py
diff --git a/var/spack/packages/cleverleaf/package.py b/var/spack/repos/builtin/packages/cleverleaf/package.py
index fb400b25c3..fb400b25c3 100644
--- a/var/spack/packages/cleverleaf/package.py
+++ b/var/spack/repos/builtin/packages/cleverleaf/package.py
diff --git a/var/spack/packages/cloog/package.py b/var/spack/repos/builtin/packages/cloog/package.py
index 814a33c76c..814a33c76c 100644
--- a/var/spack/packages/cloog/package.py
+++ b/var/spack/repos/builtin/packages/cloog/package.py
diff --git a/var/spack/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py
index cb54c92d69..cb54c92d69 100644
--- a/var/spack/packages/cmake/package.py
+++ b/var/spack/repos/builtin/packages/cmake/package.py
diff --git a/var/spack/packages/coreutils/package.py b/var/spack/repos/builtin/packages/coreutils/package.py
index 78c608d8eb..78c608d8eb 100644
--- a/var/spack/packages/coreutils/package.py
+++ b/var/spack/repos/builtin/packages/coreutils/package.py
diff --git a/var/spack/packages/cppcheck/package.py b/var/spack/repos/builtin/packages/cppcheck/package.py
index 8e98f457ee..8e98f457ee 100644
--- a/var/spack/packages/cppcheck/package.py
+++ b/var/spack/repos/builtin/packages/cppcheck/package.py
diff --git a/var/spack/packages/cram/package.py b/var/spack/repos/builtin/packages/cram/package.py
index b19422b8a8..b19422b8a8 100644
--- a/var/spack/packages/cram/package.py
+++ b/var/spack/repos/builtin/packages/cram/package.py
diff --git a/var/spack/packages/cscope/package.py b/var/spack/repos/builtin/packages/cscope/package.py
index 9aac0f7304..9aac0f7304 100644
--- a/var/spack/packages/cscope/package.py
+++ b/var/spack/repos/builtin/packages/cscope/package.py
diff --git a/var/spack/packages/cube/package.py b/var/spack/repos/builtin/packages/cube/package.py
index cc1c684594..cc1c684594 100644
--- a/var/spack/packages/cube/package.py
+++ b/var/spack/repos/builtin/packages/cube/package.py
diff --git a/var/spack/packages/curl/package.py b/var/spack/repos/builtin/packages/curl/package.py
index 9e684445c7..9e684445c7 100644
--- a/var/spack/packages/curl/package.py
+++ b/var/spack/repos/builtin/packages/curl/package.py
diff --git a/var/spack/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py
index 0665332179..0665332179 100644
--- a/var/spack/packages/czmq/package.py
+++ b/var/spack/repos/builtin/packages/czmq/package.py
diff --git a/var/spack/packages/damselfly/package.py b/var/spack/repos/builtin/packages/damselfly/package.py
index 96666d1abe..96666d1abe 100644
--- a/var/spack/packages/damselfly/package.py
+++ b/var/spack/repos/builtin/packages/damselfly/package.py
diff --git a/var/spack/packages/dbus/package.py b/var/spack/repos/builtin/packages/dbus/package.py
index 294b0de54e..294b0de54e 100644
--- a/var/spack/packages/dbus/package.py
+++ b/var/spack/repos/builtin/packages/dbus/package.py
diff --git a/var/spack/packages/docbook-xml/package.py b/var/spack/repos/builtin/packages/docbook-xml/package.py
index fce1de7deb..fce1de7deb 100644
--- a/var/spack/packages/docbook-xml/package.py
+++ b/var/spack/repos/builtin/packages/docbook-xml/package.py
diff --git a/var/spack/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py
index 3d4a4e47a7..3d4a4e47a7 100644
--- a/var/spack/packages/doxygen/package.py
+++ b/var/spack/repos/builtin/packages/doxygen/package.py
diff --git a/var/spack/packages/dri2proto/package.py b/var/spack/repos/builtin/packages/dri2proto/package.py
index 11dfa568e2..11dfa568e2 100644
--- a/var/spack/packages/dri2proto/package.py
+++ b/var/spack/repos/builtin/packages/dri2proto/package.py
diff --git a/var/spack/packages/dtcmp/package.py b/var/spack/repos/builtin/packages/dtcmp/package.py
index 9d940583c1..9d940583c1 100644
--- a/var/spack/packages/dtcmp/package.py
+++ b/var/spack/repos/builtin/packages/dtcmp/package.py
diff --git a/var/spack/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py
index 0111dcbe08..0111dcbe08 100644
--- a/var/spack/packages/dyninst/package.py
+++ b/var/spack/repos/builtin/packages/dyninst/package.py
diff --git a/var/spack/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py
index 926d234584..926d234584 100644
--- a/var/spack/packages/elfutils/package.py
+++ b/var/spack/repos/builtin/packages/elfutils/package.py
diff --git a/var/spack/packages/expat/package.py b/var/spack/repos/builtin/packages/expat/package.py
index 082da5bf0b..082da5bf0b 100644
--- a/var/spack/packages/expat/package.py
+++ b/var/spack/repos/builtin/packages/expat/package.py
diff --git a/var/spack/packages/extrae/package.py b/var/spack/repos/builtin/packages/extrae/package.py
index 3ad4cbaf86..3ad4cbaf86 100644
--- a/var/spack/packages/extrae/package.py
+++ b/var/spack/repos/builtin/packages/extrae/package.py
diff --git a/var/spack/packages/exuberant-ctags/package.py b/var/spack/repos/builtin/packages/exuberant-ctags/package.py
index efd2b541b2..efd2b541b2 100644
--- a/var/spack/packages/exuberant-ctags/package.py
+++ b/var/spack/repos/builtin/packages/exuberant-ctags/package.py
diff --git a/var/spack/packages/fftw/package.py b/var/spack/repos/builtin/packages/fftw/package.py
index 5f71762c4f..5f71762c4f 100644
--- a/var/spack/packages/fftw/package.py
+++ b/var/spack/repos/builtin/packages/fftw/package.py
diff --git a/var/spack/packages/fish/package.py b/var/spack/repos/builtin/packages/fish/package.py
index 1225558705..1225558705 100644
--- a/var/spack/packages/fish/package.py
+++ b/var/spack/repos/builtin/packages/fish/package.py
diff --git a/var/spack/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py
index b065904912..b065904912 100644
--- a/var/spack/packages/flex/package.py
+++ b/var/spack/repos/builtin/packages/flex/package.py
diff --git a/var/spack/packages/flux/package.py b/var/spack/repos/builtin/packages/flux/package.py
index dc4e0594c5..dc4e0594c5 100644
--- a/var/spack/packages/flux/package.py
+++ b/var/spack/repos/builtin/packages/flux/package.py
diff --git a/var/spack/packages/fontconfig/package.py b/var/spack/repos/builtin/packages/fontconfig/package.py
index 517c9d1813..517c9d1813 100644
--- a/var/spack/packages/fontconfig/package.py
+++ b/var/spack/repos/builtin/packages/fontconfig/package.py
diff --git a/var/spack/packages/freetype/package.py b/var/spack/repos/builtin/packages/freetype/package.py
index 0309b858a1..0309b858a1 100644
--- a/var/spack/packages/freetype/package.py
+++ b/var/spack/repos/builtin/packages/freetype/package.py
diff --git a/var/spack/packages/gasnet/package.py b/var/spack/repos/builtin/packages/gasnet/package.py
index 705961d1de..705961d1de 100644
--- a/var/spack/packages/gasnet/package.py
+++ b/var/spack/repos/builtin/packages/gasnet/package.py
diff --git a/var/spack/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py
index 7ec160d595..7ec160d595 100644
--- a/var/spack/packages/gcc/package.py
+++ b/var/spack/repos/builtin/packages/gcc/package.py
diff --git a/var/spack/packages/gdb/package.py b/var/spack/repos/builtin/packages/gdb/package.py
index fd567f346b..e5378cfa29 100644
--- a/var/spack/packages/gdb/package.py
+++ b/var/spack/repos/builtin/packages/gdb/package.py
@@ -6,7 +6,7 @@
# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
-# For details, see https://scalability-llnl.github.io/spack
+# For details, see https://llnl.github.io/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
diff --git a/var/spack/packages/gdk-pixbuf/package.py b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py
index 14a5569984..14a5569984 100644
--- a/var/spack/packages/gdk-pixbuf/package.py
+++ b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py
diff --git a/var/spack/packages/geos/package.py b/var/spack/repos/builtin/packages/geos/package.py
index 4a2657e32f..4a2657e32f 100644
--- a/var/spack/packages/geos/package.py
+++ b/var/spack/repos/builtin/packages/geos/package.py
diff --git a/var/spack/packages/gflags/package.py b/var/spack/repos/builtin/packages/gflags/package.py
index 62dd80a094..62dd80a094 100644
--- a/var/spack/packages/gflags/package.py
+++ b/var/spack/repos/builtin/packages/gflags/package.py
diff --git a/var/spack/packages/ghostscript/package.py b/var/spack/repos/builtin/packages/ghostscript/package.py
index 0ab49d425f..0ab49d425f 100644
--- a/var/spack/packages/ghostscript/package.py
+++ b/var/spack/repos/builtin/packages/ghostscript/package.py
diff --git a/var/spack/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py
index 28c7aa8161..28c7aa8161 100644
--- a/var/spack/packages/git/package.py
+++ b/var/spack/repos/builtin/packages/git/package.py
diff --git a/var/spack/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py
index baca1a5a45..baca1a5a45 100644
--- a/var/spack/packages/glib/package.py
+++ b/var/spack/repos/builtin/packages/glib/package.py
diff --git a/var/spack/packages/glm/package.py b/var/spack/repos/builtin/packages/glm/package.py
index d00c301b4c..d00c301b4c 100644
--- a/var/spack/packages/glm/package.py
+++ b/var/spack/repos/builtin/packages/glm/package.py
diff --git a/var/spack/packages/global/package.py b/var/spack/repos/builtin/packages/global/package.py
index e8f06516d9..e8f06516d9 100644
--- a/var/spack/packages/global/package.py
+++ b/var/spack/repos/builtin/packages/global/package.py
diff --git a/var/spack/packages/glog/package.py b/var/spack/repos/builtin/packages/glog/package.py
index d73386b394..d73386b394 100644
--- a/var/spack/packages/glog/package.py
+++ b/var/spack/repos/builtin/packages/glog/package.py
diff --git a/var/spack/packages/gmp/package.py b/var/spack/repos/builtin/packages/gmp/package.py
index fe13de3b95..fe13de3b95 100644
--- a/var/spack/packages/gmp/package.py
+++ b/var/spack/repos/builtin/packages/gmp/package.py
diff --git a/var/spack/packages/gnuplot/package.py b/var/spack/repos/builtin/packages/gnuplot/package.py
index 71c09bd43d..71c09bd43d 100644
--- a/var/spack/packages/gnuplot/package.py
+++ b/var/spack/repos/builtin/packages/gnuplot/package.py
diff --git a/var/spack/packages/gnutls/package.py b/var/spack/repos/builtin/packages/gnutls/package.py
index cf57a24a6d..cf57a24a6d 100644
--- a/var/spack/packages/gnutls/package.py
+++ b/var/spack/repos/builtin/packages/gnutls/package.py
diff --git a/var/spack/packages/gperf/package.py b/var/spack/repos/builtin/packages/gperf/package.py
index 32551b67b4..32551b67b4 100644
--- a/var/spack/packages/gperf/package.py
+++ b/var/spack/repos/builtin/packages/gperf/package.py
diff --git a/var/spack/packages/gperftools/package.py b/var/spack/repos/builtin/packages/gperftools/package.py
index 0ba44c9329..0ba44c9329 100644
--- a/var/spack/packages/gperftools/package.py
+++ b/var/spack/repos/builtin/packages/gperftools/package.py
diff --git a/var/spack/packages/graphlib/package.py b/var/spack/repos/builtin/packages/graphlib/package.py
index ddac0b2b66..ddac0b2b66 100644
--- a/var/spack/packages/graphlib/package.py
+++ b/var/spack/repos/builtin/packages/graphlib/package.py
diff --git a/var/spack/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py
index 7af7da1881..7af7da1881 100644
--- a/var/spack/packages/graphviz/package.py
+++ b/var/spack/repos/builtin/packages/graphviz/package.py
diff --git a/var/spack/packages/gsl/package.py b/var/spack/repos/builtin/packages/gsl/package.py
index 789eb49d85..789eb49d85 100644
--- a/var/spack/packages/gsl/package.py
+++ b/var/spack/repos/builtin/packages/gsl/package.py
diff --git a/var/spack/packages/gtkplus/package.py b/var/spack/repos/builtin/packages/gtkplus/package.py
index 0ebc7100de..0ebc7100de 100644
--- a/var/spack/packages/gtkplus/package.py
+++ b/var/spack/repos/builtin/packages/gtkplus/package.py
diff --git a/var/spack/packages/harfbuzz/package.py b/var/spack/repos/builtin/packages/harfbuzz/package.py
index ed7c42a909..ed7c42a909 100644
--- a/var/spack/packages/harfbuzz/package.py
+++ b/var/spack/repos/builtin/packages/harfbuzz/package.py
diff --git a/var/spack/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py
index adac79d9bb..adac79d9bb 100644
--- a/var/spack/packages/hdf5/package.py
+++ b/var/spack/repos/builtin/packages/hdf5/package.py
diff --git a/var/spack/packages/hwloc/package.py b/var/spack/repos/builtin/packages/hwloc/package.py
index 7ebede76a3..7ebede76a3 100644
--- a/var/spack/packages/hwloc/package.py
+++ b/var/spack/repos/builtin/packages/hwloc/package.py
diff --git a/var/spack/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py
index 0f7f14dd89..0f7f14dd89 100644
--- a/var/spack/packages/hypre/package.py
+++ b/var/spack/repos/builtin/packages/hypre/package.py
diff --git a/var/spack/packages/icu/package.py b/var/spack/repos/builtin/packages/icu/package.py
index f256ec5712..f256ec5712 100644
--- a/var/spack/packages/icu/package.py
+++ b/var/spack/repos/builtin/packages/icu/package.py
diff --git a/var/spack/packages/icu4c/package.py b/var/spack/repos/builtin/packages/icu4c/package.py
index 55b44463b2..55b44463b2 100644
--- a/var/spack/packages/icu4c/package.py
+++ b/var/spack/repos/builtin/packages/icu4c/package.py
diff --git a/var/spack/packages/isl/package.py b/var/spack/repos/builtin/packages/isl/package.py
index 836ef3ea40..836ef3ea40 100644
--- a/var/spack/packages/isl/package.py
+++ b/var/spack/repos/builtin/packages/isl/package.py
diff --git a/var/spack/packages/jdk/package.py b/var/spack/repos/builtin/packages/jdk/package.py
index f8f5fc21bd..f8f5fc21bd 100644
--- a/var/spack/packages/jdk/package.py
+++ b/var/spack/repos/builtin/packages/jdk/package.py
diff --git a/var/spack/packages/jemalloc/package.py b/var/spack/repos/builtin/packages/jemalloc/package.py
index 8cec9ea75b..8cec9ea75b 100644
--- a/var/spack/packages/jemalloc/package.py
+++ b/var/spack/repos/builtin/packages/jemalloc/package.py
diff --git a/var/spack/packages/jpeg/package.py b/var/spack/repos/builtin/packages/jpeg/package.py
index 87820467db..87820467db 100644
--- a/var/spack/packages/jpeg/package.py
+++ b/var/spack/repos/builtin/packages/jpeg/package.py
diff --git a/var/spack/packages/judy/package.py b/var/spack/repos/builtin/packages/judy/package.py
index b8d8701383..b8d8701383 100644
--- a/var/spack/packages/judy/package.py
+++ b/var/spack/repos/builtin/packages/judy/package.py
diff --git a/var/spack/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py
index f97384a249..f97384a249 100644
--- a/var/spack/packages/launchmon/package.py
+++ b/var/spack/repos/builtin/packages/launchmon/package.py
diff --git a/var/spack/packages/launchmon/patch.lmon_install_dir b/var/spack/repos/builtin/packages/launchmon/patch.lmon_install_dir
index 8a1d93fdc9..8a1d93fdc9 100644
--- a/var/spack/packages/launchmon/patch.lmon_install_dir
+++ b/var/spack/repos/builtin/packages/launchmon/patch.lmon_install_dir
diff --git a/var/spack/packages/lcms/package.py b/var/spack/repos/builtin/packages/lcms/package.py
index a53c2f997a..a53c2f997a 100644
--- a/var/spack/packages/lcms/package.py
+++ b/var/spack/repos/builtin/packages/lcms/package.py
diff --git a/var/spack/packages/leveldb/package.py b/var/spack/repos/builtin/packages/leveldb/package.py
index da68a9cbcb..da68a9cbcb 100644
--- a/var/spack/packages/leveldb/package.py
+++ b/var/spack/repos/builtin/packages/leveldb/package.py
diff --git a/var/spack/packages/libNBC/package.py b/var/spack/repos/builtin/packages/libNBC/package.py
index 550568e97d..550568e97d 100644
--- a/var/spack/packages/libNBC/package.py
+++ b/var/spack/repos/builtin/packages/libNBC/package.py
diff --git a/var/spack/packages/libarchive/package.py b/var/spack/repos/builtin/packages/libarchive/package.py
index cbd4b89cd0..cbd4b89cd0 100644
--- a/var/spack/packages/libarchive/package.py
+++ b/var/spack/repos/builtin/packages/libarchive/package.py
diff --git a/var/spack/packages/libcerf/package.py b/var/spack/repos/builtin/packages/libcerf/package.py
index 15e87ce4fe..15e87ce4fe 100644
--- a/var/spack/packages/libcerf/package.py
+++ b/var/spack/repos/builtin/packages/libcerf/package.py
diff --git a/var/spack/packages/libcircle/package.py b/var/spack/repos/builtin/packages/libcircle/package.py
index 3f7c996fb0..3f7c996fb0 100644
--- a/var/spack/packages/libcircle/package.py
+++ b/var/spack/repos/builtin/packages/libcircle/package.py
diff --git a/var/spack/packages/libdrm/package.py b/var/spack/repos/builtin/packages/libdrm/package.py
index 00736b7811..00736b7811 100644
--- a/var/spack/packages/libdrm/package.py
+++ b/var/spack/repos/builtin/packages/libdrm/package.py
diff --git a/var/spack/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py
index addb557519..addb557519 100644
--- a/var/spack/packages/libdwarf/package.py
+++ b/var/spack/repos/builtin/packages/libdwarf/package.py
diff --git a/var/spack/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py
index 29bc21b65c..29bc21b65c 100644
--- a/var/spack/packages/libelf/package.py
+++ b/var/spack/repos/builtin/packages/libelf/package.py
diff --git a/var/spack/packages/libevent/package.py b/var/spack/repos/builtin/packages/libevent/package.py
index 11b1083d67..11b1083d67 100644
--- a/var/spack/packages/libevent/package.py
+++ b/var/spack/repos/builtin/packages/libevent/package.py
diff --git a/var/spack/packages/libffi/package.py b/var/spack/repos/builtin/packages/libffi/package.py
index acec031717..acec031717 100644
--- a/var/spack/packages/libffi/package.py
+++ b/var/spack/repos/builtin/packages/libffi/package.py
diff --git a/var/spack/packages/libgcrypt/package.py b/var/spack/repos/builtin/packages/libgcrypt/package.py
index 1d0a57f317..1d0a57f317 100644
--- a/var/spack/packages/libgcrypt/package.py
+++ b/var/spack/repos/builtin/packages/libgcrypt/package.py
diff --git a/var/spack/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py
index d920957ef1..d920957ef1 100644
--- a/var/spack/packages/libgd/package.py
+++ b/var/spack/repos/builtin/packages/libgd/package.py
diff --git a/var/spack/packages/libgpg-error/package.py b/var/spack/repos/builtin/packages/libgpg-error/package.py
index 6c1d1a10a7..6c1d1a10a7 100644
--- a/var/spack/packages/libgpg-error/package.py
+++ b/var/spack/repos/builtin/packages/libgpg-error/package.py
diff --git a/var/spack/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
index 07ee183947..07ee183947 100644
--- a/var/spack/packages/libjpeg-turbo/package.py
+++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
diff --git a/var/spack/packages/libjson-c/package.py b/var/spack/repos/builtin/packages/libjson-c/package.py
index c0801cce9c..c0801cce9c 100644
--- a/var/spack/packages/libjson-c/package.py
+++ b/var/spack/repos/builtin/packages/libjson-c/package.py
diff --git a/var/spack/packages/libmng/package.py b/var/spack/repos/builtin/packages/libmng/package.py
index e5336ea2c2..e5336ea2c2 100644
--- a/var/spack/packages/libmng/package.py
+++ b/var/spack/repos/builtin/packages/libmng/package.py
diff --git a/var/spack/packages/libmonitor/libmonitorkrell-0000.patch b/var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0000.patch
index 3a90106850..3a90106850 100644
--- a/var/spack/packages/libmonitor/libmonitorkrell-0000.patch
+++ b/var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0000.patch
diff --git a/var/spack/packages/libmonitor/libmonitorkrell-0001.patch b/var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0001.patch
index 85d69595c0..85d69595c0 100644
--- a/var/spack/packages/libmonitor/libmonitorkrell-0001.patch
+++ b/var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0001.patch
diff --git a/var/spack/packages/libmonitor/libmonitorkrell-0002.patch b/var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0002.patch
index 514dfdf13e..514dfdf13e 100644
--- a/var/spack/packages/libmonitor/libmonitorkrell-0002.patch
+++ b/var/spack/repos/builtin/packages/libmonitor/libmonitorkrell-0002.patch
diff --git a/var/spack/packages/libmonitor/package.py b/var/spack/repos/builtin/packages/libmonitor/package.py
index eecf1963e3..eecf1963e3 100644
--- a/var/spack/packages/libmonitor/package.py
+++ b/var/spack/repos/builtin/packages/libmonitor/package.py
diff --git a/var/spack/packages/libpciaccess/package.py b/var/spack/repos/builtin/packages/libpciaccess/package.py
index 403bafbbd2..403bafbbd2 100644
--- a/var/spack/packages/libpciaccess/package.py
+++ b/var/spack/repos/builtin/packages/libpciaccess/package.py
diff --git a/var/spack/packages/libpng/package.py b/var/spack/repos/builtin/packages/libpng/package.py
index e02b08663e..e02b08663e 100644
--- a/var/spack/packages/libpng/package.py
+++ b/var/spack/repos/builtin/packages/libpng/package.py
diff --git a/var/spack/packages/libsodium/package.py b/var/spack/repos/builtin/packages/libsodium/package.py
index 1c8a16d998..1c8a16d998 100644
--- a/var/spack/packages/libsodium/package.py
+++ b/var/spack/repos/builtin/packages/libsodium/package.py
diff --git a/var/spack/packages/libtiff/package.py b/var/spack/repos/builtin/packages/libtiff/package.py
index 63c6704cb8..63c6704cb8 100644
--- a/var/spack/packages/libtiff/package.py
+++ b/var/spack/repos/builtin/packages/libtiff/package.py
diff --git a/var/spack/packages/libtool/package.py b/var/spack/repos/builtin/packages/libtool/package.py
index a07daf9781..a07daf9781 100644
--- a/var/spack/packages/libtool/package.py
+++ b/var/spack/repos/builtin/packages/libtool/package.py
diff --git a/var/spack/packages/libunwind/package.py b/var/spack/repos/builtin/packages/libunwind/package.py
index 6f162f7b08..6f162f7b08 100644
--- a/var/spack/packages/libunwind/package.py
+++ b/var/spack/repos/builtin/packages/libunwind/package.py
diff --git a/var/spack/packages/libuuid/package.py b/var/spack/repos/builtin/packages/libuuid/package.py
index 373c5bfcac..373c5bfcac 100644
--- a/var/spack/packages/libuuid/package.py
+++ b/var/spack/repos/builtin/packages/libuuid/package.py
diff --git a/var/spack/packages/libxcb/package.py b/var/spack/repos/builtin/packages/libxcb/package.py
index 16a5525c0d..16a5525c0d 100644
--- a/var/spack/packages/libxcb/package.py
+++ b/var/spack/repos/builtin/packages/libxcb/package.py
diff --git a/var/spack/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py
index 134e596963..134e596963 100644
--- a/var/spack/packages/libxml2/package.py
+++ b/var/spack/repos/builtin/packages/libxml2/package.py
diff --git a/var/spack/packages/libxshmfence/package.py b/var/spack/repos/builtin/packages/libxshmfence/package.py
index 3aa2448b46..3aa2448b46 100644
--- a/var/spack/packages/libxshmfence/package.py
+++ b/var/spack/repos/builtin/packages/libxshmfence/package.py
diff --git a/var/spack/packages/libxslt/package.py b/var/spack/repos/builtin/packages/libxslt/package.py
index f97332d020..f97332d020 100644
--- a/var/spack/packages/libxslt/package.py
+++ b/var/spack/repos/builtin/packages/libxslt/package.py
diff --git a/var/spack/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py
index cb91aa22a5..cb91aa22a5 100644
--- a/var/spack/packages/llvm-lld/package.py
+++ b/var/spack/repos/builtin/packages/llvm-lld/package.py
diff --git a/var/spack/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py
index a3307584e0..a3307584e0 100644
--- a/var/spack/packages/llvm/package.py
+++ b/var/spack/repos/builtin/packages/llvm/package.py
diff --git a/var/spack/packages/lmdb/package.py b/var/spack/repos/builtin/packages/lmdb/package.py
index 875b8100c5..875b8100c5 100644
--- a/var/spack/packages/lmdb/package.py
+++ b/var/spack/repos/builtin/packages/lmdb/package.py
diff --git a/var/spack/packages/lmod/package.py b/var/spack/repos/builtin/packages/lmod/package.py
index d642594f92..d642594f92 100644
--- a/var/spack/packages/lmod/package.py
+++ b/var/spack/repos/builtin/packages/lmod/package.py
diff --git a/var/spack/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py
index 6d8f7806d9..6d8f7806d9 100644
--- a/var/spack/packages/lua/package.py
+++ b/var/spack/repos/builtin/packages/lua/package.py
diff --git a/var/spack/packages/lwgrp/package.py b/var/spack/repos/builtin/packages/lwgrp/package.py
index 5963382b92..5963382b92 100644
--- a/var/spack/packages/lwgrp/package.py
+++ b/var/spack/repos/builtin/packages/lwgrp/package.py
diff --git a/var/spack/packages/lwm2/package.py b/var/spack/repos/builtin/packages/lwm2/package.py
index 31afff8816..31afff8816 100644
--- a/var/spack/packages/lwm2/package.py
+++ b/var/spack/repos/builtin/packages/lwm2/package.py
diff --git a/var/spack/packages/matio/package.py b/var/spack/repos/builtin/packages/matio/package.py
index 12cfb80926..12cfb80926 100644
--- a/var/spack/packages/matio/package.py
+++ b/var/spack/repos/builtin/packages/matio/package.py
diff --git a/var/spack/packages/memaxes/package.py b/var/spack/repos/builtin/packages/memaxes/package.py
index 4b1da558a2..4b1da558a2 100644
--- a/var/spack/packages/memaxes/package.py
+++ b/var/spack/repos/builtin/packages/memaxes/package.py
diff --git a/var/spack/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py
index 62da8c993b..62da8c993b 100644
--- a/var/spack/packages/mesa/package.py
+++ b/var/spack/repos/builtin/packages/mesa/package.py
diff --git a/var/spack/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py
index 7ce5ae1925..7ce5ae1925 100644
--- a/var/spack/packages/metis/package.py
+++ b/var/spack/repos/builtin/packages/metis/package.py
diff --git a/var/spack/packages/mpc/package.py b/var/spack/repos/builtin/packages/mpc/package.py
index 50477a0ccb..50477a0ccb 100644
--- a/var/spack/packages/mpc/package.py
+++ b/var/spack/repos/builtin/packages/mpc/package.py
diff --git a/var/spack/packages/mpe2/mpe2.patch b/var/spack/repos/builtin/packages/mpe2/mpe2.patch
index 3ade1f04f4..3ade1f04f4 100644
--- a/var/spack/packages/mpe2/mpe2.patch
+++ b/var/spack/repos/builtin/packages/mpe2/mpe2.patch
diff --git a/var/spack/packages/mpe2/package.py b/var/spack/repos/builtin/packages/mpe2/package.py
index 27295172cc..27295172cc 100644
--- a/var/spack/packages/mpe2/package.py
+++ b/var/spack/repos/builtin/packages/mpe2/package.py
diff --git a/var/spack/packages/mpfr/package.py b/var/spack/repos/builtin/packages/mpfr/package.py
index 0f2baac004..0f2baac004 100644
--- a/var/spack/packages/mpfr/package.py
+++ b/var/spack/repos/builtin/packages/mpfr/package.py
diff --git a/var/spack/packages/mpibash/mpibash-4.3.patch b/var/spack/repos/builtin/packages/mpibash/mpibash-4.3.patch
index 17e285b0bf..17e285b0bf 100644
--- a/var/spack/packages/mpibash/mpibash-4.3.patch
+++ b/var/spack/repos/builtin/packages/mpibash/mpibash-4.3.patch
diff --git a/var/spack/packages/mpibash/package.py b/var/spack/repos/builtin/packages/mpibash/package.py
index d0f6dafed6..d0f6dafed6 100644
--- a/var/spack/packages/mpibash/package.py
+++ b/var/spack/repos/builtin/packages/mpibash/package.py
diff --git a/var/spack/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py
index 7cfa0a3b61..7cfa0a3b61 100644
--- a/var/spack/packages/mpich/package.py
+++ b/var/spack/repos/builtin/packages/mpich/package.py
diff --git a/var/spack/packages/mpileaks/package.py b/var/spack/repos/builtin/packages/mpileaks/package.py
index 661d9d66bf..661d9d66bf 100644
--- a/var/spack/packages/mpileaks/package.py
+++ b/var/spack/repos/builtin/packages/mpileaks/package.py
diff --git a/var/spack/packages/mrnet/package.py b/var/spack/repos/builtin/packages/mrnet/package.py
index fed944e45f..fed944e45f 100644
--- a/var/spack/packages/mrnet/package.py
+++ b/var/spack/repos/builtin/packages/mrnet/package.py
diff --git a/var/spack/packages/munge/package.py b/var/spack/repos/builtin/packages/munge/package.py
index c737ca0354..c737ca0354 100644
--- a/var/spack/packages/munge/package.py
+++ b/var/spack/repos/builtin/packages/munge/package.py
diff --git a/var/spack/packages/muster/package.py b/var/spack/repos/builtin/packages/muster/package.py
index 0dc2e5e086..0dc2e5e086 100644
--- a/var/spack/packages/muster/package.py
+++ b/var/spack/repos/builtin/packages/muster/package.py
diff --git a/var/spack/packages/mvapich2/ad_lustre_rwcontig_open_source.patch b/var/spack/repos/builtin/packages/mvapich2/ad_lustre_rwcontig_open_source.patch
index ff85845cf8..ff85845cf8 100644
--- a/var/spack/packages/mvapich2/ad_lustre_rwcontig_open_source.patch
+++ b/var/spack/repos/builtin/packages/mvapich2/ad_lustre_rwcontig_open_source.patch
diff --git a/var/spack/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py
index 23a11b3171..23a11b3171 100644
--- a/var/spack/packages/mvapich2/package.py
+++ b/var/spack/repos/builtin/packages/mvapich2/package.py
diff --git a/var/spack/packages/nasm/package.py b/var/spack/repos/builtin/packages/nasm/package.py
index 933b6a62c5..933b6a62c5 100644
--- a/var/spack/packages/nasm/package.py
+++ b/var/spack/repos/builtin/packages/nasm/package.py
diff --git a/var/spack/packages/ncdu/package.py b/var/spack/repos/builtin/packages/ncdu/package.py
index 234f9730d6..234f9730d6 100644
--- a/var/spack/packages/ncdu/package.py
+++ b/var/spack/repos/builtin/packages/ncdu/package.py
diff --git a/var/spack/packages/ncurses/package.py b/var/spack/repos/builtin/packages/ncurses/package.py
index 31f53b6c43..31f53b6c43 100644
--- a/var/spack/packages/ncurses/package.py
+++ b/var/spack/repos/builtin/packages/ncurses/package.py
diff --git a/var/spack/packages/ncurses/patch_gcc_5.txt b/var/spack/repos/builtin/packages/ncurses/patch_gcc_5.txt
index f85e07cb8d..f85e07cb8d 100644
--- a/var/spack/packages/ncurses/patch_gcc_5.txt
+++ b/var/spack/repos/builtin/packages/ncurses/patch_gcc_5.txt
diff --git a/var/spack/packages/netcdf/netcdf-4.3.3-mpi.patch b/var/spack/repos/builtin/packages/netcdf/netcdf-4.3.3-mpi.patch
index 46dda5fc9d..46dda5fc9d 100644
--- a/var/spack/packages/netcdf/netcdf-4.3.3-mpi.patch
+++ b/var/spack/repos/builtin/packages/netcdf/netcdf-4.3.3-mpi.patch
diff --git a/var/spack/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py
index e1e0d836c6..e1e0d836c6 100644
--- a/var/spack/packages/netcdf/package.py
+++ b/var/spack/repos/builtin/packages/netcdf/package.py
diff --git a/var/spack/packages/netgauge/package.py b/var/spack/repos/builtin/packages/netgauge/package.py
index 0ea42175c6..0ea42175c6 100644
--- a/var/spack/packages/netgauge/package.py
+++ b/var/spack/repos/builtin/packages/netgauge/package.py
diff --git a/var/spack/packages/netlib-blas/package.py b/var/spack/repos/builtin/packages/netlib-blas/package.py
index 85e97323d3..85e97323d3 100644
--- a/var/spack/packages/netlib-blas/package.py
+++ b/var/spack/repos/builtin/packages/netlib-blas/package.py
diff --git a/var/spack/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py
index fb6b99e27c..fb6b99e27c 100644
--- a/var/spack/packages/netlib-lapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py
diff --git a/var/spack/packages/nettle/package.py b/var/spack/repos/builtin/packages/nettle/package.py
index cd600b0b87..cd600b0b87 100644
--- a/var/spack/packages/nettle/package.py
+++ b/var/spack/repos/builtin/packages/nettle/package.py
diff --git a/var/spack/packages/ompss/package.py b/var/spack/repos/builtin/packages/ompss/package.py
index e09e0a624f..e09e0a624f 100644
--- a/var/spack/packages/ompss/package.py
+++ b/var/spack/repos/builtin/packages/ompss/package.py
diff --git a/var/spack/packages/ompt-openmp/package.py b/var/spack/repos/builtin/packages/ompt-openmp/package.py
index e5bcfb51f0..e5bcfb51f0 100644
--- a/var/spack/packages/ompt-openmp/package.py
+++ b/var/spack/repos/builtin/packages/ompt-openmp/package.py
diff --git a/var/spack/packages/opari2/package.py b/var/spack/repos/builtin/packages/opari2/package.py
index 3f8c65377d..3f8c65377d 100644
--- a/var/spack/packages/opari2/package.py
+++ b/var/spack/repos/builtin/packages/opari2/package.py
diff --git a/var/spack/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py
index e01467c05a..e01467c05a 100644
--- a/var/spack/packages/openblas/package.py
+++ b/var/spack/repos/builtin/packages/openblas/package.py
diff --git a/var/spack/packages/openmpi/ad_lustre_rwcontig_open_source.patch b/var/spack/repos/builtin/packages/openmpi/ad_lustre_rwcontig_open_source.patch
index daa825ccbe..daa825ccbe 100644
--- a/var/spack/packages/openmpi/ad_lustre_rwcontig_open_source.patch
+++ b/var/spack/repos/builtin/packages/openmpi/ad_lustre_rwcontig_open_source.patch
diff --git a/var/spack/packages/openmpi/configure.patch b/var/spack/repos/builtin/packages/openmpi/configure.patch
index 18fb42c1d1..18fb42c1d1 100644
--- a/var/spack/packages/openmpi/configure.patch
+++ b/var/spack/repos/builtin/packages/openmpi/configure.patch
diff --git a/var/spack/packages/openmpi/llnl-platforms.patch b/var/spack/repos/builtin/packages/openmpi/llnl-platforms.patch
index f515743c4d..f515743c4d 100644
--- a/var/spack/packages/openmpi/llnl-platforms.patch
+++ b/var/spack/repos/builtin/packages/openmpi/llnl-platforms.patch
diff --git a/var/spack/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py
index be2202fbbd..be2202fbbd 100644
--- a/var/spack/packages/openmpi/package.py
+++ b/var/spack/repos/builtin/packages/openmpi/package.py
diff --git a/var/spack/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py
index 8c71bcb7c3..8c71bcb7c3 100644
--- a/var/spack/packages/openspeedshop/package.py
+++ b/var/spack/repos/builtin/packages/openspeedshop/package.py
diff --git a/var/spack/packages/openssl/package.py b/var/spack/repos/builtin/packages/openssl/package.py
index 40648fca49..40648fca49 100644
--- a/var/spack/packages/openssl/package.py
+++ b/var/spack/repos/builtin/packages/openssl/package.py
diff --git a/var/spack/packages/otf/package.py b/var/spack/repos/builtin/packages/otf/package.py
index 52893dd265..52893dd265 100644
--- a/var/spack/packages/otf/package.py
+++ b/var/spack/repos/builtin/packages/otf/package.py
diff --git a/var/spack/packages/otf2/package.py b/var/spack/repos/builtin/packages/otf2/package.py
index b3d3a5b663..b3d3a5b663 100644
--- a/var/spack/packages/otf2/package.py
+++ b/var/spack/repos/builtin/packages/otf2/package.py
diff --git a/var/spack/packages/pango/package.py b/var/spack/repos/builtin/packages/pango/package.py
index df43625bf5..df43625bf5 100644
--- a/var/spack/packages/pango/package.py
+++ b/var/spack/repos/builtin/packages/pango/package.py
diff --git a/var/spack/packages/papi/package.py b/var/spack/repos/builtin/packages/papi/package.py
index 910e0aa9f9..910e0aa9f9 100644
--- a/var/spack/packages/papi/package.py
+++ b/var/spack/repos/builtin/packages/papi/package.py
diff --git a/var/spack/packages/paraver/package.py b/var/spack/repos/builtin/packages/paraver/package.py
index 5f8a153d4c..5f8a153d4c 100644
--- a/var/spack/packages/paraver/package.py
+++ b/var/spack/repos/builtin/packages/paraver/package.py
diff --git a/var/spack/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py
index 1d99b34899..1d99b34899 100644
--- a/var/spack/packages/paraview/package.py
+++ b/var/spack/repos/builtin/packages/paraview/package.py
diff --git a/var/spack/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py
index d8cd337304..d8cd337304 100644
--- a/var/spack/packages/parmetis/package.py
+++ b/var/spack/repos/builtin/packages/parmetis/package.py
diff --git a/var/spack/packages/parpack/package.py b/var/spack/repos/builtin/packages/parpack/package.py
index 622aceca04..622aceca04 100644
--- a/var/spack/packages/parpack/package.py
+++ b/var/spack/repos/builtin/packages/parpack/package.py
diff --git a/var/spack/packages/pcre/package.py b/var/spack/repos/builtin/packages/pcre/package.py
index e38d337e3d..e38d337e3d 100644
--- a/var/spack/packages/pcre/package.py
+++ b/var/spack/repos/builtin/packages/pcre/package.py
diff --git a/var/spack/packages/pdt/package.py b/var/spack/repos/builtin/packages/pdt/package.py
index ce3b793e30..ce3b793e30 100644
--- a/var/spack/packages/pdt/package.py
+++ b/var/spack/repos/builtin/packages/pdt/package.py
diff --git a/var/spack/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py
index f3ed3d72ec..f3ed3d72ec 100644
--- a/var/spack/packages/petsc/package.py
+++ b/var/spack/repos/builtin/packages/petsc/package.py
diff --git a/var/spack/packages/pidx/package.py b/var/spack/repos/builtin/packages/pidx/package.py
index 81aed62fb1..81aed62fb1 100644
--- a/var/spack/packages/pidx/package.py
+++ b/var/spack/repos/builtin/packages/pidx/package.py
diff --git a/var/spack/packages/pixman/package.py b/var/spack/repos/builtin/packages/pixman/package.py
index 895cbdbca5..895cbdbca5 100644
--- a/var/spack/packages/pixman/package.py
+++ b/var/spack/repos/builtin/packages/pixman/package.py
diff --git a/var/spack/packages/pkg-config/package.py b/var/spack/repos/builtin/packages/pkg-config/package.py
index 9964c6ce34..9964c6ce34 100644
--- a/var/spack/packages/pkg-config/package.py
+++ b/var/spack/repos/builtin/packages/pkg-config/package.py
diff --git a/var/spack/packages/pmgr_collective/package.py b/var/spack/repos/builtin/packages/pmgr_collective/package.py
index 1fc47c658f..1fc47c658f 100644
--- a/var/spack/packages/pmgr_collective/package.py
+++ b/var/spack/repos/builtin/packages/pmgr_collective/package.py
diff --git a/var/spack/packages/postgresql/package.py b/var/spack/repos/builtin/packages/postgresql/package.py
index 46922b7b71..46922b7b71 100644
--- a/var/spack/packages/postgresql/package.py
+++ b/var/spack/repos/builtin/packages/postgresql/package.py
diff --git a/var/spack/packages/ppl/package.py b/var/spack/repos/builtin/packages/ppl/package.py
index 018d5c523d..018d5c523d 100644
--- a/var/spack/packages/ppl/package.py
+++ b/var/spack/repos/builtin/packages/ppl/package.py
diff --git a/var/spack/packages/protobuf/package.py b/var/spack/repos/builtin/packages/protobuf/package.py
index 34085c7ce9..34085c7ce9 100644
--- a/var/spack/packages/protobuf/package.py
+++ b/var/spack/repos/builtin/packages/protobuf/package.py
diff --git a/var/spack/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py
index 8dfc99b28d..8dfc99b28d 100644
--- a/var/spack/packages/py-basemap/package.py
+++ b/var/spack/repos/builtin/packages/py-basemap/package.py
diff --git a/var/spack/packages/py-biopython/package.py b/var/spack/repos/builtin/packages/py-biopython/package.py
index 8ecaf48626..8ecaf48626 100644
--- a/var/spack/packages/py-biopython/package.py
+++ b/var/spack/repos/builtin/packages/py-biopython/package.py
diff --git a/var/spack/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py
index 909049a67c..909049a67c 100644
--- a/var/spack/packages/py-cffi/package.py
+++ b/var/spack/repos/builtin/packages/py-cffi/package.py
diff --git a/var/spack/packages/py-cython/package.py b/var/spack/repos/builtin/packages/py-cython/package.py
index 68eb735ad9..68eb735ad9 100644
--- a/var/spack/packages/py-cython/package.py
+++ b/var/spack/repos/builtin/packages/py-cython/package.py
diff --git a/var/spack/packages/py-dateutil/package.py b/var/spack/repos/builtin/packages/py-dateutil/package.py
index 0a17f2f2d2..0a17f2f2d2 100644
--- a/var/spack/packages/py-dateutil/package.py
+++ b/var/spack/repos/builtin/packages/py-dateutil/package.py
diff --git a/var/spack/packages/py-epydoc/package.py b/var/spack/repos/builtin/packages/py-epydoc/package.py
index af05510504..af05510504 100644
--- a/var/spack/packages/py-epydoc/package.py
+++ b/var/spack/repos/builtin/packages/py-epydoc/package.py
diff --git a/var/spack/packages/py-genders/package.py b/var/spack/repos/builtin/packages/py-genders/package.py
index c49c8fd5b2..c49c8fd5b2 100644
--- a/var/spack/packages/py-genders/package.py
+++ b/var/spack/repos/builtin/packages/py-genders/package.py
diff --git a/var/spack/packages/py-gnuplot/package.py b/var/spack/repos/builtin/packages/py-gnuplot/package.py
index ede4472c03..ede4472c03 100644
--- a/var/spack/packages/py-gnuplot/package.py
+++ b/var/spack/repos/builtin/packages/py-gnuplot/package.py
diff --git a/var/spack/packages/py-h5py/package.py b/var/spack/repos/builtin/packages/py-h5py/package.py
index 6293da5407..6293da5407 100644
--- a/var/spack/packages/py-h5py/package.py
+++ b/var/spack/repos/builtin/packages/py-h5py/package.py
diff --git a/var/spack/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py
index 8d0e64a07f..8d0e64a07f 100644
--- a/var/spack/packages/py-ipython/package.py
+++ b/var/spack/repos/builtin/packages/py-ipython/package.py
diff --git a/var/spack/packages/py-libxml2/package.py b/var/spack/repos/builtin/packages/py-libxml2/package.py
index 59005428e4..59005428e4 100644
--- a/var/spack/packages/py-libxml2/package.py
+++ b/var/spack/repos/builtin/packages/py-libxml2/package.py
diff --git a/var/spack/packages/py-lockfile/package.py b/var/spack/repos/builtin/packages/py-lockfile/package.py
index 8722914d94..8722914d94 100644
--- a/var/spack/packages/py-lockfile/package.py
+++ b/var/spack/repos/builtin/packages/py-lockfile/package.py
diff --git a/var/spack/packages/py-mako/package.py b/var/spack/repos/builtin/packages/py-mako/package.py
index 3e91ffd8e5..3e91ffd8e5 100644
--- a/var/spack/packages/py-mako/package.py
+++ b/var/spack/repos/builtin/packages/py-mako/package.py
diff --git a/var/spack/packages/py-matplotlib/package.py b/var/spack/repos/builtin/packages/py-matplotlib/package.py
index a5fee39d42..a5fee39d42 100644
--- a/var/spack/packages/py-matplotlib/package.py
+++ b/var/spack/repos/builtin/packages/py-matplotlib/package.py
diff --git a/var/spack/packages/py-mock/package.py b/var/spack/repos/builtin/packages/py-mock/package.py
index 3b08428ba0..3b08428ba0 100644
--- a/var/spack/packages/py-mock/package.py
+++ b/var/spack/repos/builtin/packages/py-mock/package.py
diff --git a/var/spack/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py
index 8001689a18..8001689a18 100644
--- a/var/spack/packages/py-mpi4py/package.py
+++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py
diff --git a/var/spack/packages/py-mx/package.py b/var/spack/repos/builtin/packages/py-mx/package.py
index 717ee0562b..717ee0562b 100644
--- a/var/spack/packages/py-mx/package.py
+++ b/var/spack/repos/builtin/packages/py-mx/package.py
diff --git a/var/spack/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py
index e7c6cf0264..e7c6cf0264 100644
--- a/var/spack/packages/py-nose/package.py
+++ b/var/spack/repos/builtin/packages/py-nose/package.py
diff --git a/var/spack/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py
index 4c085fba6e..4c085fba6e 100644
--- a/var/spack/packages/py-numpy/package.py
+++ b/var/spack/repos/builtin/packages/py-numpy/package.py
diff --git a/var/spack/packages/py-pandas/package.py b/var/spack/repos/builtin/packages/py-pandas/package.py
index 5b9997faa9..5b9997faa9 100644
--- a/var/spack/packages/py-pandas/package.py
+++ b/var/spack/repos/builtin/packages/py-pandas/package.py
diff --git a/var/spack/packages/py-pexpect/package.py b/var/spack/repos/builtin/packages/py-pexpect/package.py
index ff5fac84e0..ff5fac84e0 100644
--- a/var/spack/packages/py-pexpect/package.py
+++ b/var/spack/repos/builtin/packages/py-pexpect/package.py
diff --git a/var/spack/packages/py-pil/package.py b/var/spack/repos/builtin/packages/py-pil/package.py
index 743b761981..743b761981 100644
--- a/var/spack/packages/py-pil/package.py
+++ b/var/spack/repos/builtin/packages/py-pil/package.py
diff --git a/var/spack/packages/py-pillow/package.py b/var/spack/repos/builtin/packages/py-pillow/package.py
index adc8507bd5..adc8507bd5 100644
--- a/var/spack/packages/py-pillow/package.py
+++ b/var/spack/repos/builtin/packages/py-pillow/package.py
diff --git a/var/spack/packages/py-pmw/package.py b/var/spack/repos/builtin/packages/py-pmw/package.py
index 56131811e9..56131811e9 100644
--- a/var/spack/packages/py-pmw/package.py
+++ b/var/spack/repos/builtin/packages/py-pmw/package.py
diff --git a/var/spack/packages/py-pychecker/package.py b/var/spack/repos/builtin/packages/py-pychecker/package.py
index bda5a746aa..bda5a746aa 100644
--- a/var/spack/packages/py-pychecker/package.py
+++ b/var/spack/repos/builtin/packages/py-pychecker/package.py
diff --git a/var/spack/packages/py-pycparser/package.py b/var/spack/repos/builtin/packages/py-pycparser/package.py
index f2bb679d25..f2bb679d25 100644
--- a/var/spack/packages/py-pycparser/package.py
+++ b/var/spack/repos/builtin/packages/py-pycparser/package.py
diff --git a/var/spack/packages/py-pyelftools/package.py b/var/spack/repos/builtin/packages/py-pyelftools/package.py
index d5ad32e624..d5ad32e624 100644
--- a/var/spack/packages/py-pyelftools/package.py
+++ b/var/spack/repos/builtin/packages/py-pyelftools/package.py
diff --git a/var/spack/packages/py-pygments/package.py b/var/spack/repos/builtin/packages/py-pygments/package.py
index 7e07bf6869..7e07bf6869 100644
--- a/var/spack/packages/py-pygments/package.py
+++ b/var/spack/repos/builtin/packages/py-pygments/package.py
diff --git a/var/spack/packages/py-pylint/package.py b/var/spack/repos/builtin/packages/py-pylint/package.py
index 9579708c29..9579708c29 100644
--- a/var/spack/packages/py-pylint/package.py
+++ b/var/spack/repos/builtin/packages/py-pylint/package.py
diff --git a/var/spack/packages/py-pypar/package.py b/var/spack/repos/builtin/packages/py-pypar/package.py
index af9c76ccd8..af9c76ccd8 100644
--- a/var/spack/packages/py-pypar/package.py
+++ b/var/spack/repos/builtin/packages/py-pypar/package.py
diff --git a/var/spack/packages/py-pyparsing/package.py b/var/spack/repos/builtin/packages/py-pyparsing/package.py
index a6e50ad139..a6e50ad139 100644
--- a/var/spack/packages/py-pyparsing/package.py
+++ b/var/spack/repos/builtin/packages/py-pyparsing/package.py
diff --git a/var/spack/packages/py-pyqt/package.py b/var/spack/repos/builtin/packages/py-pyqt/package.py
index 8edca105bb..8edca105bb 100644
--- a/var/spack/packages/py-pyqt/package.py
+++ b/var/spack/repos/builtin/packages/py-pyqt/package.py
diff --git a/var/spack/packages/py-pyside/package.py b/var/spack/repos/builtin/packages/py-pyside/package.py
index ffa433e18e..ffa433e18e 100644
--- a/var/spack/packages/py-pyside/package.py
+++ b/var/spack/repos/builtin/packages/py-pyside/package.py
diff --git a/var/spack/packages/py-python-daemon/package.py b/var/spack/repos/builtin/packages/py-python-daemon/package.py
index 12cbe9101c..12cbe9101c 100644
--- a/var/spack/packages/py-python-daemon/package.py
+++ b/var/spack/repos/builtin/packages/py-python-daemon/package.py
diff --git a/var/spack/packages/py-pytz/package.py b/var/spack/repos/builtin/packages/py-pytz/package.py
index da6311a784..da6311a784 100644
--- a/var/spack/packages/py-pytz/package.py
+++ b/var/spack/repos/builtin/packages/py-pytz/package.py
diff --git a/var/spack/packages/py-rpy2/package.py b/var/spack/repos/builtin/packages/py-rpy2/package.py
index a0b03d03e3..a0b03d03e3 100644
--- a/var/spack/packages/py-rpy2/package.py
+++ b/var/spack/repos/builtin/packages/py-rpy2/package.py
diff --git a/var/spack/packages/py-scientificpython/package.py b/var/spack/repos/builtin/packages/py-scientificpython/package.py
index df2c86caac..df2c86caac 100644
--- a/var/spack/packages/py-scientificpython/package.py
+++ b/var/spack/repos/builtin/packages/py-scientificpython/package.py
diff --git a/var/spack/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py
index 5b078ce901..5b078ce901 100644
--- a/var/spack/packages/py-scikit-learn/package.py
+++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py
diff --git a/var/spack/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py
index 3a1124cc15..3a1124cc15 100644
--- a/var/spack/packages/py-scipy/package.py
+++ b/var/spack/repos/builtin/packages/py-scipy/package.py
diff --git a/var/spack/packages/py-setuptools/package.py b/var/spack/repos/builtin/packages/py-setuptools/package.py
index 760ad4d6db..760ad4d6db 100644
--- a/var/spack/packages/py-setuptools/package.py
+++ b/var/spack/repos/builtin/packages/py-setuptools/package.py
diff --git a/var/spack/packages/py-shiboken/package.py b/var/spack/repos/builtin/packages/py-shiboken/package.py
index e4bf4ce07e..e4bf4ce07e 100644
--- a/var/spack/packages/py-shiboken/package.py
+++ b/var/spack/repos/builtin/packages/py-shiboken/package.py
diff --git a/var/spack/packages/py-sip/package.py b/var/spack/repos/builtin/packages/py-sip/package.py
index e4a6fb6961..e4a6fb6961 100644
--- a/var/spack/packages/py-sip/package.py
+++ b/var/spack/repos/builtin/packages/py-sip/package.py
diff --git a/var/spack/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py
index 05c5bd00a9..05c5bd00a9 100644
--- a/var/spack/packages/py-six/package.py
+++ b/var/spack/repos/builtin/packages/py-six/package.py
diff --git a/var/spack/packages/py-sphinx/package.py b/var/spack/repos/builtin/packages/py-sphinx/package.py
index ec2e89a098..ec2e89a098 100644
--- a/var/spack/packages/py-sphinx/package.py
+++ b/var/spack/repos/builtin/packages/py-sphinx/package.py
diff --git a/var/spack/packages/py-sympy/package.py b/var/spack/repos/builtin/packages/py-sympy/package.py
index c17e35b95f..c17e35b95f 100644
--- a/var/spack/packages/py-sympy/package.py
+++ b/var/spack/repos/builtin/packages/py-sympy/package.py
diff --git a/var/spack/packages/py-twisted/package.py b/var/spack/repos/builtin/packages/py-twisted/package.py
index 2fdebb6cb9..2fdebb6cb9 100644
--- a/var/spack/packages/py-twisted/package.py
+++ b/var/spack/repos/builtin/packages/py-twisted/package.py
diff --git a/var/spack/packages/py-virtualenv/package.py b/var/spack/repos/builtin/packages/py-virtualenv/package.py
index 037a6fc59f..037a6fc59f 100644
--- a/var/spack/packages/py-virtualenv/package.py
+++ b/var/spack/repos/builtin/packages/py-virtualenv/package.py
diff --git a/var/spack/packages/py-yapf/package.py b/var/spack/repos/builtin/packages/py-yapf/package.py
index 12ef191515..12ef191515 100644
--- a/var/spack/packages/py-yapf/package.py
+++ b/var/spack/repos/builtin/packages/py-yapf/package.py
diff --git a/var/spack/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py
index eae2566b57..eae2566b57 100644
--- a/var/spack/packages/python/package.py
+++ b/var/spack/repos/builtin/packages/python/package.py
diff --git a/var/spack/packages/qhull/package.py b/var/spack/repos/builtin/packages/qhull/package.py
index 9da4078a70..9da4078a70 100644
--- a/var/spack/packages/qhull/package.py
+++ b/var/spack/repos/builtin/packages/qhull/package.py
diff --git a/var/spack/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py
index e8d843519d..e8d843519d 100644
--- a/var/spack/packages/qt/package.py
+++ b/var/spack/repos/builtin/packages/qt/package.py
diff --git a/var/spack/packages/qt/qt3krell.patch b/var/spack/repos/builtin/packages/qt/qt3krell.patch
index 3333eeacd4..3333eeacd4 100644
--- a/var/spack/packages/qt/qt3krell.patch
+++ b/var/spack/repos/builtin/packages/qt/qt3krell.patch
diff --git a/var/spack/packages/qthreads/package.py b/var/spack/repos/builtin/packages/qthreads/package.py
index dacdb71524..dacdb71524 100644
--- a/var/spack/packages/qthreads/package.py
+++ b/var/spack/repos/builtin/packages/qthreads/package.py
diff --git a/var/spack/packages/ravel/package.py b/var/spack/repos/builtin/packages/ravel/package.py
index d774a0ab86..d774a0ab86 100644
--- a/var/spack/packages/ravel/package.py
+++ b/var/spack/repos/builtin/packages/ravel/package.py
diff --git a/var/spack/packages/readline/package.py b/var/spack/repos/builtin/packages/readline/package.py
index 1b870e0e7f..1b870e0e7f 100644
--- a/var/spack/packages/readline/package.py
+++ b/var/spack/repos/builtin/packages/readline/package.py
diff --git a/var/spack/packages/rose/add_spack_compiler_recognition.patch b/var/spack/repos/builtin/packages/rose/add_spack_compiler_recognition.patch
index ce61ae4e4c..ce61ae4e4c 100644
--- a/var/spack/packages/rose/add_spack_compiler_recognition.patch
+++ b/var/spack/repos/builtin/packages/rose/add_spack_compiler_recognition.patch
diff --git a/var/spack/packages/rose/package.py b/var/spack/repos/builtin/packages/rose/package.py
index 1d7294acab..1d7294acab 100644
--- a/var/spack/packages/rose/package.py
+++ b/var/spack/repos/builtin/packages/rose/package.py
diff --git a/var/spack/packages/rsync/package.py b/var/spack/repos/builtin/packages/rsync/package.py
index 76aec3096d..76aec3096d 100644
--- a/var/spack/packages/rsync/package.py
+++ b/var/spack/repos/builtin/packages/rsync/package.py
diff --git a/var/spack/packages/ruby/package.py b/var/spack/repos/builtin/packages/ruby/package.py
index 6b6242362c..6b6242362c 100644
--- a/var/spack/packages/ruby/package.py
+++ b/var/spack/repos/builtin/packages/ruby/package.py
diff --git a/var/spack/packages/samtools/package.py b/var/spack/repos/builtin/packages/samtools/package.py
index 72900398d8..72900398d8 100644
--- a/var/spack/packages/samtools/package.py
+++ b/var/spack/repos/builtin/packages/samtools/package.py
diff --git a/var/spack/packages/samtools/samtools1.2.patch b/var/spack/repos/builtin/packages/samtools/samtools1.2.patch
index ead3ab4e2c..ead3ab4e2c 100644
--- a/var/spack/packages/samtools/samtools1.2.patch
+++ b/var/spack/repos/builtin/packages/samtools/samtools1.2.patch
diff --git a/var/spack/packages/scalasca/package.py b/var/spack/repos/builtin/packages/scalasca/package.py
index cf7a40c1f5..cf7a40c1f5 100644
--- a/var/spack/packages/scalasca/package.py
+++ b/var/spack/repos/builtin/packages/scalasca/package.py
diff --git a/var/spack/packages/scorep/package.py b/var/spack/repos/builtin/packages/scorep/package.py
index 0820f2d8ac..0820f2d8ac 100644
--- a/var/spack/packages/scorep/package.py
+++ b/var/spack/repos/builtin/packages/scorep/package.py
diff --git a/var/spack/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py
index 8229ed8686..8229ed8686 100644
--- a/var/spack/packages/scotch/package.py
+++ b/var/spack/repos/builtin/packages/scotch/package.py
diff --git a/var/spack/packages/scr/package.py b/var/spack/repos/builtin/packages/scr/package.py
index 1408dce678..1408dce678 100644
--- a/var/spack/packages/scr/package.py
+++ b/var/spack/repos/builtin/packages/scr/package.py
diff --git a/var/spack/packages/silo/package.py b/var/spack/repos/builtin/packages/silo/package.py
index 9eda11df15..9eda11df15 100644
--- a/var/spack/packages/silo/package.py
+++ b/var/spack/repos/builtin/packages/silo/package.py
diff --git a/var/spack/packages/snappy/package.py b/var/spack/repos/builtin/packages/snappy/package.py
index c8f9ceef7d..c8f9ceef7d 100644
--- a/var/spack/packages/snappy/package.py
+++ b/var/spack/repos/builtin/packages/snappy/package.py
diff --git a/var/spack/packages/sparsehash/package.py b/var/spack/repos/builtin/packages/sparsehash/package.py
index 7decaeb89b..7decaeb89b 100644
--- a/var/spack/packages/sparsehash/package.py
+++ b/var/spack/repos/builtin/packages/sparsehash/package.py
diff --git a/var/spack/packages/spindle/package.py b/var/spack/repos/builtin/packages/spindle/package.py
index a20753458a..a20753458a 100644
--- a/var/spack/packages/spindle/package.py
+++ b/var/spack/repos/builtin/packages/spindle/package.py
diff --git a/var/spack/packages/spot/package.py b/var/spack/repos/builtin/packages/spot/package.py
index 9e539277ae..9e539277ae 100644
--- a/var/spack/packages/spot/package.py
+++ b/var/spack/repos/builtin/packages/spot/package.py
diff --git a/var/spack/packages/sqlite/package.py b/var/spack/repos/builtin/packages/sqlite/package.py
index 1cf2d30239..1cf2d30239 100644
--- a/var/spack/packages/sqlite/package.py
+++ b/var/spack/repos/builtin/packages/sqlite/package.py
diff --git a/var/spack/packages/stat/configure_mpicxx.patch b/var/spack/repos/builtin/packages/stat/configure_mpicxx.patch
index e09056d95c..e09056d95c 100644
--- a/var/spack/packages/stat/configure_mpicxx.patch
+++ b/var/spack/repos/builtin/packages/stat/configure_mpicxx.patch
diff --git a/var/spack/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py
index 5d81e62731..5d81e62731 100644
--- a/var/spack/packages/stat/package.py
+++ b/var/spack/repos/builtin/packages/stat/package.py
diff --git a/var/spack/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py
index 7e025a8244..7e025a8244 100644
--- a/var/spack/packages/sundials/package.py
+++ b/var/spack/repos/builtin/packages/sundials/package.py
diff --git a/var/spack/packages/swig/package.py b/var/spack/repos/builtin/packages/swig/package.py
index 8d46c4fe46..8d46c4fe46 100644
--- a/var/spack/packages/swig/package.py
+++ b/var/spack/repos/builtin/packages/swig/package.py
diff --git a/var/spack/packages/task/package.py b/var/spack/repos/builtin/packages/task/package.py
index 07f44cc45b..07f44cc45b 100644
--- a/var/spack/packages/task/package.py
+++ b/var/spack/repos/builtin/packages/task/package.py
diff --git a/var/spack/packages/taskd/package.py b/var/spack/repos/builtin/packages/taskd/package.py
index 66bc0cb484..66bc0cb484 100644
--- a/var/spack/packages/taskd/package.py
+++ b/var/spack/repos/builtin/packages/taskd/package.py
diff --git a/var/spack/packages/tau/package.py b/var/spack/repos/builtin/packages/tau/package.py
index 31492397d8..31492397d8 100644
--- a/var/spack/packages/tau/package.py
+++ b/var/spack/repos/builtin/packages/tau/package.py
diff --git a/var/spack/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py
index 529adf7788..529adf7788 100644
--- a/var/spack/packages/tcl/package.py
+++ b/var/spack/repos/builtin/packages/tcl/package.py
diff --git a/var/spack/packages/texinfo/package.py b/var/spack/repos/builtin/packages/texinfo/package.py
index 460db65b3e..4b6210130b 100644
--- a/var/spack/packages/texinfo/package.py
+++ b/var/spack/repos/builtin/packages/texinfo/package.py
@@ -6,7 +6,7 @@
# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
-# For details, see https://scalability-llnl.github.io/spack
+# For details, see https://llnl.github.io/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
diff --git a/var/spack/packages/the_silver_searcher/package.py b/var/spack/repos/builtin/packages/the_silver_searcher/package.py
index e4020b6766..e4020b6766 100644
--- a/var/spack/packages/the_silver_searcher/package.py
+++ b/var/spack/repos/builtin/packages/the_silver_searcher/package.py
diff --git a/var/spack/packages/thrift/package.py b/var/spack/repos/builtin/packages/thrift/package.py
index 0e15052f64..0e15052f64 100644
--- a/var/spack/packages/thrift/package.py
+++ b/var/spack/repos/builtin/packages/thrift/package.py
diff --git a/var/spack/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py
index 96736f6f95..96736f6f95 100644
--- a/var/spack/packages/tk/package.py
+++ b/var/spack/repos/builtin/packages/tk/package.py
diff --git a/var/spack/packages/tmux/package.py b/var/spack/repos/builtin/packages/tmux/package.py
index 23d36db427..23d36db427 100644
--- a/var/spack/packages/tmux/package.py
+++ b/var/spack/repos/builtin/packages/tmux/package.py
diff --git a/var/spack/packages/tmuxinator/package.py b/var/spack/repos/builtin/packages/tmuxinator/package.py
index 77ae063e5d..77ae063e5d 100644
--- a/var/spack/packages/tmuxinator/package.py
+++ b/var/spack/repos/builtin/packages/tmuxinator/package.py
diff --git a/var/spack/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py
index 7c43f796a4..7c43f796a4 100644
--- a/var/spack/packages/trilinos/package.py
+++ b/var/spack/repos/builtin/packages/trilinos/package.py
diff --git a/var/spack/packages/uncrustify/package.py b/var/spack/repos/builtin/packages/uncrustify/package.py
index d3f2d1b473..d3f2d1b473 100644
--- a/var/spack/packages/uncrustify/package.py
+++ b/var/spack/repos/builtin/packages/uncrustify/package.py
diff --git a/var/spack/packages/util-linux/package.py b/var/spack/repos/builtin/packages/util-linux/package.py
index cb7ceabf57..cb7ceabf57 100644
--- a/var/spack/packages/util-linux/package.py
+++ b/var/spack/repos/builtin/packages/util-linux/package.py
diff --git a/var/spack/packages/valgrind/package.py b/var/spack/repos/builtin/packages/valgrind/package.py
index 0b030d73e9..0b030d73e9 100644
--- a/var/spack/packages/valgrind/package.py
+++ b/var/spack/repos/builtin/packages/valgrind/package.py
diff --git a/var/spack/packages/vim/package.py b/var/spack/repos/builtin/packages/vim/package.py
index 4099b3257f..4099b3257f 100644
--- a/var/spack/packages/vim/package.py
+++ b/var/spack/repos/builtin/packages/vim/package.py
diff --git a/var/spack/packages/vtk/package.py b/var/spack/repos/builtin/packages/vtk/package.py
index 4a27a8fedb..4a27a8fedb 100644
--- a/var/spack/packages/vtk/package.py
+++ b/var/spack/repos/builtin/packages/vtk/package.py
diff --git a/var/spack/packages/wget/package.py b/var/spack/repos/builtin/packages/wget/package.py
index c8fd025122..c8fd025122 100644
--- a/var/spack/packages/wget/package.py
+++ b/var/spack/repos/builtin/packages/wget/package.py
diff --git a/var/spack/packages/wx/package.py b/var/spack/repos/builtin/packages/wx/package.py
index 206fde7775..206fde7775 100644
--- a/var/spack/packages/wx/package.py
+++ b/var/spack/repos/builtin/packages/wx/package.py
diff --git a/var/spack/packages/wxpropgrid/package.py b/var/spack/repos/builtin/packages/wxpropgrid/package.py
index 790cead517..790cead517 100644
--- a/var/spack/packages/wxpropgrid/package.py
+++ b/var/spack/repos/builtin/packages/wxpropgrid/package.py
diff --git a/var/spack/packages/xcb-proto/package.py b/var/spack/repos/builtin/packages/xcb-proto/package.py
index 17a94bd892..17a94bd892 100644
--- a/var/spack/packages/xcb-proto/package.py
+++ b/var/spack/repos/builtin/packages/xcb-proto/package.py
diff --git a/var/spack/packages/xerces-c/package.py b/var/spack/repos/builtin/packages/xerces-c/package.py
index b59ab178ae..b59ab178ae 100644
--- a/var/spack/packages/xerces-c/package.py
+++ b/var/spack/repos/builtin/packages/xerces-c/package.py
diff --git a/var/spack/packages/xz/package.py b/var/spack/repos/builtin/packages/xz/package.py
index ba6c9733a7..ba6c9733a7 100644
--- a/var/spack/packages/xz/package.py
+++ b/var/spack/repos/builtin/packages/xz/package.py
diff --git a/var/spack/packages/yasm/package.py b/var/spack/repos/builtin/packages/yasm/package.py
index d3a695b16d..d3a695b16d 100644
--- a/var/spack/packages/yasm/package.py
+++ b/var/spack/repos/builtin/packages/yasm/package.py
diff --git a/var/spack/packages/zeromq/package.py b/var/spack/repos/builtin/packages/zeromq/package.py
index b5a1e3d4cd..b5a1e3d4cd 100644
--- a/var/spack/packages/zeromq/package.py
+++ b/var/spack/repos/builtin/packages/zeromq/package.py
diff --git a/var/spack/packages/zlib/package.py b/var/spack/repos/builtin/packages/zlib/package.py
index 2770f781ac..2770f781ac 100644
--- a/var/spack/packages/zlib/package.py
+++ b/var/spack/repos/builtin/packages/zlib/package.py
diff --git a/var/spack/packages/zsh/package.py b/var/spack/repos/builtin/packages/zsh/package.py
index 06665f0c83..06665f0c83 100644
--- a/var/spack/packages/zsh/package.py
+++ b/var/spack/repos/builtin/packages/zsh/package.py
diff --git a/var/spack/repos/builtin/repo.yaml b/var/spack/repos/builtin/repo.yaml
new file mode 100644
index 0000000000..54b282db6b
--- /dev/null
+++ b/var/spack/repos/builtin/repo.yaml
@@ -0,0 +1,2 @@
+repo:
+ namespace: builtin