summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormwilliammyers <mwilliammyers@gmail.com>2016-07-20 18:34:53 -0600
committermwilliammyers <mwilliammyers@gmail.com>2016-07-20 18:34:53 -0600
commitb8444aa518b819c640269b262eb1069cc4d552e0 (patch)
treec88d373fab8e09dae255ded8d37c6ad385960792
parenta09bebcaea24a90072d0650760434be11fcf3f29 (diff)
parente389afedaaa1e617aa3d1cb161535f6105e1b574 (diff)
downloadspack-b8444aa518b819c640269b262eb1069cc4d552e0.tar.gz
spack-b8444aa518b819c640269b262eb1069cc4d552e0.tar.bz2
spack-b8444aa518b819c640269b262eb1069cc4d552e0.tar.xz
spack-b8444aa518b819c640269b262eb1069cc4d552e0.zip
Merge remote-tracking branch 'upstream/develop' into package-opencv
* upstream/develop: (126 commits) Fix indent/flake8 error. openexr : Add new package Set environment variables Added gnu packages datamash, parallel, and screen added package as argument to setup_platform_environment ilmbase : Add new IlmBase package Documented linker default fixed flake errors removed commented-out code Set default link type to dynamic on cray. Includes hooks for platform-based environment changes fixed flake errors fixed flake errors Improved cray_xc detection bug fix Improved cray_xc detection remove FIXMEs Ensure that per-4.4.1 NetCDF doesn't use HDF5 1.10 Re-ignore licenses directory Add "default" configuration scope. Draft CDO Make frontend OS on Cray machines a proper linux distro. ...
-rw-r--r--.gitignore5
-rw-r--r--etc/spack/defaults/modules.yaml (renamed from etc/spack/modules.yaml)15
-rw-r--r--etc/spack/defaults/packages.yaml21
-rw-r--r--etc/spack/defaults/repos.yaml14
-rw-r--r--etc/spack/repos.yaml8
-rw-r--r--lib/spack/docs/basic_usage.rst13
-rw-r--r--lib/spack/docs/packaging_guide.rst41
-rwxr-xr-xlib/spack/env/cc4
l---------lib/spack/env/craype/CC1
l---------lib/spack/env/craype/cc1
l---------lib/spack/env/craype/ftn1
-rw-r--r--lib/spack/llnl/util/filesystem.py12
-rw-r--r--lib/spack/spack/__init__.py3
-rw-r--r--lib/spack/spack/architecture.py19
-rw-r--r--lib/spack/spack/build_environment.py15
-rw-r--r--lib/spack/spack/cmd/__init__.py120
-rw-r--r--lib/spack/spack/cmd/bootstrap.py49
-rw-r--r--lib/spack/spack/cmd/checksum.py21
-rw-r--r--lib/spack/spack/cmd/common/__init__.py24
-rw-r--r--lib/spack/spack/cmd/common/arguments.py96
-rw-r--r--lib/spack/spack/cmd/create.py145
-rw-r--r--lib/spack/spack/cmd/fetch.py2
-rw-r--r--lib/spack/spack/cmd/find.py85
-rw-r--r--lib/spack/spack/cmd/info.py19
-rw-r--r--lib/spack/spack/cmd/mirror.py2
-rw-r--r--lib/spack/spack/cmd/module.py328
-rw-r--r--lib/spack/spack/cmd/package-list.py30
-rw-r--r--lib/spack/spack/cmd/setup.py2
-rw-r--r--lib/spack/spack/cmd/test-install.py7
-rw-r--r--lib/spack/spack/cmd/uninstall.py62
-rw-r--r--lib/spack/spack/concretize.py10
-rw-r--r--lib/spack/spack/config.py14
-rw-r--r--lib/spack/spack/database.py33
-rw-r--r--lib/spack/spack/directives.py39
-rw-r--r--lib/spack/spack/directory_layout.py21
-rw-r--r--lib/spack/spack/graph.py10
-rw-r--r--lib/spack/spack/modules.py28
-rw-r--r--lib/spack/spack/package.py154
-rw-r--r--lib/spack/spack/platforms/cray_xc.py39
-rw-r--r--lib/spack/spack/preferred_packages.py105
-rw-r--r--lib/spack/spack/spec.py591
-rw-r--r--lib/spack/spack/test/__init__.py20
-rw-r--r--lib/spack/spack/test/architecture.py64
-rw-r--r--lib/spack/spack/test/build_system_guess.py (renamed from lib/spack/spack/test/configure_guess.py)26
-rw-r--r--lib/spack/spack/test/cmd/find.py6
-rw-r--r--lib/spack/spack/test/cmd/module.py83
-rw-r--r--lib/spack/spack/test/cmd/test_install.py33
-rw-r--r--lib/spack/spack/test/concretize.py24
-rw-r--r--lib/spack/spack/test/mock_packages_test.py8
-rw-r--r--lib/spack/spack/test/mock_repo.py4
-rw-r--r--lib/spack/spack/test/modules.py3
-rw-r--r--lib/spack/spack/test/spec_dag.py88
-rw-r--r--lib/spack/spack/test/stage.py4
-rw-r--r--lib/spack/spack/util/pattern.py78
-rw-r--r--share/spack/csh/spack.csh8
-rwxr-xr-xshare/spack/qa/run-flake83
-rwxr-xr-xshare/spack/setup-env.sh28
-rw-r--r--var/spack/repos/builtin.mock/packages/cmake-client/package.py2
-rw-r--r--var/spack/repos/builtin.mock/packages/dtbuild1/package.py18
-rw-r--r--var/spack/repos/builtin.mock/packages/dtbuild2/package.py13
-rw-r--r--var/spack/repos/builtin.mock/packages/dtbuild3/package.py13
-rw-r--r--var/spack/repos/builtin.mock/packages/dtlink1/package.py15
-rw-r--r--var/spack/repos/builtin.mock/packages/dtlink2/package.py13
-rw-r--r--var/spack/repos/builtin.mock/packages/dtlink3/package.py16
-rw-r--r--var/spack/repos/builtin.mock/packages/dtlink4/package.py13
-rw-r--r--var/spack/repos/builtin.mock/packages/dtlink5/package.py13
-rw-r--r--var/spack/repos/builtin.mock/packages/dtrun1/package.py16
-rw-r--r--var/spack/repos/builtin.mock/packages/dtrun2/package.py13
-rw-r--r--var/spack/repos/builtin.mock/packages/dtrun3/package.py15
-rw-r--r--var/spack/repos/builtin.mock/packages/dttop/package.py17
-rw-r--r--var/spack/repos/builtin.mock/packages/dtuse/package.py15
-rw-r--r--var/spack/repos/builtin/packages/ImageMagick/package.py2
-rw-r--r--var/spack/repos/builtin/packages/Mitos/package.py1
-rw-r--r--var/spack/repos/builtin/packages/R/package.py10
-rw-r--r--var/spack/repos/builtin/packages/adept-utils/package.py1
-rw-r--r--var/spack/repos/builtin/packages/adios/package.py4
-rw-r--r--var/spack/repos/builtin/packages/apex/package.py2
-rw-r--r--var/spack/repos/builtin/packages/armadillo/package.py8
-rw-r--r--var/spack/repos/builtin/packages/arpack-ng/package.py8
-rw-r--r--var/spack/repos/builtin/packages/autoconf/package.py2
-rw-r--r--var/spack/repos/builtin/packages/automaded/package.py1
-rw-r--r--var/spack/repos/builtin/packages/bear/package.py2
-rw-r--r--var/spack/repos/builtin/packages/bertini/package.py4
-rw-r--r--var/spack/repos/builtin/packages/binutils/package.py6
-rw-r--r--var/spack/repos/builtin/packages/bison/package.py2
-rw-r--r--var/spack/repos/builtin/packages/boxlib/package.py1
-rw-r--r--var/spack/repos/builtin/packages/bzip2/package.py49
-rw-r--r--var/spack/repos/builtin/packages/c-blosc/package.py2
-rw-r--r--var/spack/repos/builtin/packages/caliper/package.py1
-rw-r--r--var/spack/repos/builtin/packages/callpath/package.py1
-rw-r--r--var/spack/repos/builtin/packages/cantera/package.py10
-rw-r--r--var/spack/repos/builtin/packages/cbtf-argonavis/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cbtf-krell/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cbtf-lanl/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cbtf/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cdo/package.py42
-rw-r--r--var/spack/repos/builtin/packages/cereal/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cgal/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cleverleaf/package.py1
-rw-r--r--var/spack/repos/builtin/packages/cmake/package.py5
-rw-r--r--var/spack/repos/builtin/packages/cmocka/package.py2
-rw-r--r--var/spack/repos/builtin/packages/cram/package.py1
-rw-r--r--var/spack/repos/builtin/packages/czmq/package.py8
-rw-r--r--var/spack/repos/builtin/packages/dakota/package.py1
-rw-r--r--var/spack/repos/builtin/packages/damselfly/package.py2
-rw-r--r--var/spack/repos/builtin/packages/datamash/package.py45
-rw-r--r--var/spack/repos/builtin/packages/dealii/package.py2
-rw-r--r--var/spack/repos/builtin/packages/dia/package.py2
-rw-r--r--var/spack/repos/builtin/packages/doxygen/package.py10
-rw-r--r--var/spack/repos/builtin/packages/dyninst/package.py1
-rw-r--r--var/spack/repos/builtin/packages/eigen/package.py2
-rw-r--r--var/spack/repos/builtin/packages/environment-modules/package.py2
-rw-r--r--var/spack/repos/builtin/packages/exodusii/package.py4
-rw-r--r--var/spack/repos/builtin/packages/expat/package.py2
-rw-r--r--var/spack/repos/builtin/packages/flex/package.py3
-rw-r--r--var/spack/repos/builtin/packages/flux/package.py4
-rw-r--r--var/spack/repos/builtin/packages/foam-extend/package.py1
-rw-r--r--var/spack/repos/builtin/packages/gdal/package.py2
-rw-r--r--var/spack/repos/builtin/packages/gdb/package.py2
-rw-r--r--var/spack/repos/builtin/packages/gflags/package.py2
-rw-r--r--var/spack/repos/builtin/packages/git/package.py2
-rw-r--r--var/spack/repos/builtin/packages/glib/package.py4
-rw-r--r--var/spack/repos/builtin/packages/glm/package.py4
-rw-r--r--var/spack/repos/builtin/packages/global/package.py2
-rw-r--r--var/spack/repos/builtin/packages/gmp/package.py2
-rw-r--r--var/spack/repos/builtin/packages/gmsh/package.py2
-rw-r--r--var/spack/repos/builtin/packages/gnu-prolog/package.py41
-rw-r--r--var/spack/repos/builtin/packages/go/package.py2
-rw-r--r--var/spack/repos/builtin/packages/googletest/package.py2
-rw-r--r--var/spack/repos/builtin/packages/graphlib/package.py2
-rw-r--r--var/spack/repos/builtin/packages/graphviz/package.py2
-rw-r--r--var/spack/repos/builtin/packages/gromacs/package.py1
-rw-r--r--var/spack/repos/builtin/packages/gts/package.py53
-rw-r--r--var/spack/repos/builtin/packages/hdf5-blosc/package.py2
-rw-r--r--var/spack/repos/builtin/packages/hdf5/package.py2
-rw-r--r--var/spack/repos/builtin/packages/hmmer/package.py76
-rw-r--r--var/spack/repos/builtin/packages/hoomd-blue/package.py6
-rw-r--r--var/spack/repos/builtin/packages/hypre/package.py45
-rw-r--r--var/spack/repos/builtin/packages/ibmisc/package.py8
-rw-r--r--var/spack/repos/builtin/packages/ilmbase/package.py42
-rw-r--r--var/spack/repos/builtin/packages/ipopt/package.py2
-rw-r--r--var/spack/repos/builtin/packages/jasper/fix_alpha_channel_assert_fail.patch25
-rw-r--r--var/spack/repos/builtin/packages/jasper/package.py63
-rw-r--r--var/spack/repos/builtin/packages/julia/package.py20
-rw-r--r--var/spack/repos/builtin/packages/launchmon/package.py6
-rw-r--r--var/spack/repos/builtin/packages/libgd/package.py1
-rw-r--r--var/spack/repos/builtin/packages/libjpeg-turbo/package.py4
-rw-r--r--var/spack/repos/builtin/packages/libtool/package.py2
-rw-r--r--var/spack/repos/builtin/packages/libuv/package.py6
-rw-r--r--var/spack/repos/builtin/packages/libxcb/package.py4
-rw-r--r--var/spack/repos/builtin/packages/llvm-lld/package.py2
-rw-r--r--var/spack/repos/builtin/packages/llvm/package.py2
-rw-r--r--var/spack/repos/builtin/packages/lmod/package.py4
-rw-r--r--var/spack/repos/builtin/packages/lua/package.py2
-rw-r--r--var/spack/repos/builtin/packages/mbedtls/package.py2
-rw-r--r--var/spack/repos/builtin/packages/memaxes/package.py2
-rw-r--r--var/spack/repos/builtin/packages/mesa/package.py4
-rw-r--r--var/spack/repos/builtin/packages/metis/package.py2
-rw-r--r--var/spack/repos/builtin/packages/mfem/package.py2
-rw-r--r--var/spack/repos/builtin/packages/mkl/package.py38
-rw-r--r--var/spack/repos/builtin/packages/mpibash/package.py2
-rw-r--r--var/spack/repos/builtin/packages/msgpack-c/package.py2
-rw-r--r--var/spack/repos/builtin/packages/mumps/package.py74
-rw-r--r--var/spack/repos/builtin/packages/muster/package.py1
-rw-r--r--var/spack/repos/builtin/packages/netcdf-cxx4/package.py2
-rw-r--r--var/spack/repos/builtin/packages/netcdf/package.py9
-rw-r--r--var/spack/repos/builtin/packages/netlib-lapack/package.py2
-rw-r--r--var/spack/repos/builtin/packages/netlib-scalapack/package.py35
-rw-r--r--var/spack/repos/builtin/packages/numdiff/package.py2
-rw-r--r--var/spack/repos/builtin/packages/oce/package.py2
-rw-r--r--var/spack/repos/builtin/packages/octave/package.py4
-rw-r--r--var/spack/repos/builtin/packages/ompt-openmp/package.py2
-rw-r--r--var/spack/repos/builtin/packages/openexr/package.py54
-rw-r--r--var/spack/repos/builtin/packages/openjpeg/package.py2
-rw-r--r--var/spack/repos/builtin/packages/openmpi/package.py5
-rw-r--r--var/spack/repos/builtin/packages/openspeedshop/package.py2
-rw-r--r--var/spack/repos/builtin/packages/p4est/package.py6
-rw-r--r--var/spack/repos/builtin/packages/paradiseo/package.py6
-rw-r--r--var/spack/repos/builtin/packages/parallel-netcdf/package.py2
-rw-r--r--var/spack/repos/builtin/packages/parallel/package.py45
-rw-r--r--var/spack/repos/builtin/packages/paraview/package.py5
-rw-r--r--var/spack/repos/builtin/packages/parmetis/package.py2
-rw-r--r--var/spack/repos/builtin/packages/pidx/package.py1
-rw-r--r--var/spack/repos/builtin/packages/psi4/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-astroid/package.py8
-rw-r--r--var/spack/repos/builtin/packages/py-astropy/package.py18
-rw-r--r--var/spack/repos/builtin/packages/py-autopep8/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-basemap/package.py8
-rw-r--r--var/spack/repos/builtin/packages/py-biopython/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-blessings/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-bottleneck/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-cffi/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-coverage/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-csvkit/package.py12
-rw-r--r--var/spack/repos/builtin/packages/py-dask/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-dateutil/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-decorator/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-emcee/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-flake8/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-funcsigs/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-genshi/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-gnuplot/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-h5py/package.py9
-rw-r--r--var/spack/repos/builtin/packages/py-iminuit/package.py8
-rw-r--r--var/spack/repos/builtin/packages/py-ipython/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-jinja2/package.py6
-rw-r--r--var/spack/repos/builtin/packages/py-lockfile/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-logilab-common/package.py6
-rw-r--r--var/spack/repos/builtin/packages/py-mako/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-markupsafe/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-matplotlib/package.py25
-rw-r--r--var/spack/repos/builtin/packages/py-mistune/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-mock/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-mpi4py/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-mysqldb1/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-nestle/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-netcdf/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-networkx/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-nose/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-numexpr/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-numpy/package.py7
-rw-r--r--var/spack/repos/builtin/packages/py-openpyxl/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-pandas/package.py12
-rw-r--r--var/spack/repos/builtin/packages/py-pbr/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-pep8/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-periodictable/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-phonopy/package.py8
-rw-r--r--var/spack/repos/builtin/packages/py-pillow/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-prettytable/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-protobuf/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-py2neo/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-pycparser/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-pydatalog/package.py38
-rw-r--r--var/spack/repos/builtin/packages/py-pygments/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-pylint/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-pyqt/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-pyside/package.py5
-rw-r--r--var/spack/repos/builtin/packages/py-pytables/package.py6
-rw-r--r--var/spack/repos/builtin/packages/py-python-daemon/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-restview/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-rpy2/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-scikit-image/package.py12
-rw-r--r--var/spack/repos/builtin/packages/py-scikit-learn/package.py6
-rw-r--r--var/spack/repos/builtin/packages/py-scipy/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-shiboken/package.py5
-rw-r--r--var/spack/repos/builtin/packages/py-six/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-sncosmo/package.py14
-rw-r--r--var/spack/repos/builtin/packages/py-storm/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-tappy/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-tuiview/package.py4
-rw-r--r--var/spack/repos/builtin/packages/py-twisted/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-unittest2/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-unittest2py3k/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-urwid/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-virtualenv/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-wcsaxes/package.py6
-rw-r--r--var/spack/repos/builtin/packages/py-wheel/package.py2
-rw-r--r--var/spack/repos/builtin/packages/py-yapf/package.py2
-rw-r--r--var/spack/repos/builtin/packages/python/package.py69
-rw-r--r--var/spack/repos/builtin/packages/qhull/package.py2
-rw-r--r--var/spack/repos/builtin/packages/qt/package.py4
-rw-r--r--var/spack/repos/builtin/packages/ravel/package.py3
-rw-r--r--var/spack/repos/builtin/packages/rose/package.py6
-rw-r--r--var/spack/repos/builtin/packages/scotch/package.py4
-rw-r--r--var/spack/repos/builtin/packages/screen/package.py59
-rw-r--r--var/spack/repos/builtin/packages/serf/package.py2
-rw-r--r--var/spack/repos/builtin/packages/spot/package.py2
-rw-r--r--var/spack/repos/builtin/packages/stat/package.py2
-rw-r--r--var/spack/repos/builtin/packages/suite-sparse/package.py29
-rw-r--r--var/spack/repos/builtin/packages/suite-sparse/tbb_453.patch13
-rw-r--r--var/spack/repos/builtin/packages/sundials/package.py1
-rw-r--r--var/spack/repos/builtin/packages/swiftsim/package.py9
-rw-r--r--var/spack/repos/builtin/packages/task/package.py1
-rw-r--r--var/spack/repos/builtin/packages/taskd/package.py1
-rw-r--r--var/spack/repos/builtin/packages/tcl/package.py16
-rw-r--r--var/spack/repos/builtin/packages/tetgen/package.py4
-rw-r--r--var/spack/repos/builtin/packages/the_platinum_searcher/package.py2
-rw-r--r--var/spack/repos/builtin/packages/the_silver_searcher/package.py6
-rw-r--r--var/spack/repos/builtin/packages/thrift/package.py10
-rw-r--r--var/spack/repos/builtin/packages/tk/package.py19
-rw-r--r--var/spack/repos/builtin/packages/trilinos/package.py9
-rw-r--r--var/spack/repos/builtin/packages/vim/package.py2
-rw-r--r--var/spack/repos/builtin/packages/vtk/package.py1
283 files changed, 3232 insertions, 1323 deletions
diff --git a/.gitignore b/.gitignore
index 040df3eafd..960b5b0035 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,12 @@
/var/spack/stage
/var/spack/cache
*.pyc
-/opt/
+/opt
*~
.DS_Store
.idea
-/etc/spack/*
+/etc/spack/licenses
+/etc/spack/*.yaml
/etc/spackconfig
/share/spack/dotkit
/share/spack/modules
diff --git a/etc/spack/modules.yaml b/etc/spack/defaults/modules.yaml
index 9ae54a2d09..8864a76547 100644
--- a/etc/spack/modules.yaml
+++ b/etc/spack/defaults/modules.yaml
@@ -1,8 +1,17 @@
# -------------------------------------------------------------------------
-# This is the default spack module files generation configuration.
+# This is the default configuration for Spack's module file generation.
#
-# Changes to this file will affect all users of this spack install,
-# although users can override these settings in their ~/.spack/modules.yaml.
+# Settings here are versioned with Spack and are intended to provide
+# sensible defaults out of the box. Spack maintainers should edit this
+# file to keep it current.
+#
+# Users can override these settings by editing the following files.
+#
+# Per-spack-instance settings (overrides defaults):
+# $SPACK_ROOT/etc/spack/modules.yaml
+#
+# Per-user settings (overrides default and site settings):
+# ~/.spack/modules.yaml
# -------------------------------------------------------------------------
modules:
enable:
diff --git a/etc/spack/defaults/packages.yaml b/etc/spack/defaults/packages.yaml
new file mode 100644
index 0000000000..83f9eb7ece
--- /dev/null
+++ b/etc/spack/defaults/packages.yaml
@@ -0,0 +1,21 @@
+# -------------------------------------------------------------------------
+# This file controls default concretization preferences for Spack.
+#
+# Settings here are versioned with Spack and are intended to provide
+# sensible defaults out of the box. Spack maintainers should edit this
+# file to keep it current.
+#
+# Users can override these settings by editing the following files.
+#
+# Per-spack-instance settings (overrides defaults):
+# $SPACK_ROOT/etc/spack/packages.yaml
+#
+# Per-user settings (overrides default and site settings):
+# ~/.spack/packages.yaml
+# -------------------------------------------------------------------------
+packages:
+ all:
+ providers:
+ mpi: [openmpi, mpich]
+ blas: [openblas]
+ lapack: [openblas]
diff --git a/etc/spack/defaults/repos.yaml b/etc/spack/defaults/repos.yaml
new file mode 100644
index 0000000000..f3e00653eb
--- /dev/null
+++ b/etc/spack/defaults/repos.yaml
@@ -0,0 +1,14 @@
+# -------------------------------------------------------------------------
+# This is the default spack repository configuration. It includes the
+# builtin spack package repository.
+#
+# Users can override these settings by editing the following files.
+#
+# Per-spack-instance settings (overrides defaults):
+# $SPACK_ROOT/etc/spack/repos.yaml
+#
+# Per-user settings (overrides default and site settings):
+# ~/.spack/repos.yaml
+# -------------------------------------------------------------------------
+repos:
+ - $spack/var/spack/repos/builtin
diff --git a/etc/spack/repos.yaml b/etc/spack/repos.yaml
deleted file mode 100644
index 2d4ff54ce6..0000000000
--- a/etc/spack/repos.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# -------------------------------------------------------------------------
-# 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/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst
index dbad0a9f6d..948092047b 100644
--- a/lib/spack/docs/basic_usage.rst
+++ b/lib/spack/docs/basic_usage.rst
@@ -183,7 +183,7 @@ To uninstall a package and every package that depends on it, you may give the
spack uninstall --dependents mpich
-will display a list of all the packages that depends on `mpich` and, upon confirmation,
+will display a list of all the packages that depend on `mpich` and, upon confirmation,
will uninstall them in the right order.
A line like
@@ -543,11 +543,12 @@ More formally, a spec consists of the following pieces:
* ``+`` or ``-`` or ``~`` Optional variant specifiers (``+debug``,
``-qt``, or ``~qt``) for boolean variants
* ``name=<value>`` Optional variant specifiers that are not restricted to
-boolean variants
+ boolean variants
* ``name=<value>`` Optional compiler flag specifiers. Valid flag names are
-``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``.
+ ``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``.
* ``target=<value> os=<value>`` Optional architecture specifier
-(``target=haswell os=CNL10``) * ``^`` Dependency specs (``^callpath@1.1``)
+ (``target=haswell os=CNL10``)
+* ``^`` Dependency specs (``^callpath@1.1``)
There are two things to notice here. The first is that specs are
recursively defined. That is, each dependency after ``^`` is a spec
@@ -1865,6 +1866,10 @@ to call the Cray compiler wrappers during build time.
For more on compiler configuration, check out :ref:`compiler-config`.
+Spack sets the default Cray link type to dynamic, to better match other
+other platforms. Individual packages can enable static linking (which is the
+default outside of Spack on cray systems) using the -static flag.
+
Setting defaults and using Cray modules
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst
index 0f549e2957..70def5c39a 100644
--- a/lib/spack/docs/packaging_guide.rst
+++ b/lib/spack/docs/packaging_guide.rst
@@ -1286,6 +1286,31 @@ command line to find installed packages or to install packages with
particular constraints, and package authors can use specs to describe
relationships between packages.
+Additionally, dependencies may be specified for specific use cases:
+
+.. code-block:: python
+
+ depends_on("cmake", type="build")
+ depends_on("libelf", type=("build", "link"))
+ depends_on("python", type="run")
+
+The dependency types are:
+
+ * **"build"**: made available during the project's build. The package will
+ be added to ``PATH``, the compiler include paths, and ``PYTHONPATH``.
+ Other projects which depend on this one will not have these modified
+ (building project X doesn't need project Y's build dependencies).
+ * **"link"**: the project is linked to by the project. The package will be
+ added to the current package's ``rpath``.
+ * **"run"**: the project is used by the project at runtime. The package will
+ be added to ``PATH`` and ``PYTHONPATH``.
+
+If not specified, ``type`` is assumed to be ``("build", "link")``. This is the
+common case for compiled language usage. Also available are the aliases
+``"alldeps"`` for all dependency types and ``"nolink"`` (``("build", "run")``)
+for use by dependencies which are not expressed via a linker (e.g., Python or
+Lua module loading).
+
.. _setup-dependent-environment:
``setup_dependent_environment()``
@@ -2602,14 +2627,14 @@ Spack packages with variants similar to already-existing Spack
packages should use the same name for their variants. Standard
variant names are:
-======= ======== ========================
-Name Default Description
-------- -------- ------------------------
-shared True Build shared libraries
-static Build static libraries
-mpi Use MPI
-python Build Python extension
-------- -------- ------------------------
+ ======= ======== ========================
+ Name Default Description
+ ======= ======== ========================
+ shared True Build shared libraries
+ static Build static libraries
+ mpi Use MPI
+ python Build Python extension
+ ======= ======== ========================
If specified in this table, the corresponding default should be used
when declaring a variant.
diff --git a/lib/spack/env/cc b/lib/spack/env/cc
index bf98b4c354..c6bb50d261 100755
--- a/lib/spack/env/cc
+++ b/lib/spack/env/cc
@@ -110,13 +110,13 @@ case "$command" in
comp="CXX"
lang_flags=CXX
;;
- f90|fc|f95|gfortran|ifort|pgfortran|xlf90|nagfor)
+ ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|nagfor)
command="$SPACK_FC"
language="Fortran 90"
comp="FC"
lang_flags=F
;;
- f77|gfortran|ifort|pgfortran|xlf|nagfor)
+ f77|gfortran|ifort|pgfortran|xlf|nagfor|ftn)
command="$SPACK_F77"
language="Fortran 77"
comp="F77"
diff --git a/lib/spack/env/craype/CC b/lib/spack/env/craype/CC
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/craype/CC
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/craype/cc b/lib/spack/env/craype/cc
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/craype/cc
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/craype/ftn b/lib/spack/env/craype/ftn
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/craype/ftn
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py
index e800c6717a..6e4cd338fe 100644
--- a/lib/spack/llnl/util/filesystem.py
+++ b/lib/spack/llnl/util/filesystem.py
@@ -42,7 +42,7 @@ __all__ = ['set_install_permissions', 'install', 'install_tree',
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
'set_executable', 'copy_mode', 'unset_executable_mode',
'remove_dead_links', 'remove_linked_tree', 'find_library_path',
- 'fix_darwin_install_name', 'to_link_flags']
+ 'fix_darwin_install_name', 'to_link_flags', 'to_lib_name']
def filter_file(regex, repl, *filenames, **kwargs):
@@ -431,6 +431,13 @@ def fix_darwin_install_name(path):
break
+def to_lib_name(library):
+ """Transforms a path to the library /path/to/lib<name>.xyz into <name>
+ """
+ # Assume libXYZ.suffix
+ return os.path.basename(library)[3:].split(".")[0]
+
+
def to_link_flags(library):
"""Transforms a path to a <library> into linking flags -L<dir> -l<name>.
@@ -438,8 +445,7 @@ def to_link_flags(library):
A string of linking flags.
"""
dir = os.path.dirname(library)
- # Assume libXYZ.suffix
- name = os.path.basename(library)[3:].split(".")[0]
+ name = to_lib_name(library)
res = '-L%s -l%s' % (dir, name)
return res
diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py
index 20c9934704..d67585aac4 100644
--- a/lib/spack/spack/__init__.py
+++ b/lib/spack/spack/__init__.py
@@ -177,10 +177,11 @@ sys_type = None
# should live. This file is overloaded for spack core vs. for packages.
#
__all__ = ['Package', 'StagedPackage', 'CMakePackage', \
- 'Version', 'when', 'ver']
+ 'Version', 'when', 'ver', 'alldeps', 'nolink']
from spack.package import Package, ExtensionConflictError
from spack.package import StagedPackage, CMakePackage
from spack.version import Version, ver
+from spack.spec import DependencySpec, alldeps, nolink
from spack.multimethod import when
import llnl.util.filesystem
diff --git a/lib/spack/spack/architecture.py b/lib/spack/spack/architecture.py
index a7cda2bf68..974505ee3a 100644
--- a/lib/spack/spack/architecture.py
+++ b/lib/spack/spack/architecture.py
@@ -76,7 +76,6 @@ attributes front_os and back_os. The operating system as described earlier,
will be responsible for compiler detection.
"""
import os
-import imp
import inspect
from llnl.util.lang import memoized, list_modules, key_ordering
@@ -190,6 +189,12 @@ class Platform(object):
return self.operating_sys.get(name, None)
+ @classmethod
+ def setup_platform_environment(self, pkg, env):
+ """ Subclass can override this method if it requires any
+ platform-specific build environment modifications.
+ """
+ pass
@classmethod
def detect(self):
@@ -200,15 +205,12 @@ class Platform(object):
"""
raise NotImplementedError()
-
def __repr__(self):
return self.__str__()
-
def __str__(self):
return self.name
-
def _cmp_key(self):
t_keys = ''.join(str(t._cmp_key()) for t in
sorted(self.targets.values()))
@@ -279,7 +281,7 @@ class OperatingSystem(object):
# ensure all the version calls we made are cached in the parent
# process, as well. This speeds up Spack a lot.
- clist = reduce(lambda x, y: x+y, compiler_lists)
+ clist = reduce(lambda x, y: x + y, compiler_lists)
return clist
def find_compiler(self, cmp_cls, *path):
@@ -320,7 +322,7 @@ class OperatingSystem(object):
# prefer the one with more compilers.
prev_paths = [prev.cc, prev.cxx, prev.f77, prev.fc]
- newcount = len([p for p in paths if p is not None])
+ newcount = len([p for p in paths if p is not None])
prevcount = len([p for p in prev_paths if p is not None])
# Don't add if it's not an improvement over prev compiler.
@@ -337,6 +339,7 @@ class OperatingSystem(object):
d['version'] = self.version
return d
+
@key_ordering
class Arch(object):
"""Architecture is now a class to help with setting attributes.
@@ -377,11 +380,9 @@ class Arch(object):
else:
return ''
-
def __contains__(self, string):
return string in str(self)
-
def _cmp_key(self):
if isinstance(self.platform, Platform):
platform = self.platform.name
@@ -424,7 +425,7 @@ def _operating_system_from_dict(os_name, plat=None):
if isinstance(os_name, dict):
name = os_name['name']
version = os_name['version']
- return plat.operating_system(name+version)
+ return plat.operating_system(name + version)
else:
return plat.operating_system(os_name)
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index fe5186a7d7..5affd3c7c5 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -254,7 +254,8 @@ def set_build_environment_variables(pkg, env, dirty=False):
env.set_path(SPACK_ENV_PATH, env_paths)
# Prefixes of all of the package's dependencies go in SPACK_DEPENDENCIES
- dep_prefixes = [d.prefix for d in pkg.spec.traverse(root=False)]
+ dep_prefixes = [d.prefix
+ for d in pkg.spec.traverse(root=False, deptype='build')]
env.set_path(SPACK_DEPENDENCIES, dep_prefixes)
# Add dependencies to CMAKE_PREFIX_PATH
env.set_path('CMAKE_PREFIX_PATH', dep_prefixes)
@@ -337,10 +338,6 @@ def set_module_variables_for_package(pkg, module):
# Don't use which for this; we want to find it in the current dir.
m.configure = Executable('./configure')
- # TODO: shouldn't really use "which" here. Consider adding notion
- # TODO: of build dependencies, as opposed to link dependencies.
- # TODO: Currently, everything is a link dependency, but tools like
- # TODO: this shouldn't be.
m.cmake = Executable('cmake')
m.ctest = Executable('ctest')
@@ -388,9 +385,10 @@ def set_module_variables_for_package(pkg, module):
def get_rpaths(pkg):
"""Get a list of all the rpaths for a package."""
rpaths = [pkg.prefix.lib, pkg.prefix.lib64]
- rpaths.extend(d.prefix.lib for d in pkg.spec.dependencies.values()
+ deps = pkg.spec.dependencies(deptype='link')
+ rpaths.extend(d.prefix.lib for d in deps
if os.path.isdir(d.prefix.lib))
- rpaths.extend(d.prefix.lib64 for d in pkg.spec.dependencies.values()
+ rpaths.extend(d.prefix.lib64 for d in deps
if os.path.isdir(d.prefix.lib64))
# Second module is our compiler mod name. We use that to get rpaths from
# module show output.
@@ -446,10 +444,11 @@ def setup_package(pkg, dirty=False):
set_compiler_environment_variables(pkg, spack_env)
set_build_environment_variables(pkg, spack_env, dirty)
+ pkg.spec.architecture.platform.setup_platform_environment(pkg, spack_env)
load_external_modules(pkg)
# traverse in postorder so package can use vars from its dependencies
spec = pkg.spec
- for dspec in pkg.spec.traverse(order='post', root=False):
+ for dspec in pkg.spec.traverse(order='post', root=False, deptype='build'):
# 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,
diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py
index 672999159c..230115df50 100644
--- a/lib/spack/spack/cmd/__init__.py
+++ b/lib/spack/spack/cmd/__init__.py
@@ -27,16 +27,18 @@ import re
import sys
import llnl.util.tty as tty
-from llnl.util.lang import attr_setdefault
-
import spack
-import spack.spec
import spack.config
+import spack.spec
+from llnl.util.lang import *
+from llnl.util.tty.colify import *
+from llnl.util.tty.color import *
#
# Settings for commands that modify configuration
#
-# Commands that modify confguration By default modify the *highest* priority scope.
+# Commands that modify confguration By default modify the *highest*
+# priority scope.
default_modify_scope = spack.config.highest_precedence_scope().name
# Commands that list confguration list *all* scopes by default.
default_list_scope = None
@@ -48,7 +50,7 @@ python_list = list
ignore_files = r'^\.|^__init__.py$|^#'
SETUP_PARSER = "setup_parser"
-DESCRIPTION = "description"
+DESCRIPTION = "description"
command_path = os.path.join(spack.lib_path, "spack", "cmd")
@@ -71,7 +73,7 @@ def get_module(name):
module_name, fromlist=[name, SETUP_PARSER, DESCRIPTION],
level=0)
- attr_setdefault(module, SETUP_PARSER, lambda *args: None) # null-op
+ attr_setdefault(module, SETUP_PARSER, lambda *args: None) # null-op
attr_setdefault(module, DESCRIPTION, "")
fn_name = get_cmd_function_name(name)
@@ -101,17 +103,17 @@ def parse_specs(args, **kwargs):
specs = spack.spec.parse(args)
for spec in specs:
if concretize:
- spec.concretize() # implies normalize
+ spec.concretize() # implies normalize
elif normalize:
spec.normalize()
return specs
- except spack.parse.ParseError, e:
+ except spack.parse.ParseError as e:
tty.error(e.message, e.string, e.pos * " " + "^")
sys.exit(1)
- except spack.spec.SpecError, e:
+ except spack.spec.SpecError as e:
tty.error(e.message)
sys.exit(1)
@@ -127,7 +129,7 @@ def elide_list(line_list, max_num=10):
[1, 2, 3, '...', 6]
"""
if len(line_list) > max_num:
- return line_list[:max_num-1] + ['...'] + line_list[-1:]
+ return line_list[:max_num - 1] + ['...'] + line_list[-1:]
else:
return line_list
@@ -138,10 +140,104 @@ def disambiguate_spec(spec):
tty.die("Spec '%s' matches no installed packages." % spec)
elif len(matching_specs) > 1:
- args = ["%s matches multiple packages." % spec,
- "Matching packages:"]
+ args = ["%s matches multiple packages." % spec,
+ "Matching packages:"]
args += [" " + str(s) for s in matching_specs]
args += ["Use a more specific spec."]
tty.die(*args)
return matching_specs[0]
+
+
+def ask_for_confirmation(message):
+ while True:
+ tty.msg(message + '[y/n]')
+ choice = raw_input().lower()
+ if choice == 'y':
+ break
+ elif choice == 'n':
+ raise SystemExit('Operation aborted')
+ tty.warn('Please reply either "y" or "n"')
+
+
+def gray_hash(spec, length):
+ return colorize('@K{%s}' % spec.dag_hash(length))
+
+
+def display_specs(specs, **kwargs):
+ mode = kwargs.get('mode', 'short')
+ hashes = kwargs.get('long', False)
+ namespace = kwargs.get('namespace', False)
+ flags = kwargs.get('show_flags', False)
+ variants = kwargs.get('variants', False)
+
+ hlen = 7
+ if kwargs.get('very_long', False):
+ hashes = True
+ hlen = None
+
+ nfmt = '.' if namespace else '_'
+ ffmt = '$%+' if flags else ''
+ vfmt = '$+' if variants else ''
+ format_string = '$%s$@%s%s' % (nfmt, ffmt, vfmt)
+
+ # Make a dict with specs keyed by architecture and compiler.
+ index = index_by(specs, ('architecture', 'compiler'))
+
+ # Traverse the index and print out each package
+ for i, (architecture, compiler) in enumerate(sorted(index)):
+ if i > 0:
+ print
+
+ header = "%s{%s} / %s{%s}" % (spack.spec.architecture_color,
+ architecture, spack.spec.compiler_color,
+ compiler)
+ tty.hline(colorize(header), char='-')
+
+ specs = index[(architecture, compiler)]
+ specs.sort()
+
+ abbreviated = [s.format(format_string, color=True) for s in specs]
+ if mode == 'paths':
+ # Print one spec per line along with prefix path
+ width = max(len(s) for s in abbreviated)
+ width += 2
+ format = " %%-%ds%%s" % width
+
+ for abbrv, spec in zip(abbreviated, specs):
+ if hashes:
+ print(gray_hash(spec, hlen), )
+ print(format % (abbrv, spec.prefix))
+
+ elif mode == 'deps':
+ for spec in specs:
+ print(spec.tree(
+ format=format_string,
+ color=True,
+ indent=4,
+ prefix=(lambda s: gray_hash(s, hlen)) if hashes else None))
+
+ elif mode == 'short':
+ # Print columns of output if not printing flags
+ if not flags:
+
+ def fmt(s):
+ string = ""
+ if hashes:
+ string += gray_hash(s, hlen) + ' '
+ string += s.format('$-%s$@%s' % (nfmt, vfmt), color=True)
+
+ return string
+
+ colify(fmt(s) for s in specs)
+ # Print one entry per line if including flags
+ else:
+ for spec in specs:
+ # Print the hash if necessary
+ hsh = gray_hash(spec, hlen) + ' ' if hashes else ''
+ print(hsh + spec.format(format_string, color=True) + '\n')
+
+ else:
+ raise ValueError(
+ "Invalid mode for display_specs: %s. Must be one of (paths,"
+ "deps, short)." % mode) # NOQA: ignore=E501
diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py
index bec11439b5..60e2bd3a11 100644
--- a/lib/spack/spack/cmd/bootstrap.py
+++ b/lib/spack/spack/cmd/bootstrap.py
@@ -23,7 +23,6 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import os
-from subprocess import check_call
import llnl.util.tty as tty
from llnl.util.filesystem import join_path, mkdirp
@@ -31,26 +30,49 @@ from llnl.util.filesystem import join_path, mkdirp
import spack
from spack.util.executable import which
+_SPACK_UPSTREAM = 'https://github.com/llnl/spack'
+
description = "Create a new installation of spack in another prefix"
+
def setup_parser(subparser):
- subparser.add_argument('prefix', help="names of prefix where we should install spack")
+ subparser.add_argument(
+ '-r', '--remote', action='store', dest='remote',
+ help="name of the remote to bootstrap from", default='origin')
+ subparser.add_argument(
+ 'prefix',
+ help="names of prefix where we should install spack")
-def get_origin_url():
+def get_origin_info(remote):
git_dir = join_path(spack.prefix, '.git')
git = which('git', required=True)
- origin_url = git(
- '--git-dir=%s' % git_dir, 'config', '--get', 'remote.origin.url',
- output=str)
- return origin_url.strip()
+ try:
+ branch = git('symbolic-ref', '--short', 'HEAD', output=str)
+ except ProcessError:
+ branch = 'develop'
+ tty.warn('No branch found; using default branch: %s' % branch)
+ if remote == 'origin' and \
+ branch not in ('master', 'develop'):
+ branch = 'develop'
+ tty.warn('Unknown branch found; using default branch: %s' % branch)
+ try:
+ origin_url = git(
+ '--git-dir=%s' % git_dir,
+ 'config', '--get', 'remote.%s.url' % remote,
+ output=str)
+ except ProcessError:
+ origin_url = _SPACK_UPSTREAM
+ tty.warn('No git repository found; '
+ 'using default upstream URL: %s' % origin_url)
+ return (origin_url.strip(), branch.strip())
def bootstrap(parser, args):
- origin_url = get_origin_url()
+ origin_url, branch = get_origin_info(args.remote)
prefix = args.prefix
- tty.msg("Fetching spack from origin: %s" % origin_url)
+ tty.msg("Fetching spack from '%s': %s" % (args.remote, origin_url))
if os.path.isfile(prefix):
tty.die("There is already a file at %s" % prefix)
@@ -62,7 +84,8 @@ def bootstrap(parser, args):
files_in_the_way = os.listdir(prefix)
if files_in_the_way:
- tty.die("There are already files there! Delete these files before boostrapping spack.",
+ tty.die("There are already files there! "
+ "Delete these files before boostrapping spack.",
*files_in_the_way)
tty.msg("Installing:",
@@ -73,8 +96,10 @@ def bootstrap(parser, args):
git = which('git', required=True)
git('init', '--shared', '-q')
git('remote', 'add', 'origin', origin_url)
- git('fetch', 'origin', 'master:refs/remotes/origin/master', '-n', '-q')
- git('reset', '--hard', 'origin/master', '-q')
+ git('fetch', 'origin', '%s:refs/remotes/origin/%s' % (branch, branch),
+ '-n', '-q')
+ git('reset', '--hard', 'origin/%s' % branch, '-q')
+ git('checkout', '-B', branch, 'origin/%s' % branch, '-q')
tty.msg("Successfully created a new spack in %s" % prefix,
"Run %s/bin/spack to use this installation." % prefix)
diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py
index 95bd4771ed..aedb0fd99c 100644
--- a/lib/spack/spack/cmd/checksum.py
+++ b/lib/spack/spack/cmd/checksum.py
@@ -42,7 +42,8 @@ def setup_parser(subparser):
'--keep-stage', action='store_true', dest='keep_stage',
help="Don't clean up staging area when command completes.")
subparser.add_argument(
- 'versions', nargs=argparse.REMAINDER, help='Versions to generate checksums for')
+ 'versions', nargs=argparse.REMAINDER,
+ help='Versions to generate checksums for')
def get_checksums(versions, urls, **kwargs):
@@ -59,10 +60,10 @@ def get_checksums(versions, urls, **kwargs):
with Stage(url, keep=keep_stage) as stage:
stage.fetch()
if i == 0 and first_stage_function:
- first_stage_function(stage)
+ first_stage_function(stage, url)
- hashes.append((version,
- spack.util.crypto.checksum(hashlib.md5, stage.archive_file)))
+ hashes.append((version, spack.util.crypto.checksum(
+ hashlib.md5, stage.archive_file)))
i += 1
except FailedDownloadError as e:
tty.msg("Failed to fetch %s" % url)
@@ -79,12 +80,12 @@ def checksum(parser, args):
# If the user asked for specific versions, use those.
if args.versions:
versions = {}
- for v in args.versions:
- v = ver(v)
- if not isinstance(v, Version):
+ for version in args.versions:
+ version = ver(version)
+ if not isinstance(version, Version):
tty.die("Cannot generate checksums for version lists or " +
"version ranges. Use unambiguous versions.")
- versions[v] = pkg.url_for_version(v)
+ versions[version] = pkg.url_for_version(version)
else:
versions = pkg.fetch_remote_versions()
if not versions:
@@ -111,5 +112,7 @@ def checksum(parser, args):
if not version_hashes:
tty.die("Could not fetch any versions for %s" % pkg.name)
- version_lines = [" version('%s', '%s')" % (v, h) for v, h in version_hashes]
+ version_lines = [
+ " version('%s', '%s')" % (v, h) for v, h in version_hashes
+ ]
tty.msg("Checksummed new versions of %s:" % pkg.name, *version_lines)
diff --git a/lib/spack/spack/cmd/common/__init__.py b/lib/spack/spack/cmd/common/__init__.py
new file mode 100644
index 0000000000..ed1ec23bca
--- /dev/null
+++ b/lib/spack/spack/cmd/common/__init__.py
@@ -0,0 +1,24 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py
new file mode 100644
index 0000000000..af04170824
--- /dev/null
+++ b/lib/spack/spack/cmd/common/arguments.py
@@ -0,0 +1,96 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+
+import argparse
+
+import spack.modules
+from spack.util.pattern import Bunch
+__all__ = ['add_common_arguments']
+
+_arguments = {}
+
+
+def add_common_arguments(parser, list_of_arguments):
+ for argument in list_of_arguments:
+ if argument not in _arguments:
+ message = 'Trying to add the non existing argument "{0}" to a command' # NOQA: ignore=E501
+ raise KeyError(message.format(argument))
+ x = _arguments[argument]
+ parser.add_argument(*x.flags, **x.kwargs)
+
+
+class ConstraintAction(argparse.Action):
+ """Constructs a list of specs based on a constraint given on the command line
+
+ An instance of this class is supposed to be used as an argument action
+ in a parser. It will read a constraint and will attach a list of matching
+ specs to the namespace
+ """
+ qualifiers = {}
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ # Query specs from command line
+ d = self.qualifiers.get(namespace.subparser_name, {})
+ specs = [s for s in spack.installed_db.query(**d)]
+ values = ' '.join(values)
+ if values:
+ specs = [x for x in specs if x.satisfies(values, strict=True)]
+ namespace.specs = specs
+
+parms = Bunch(
+ flags=('constraint',),
+ kwargs={
+ 'nargs': '*',
+ 'help': 'Constraint to select a subset of installed packages',
+ 'action': ConstraintAction
+ })
+_arguments['constraint'] = parms
+
+parms = Bunch(
+ flags=('-m', '--module-type'),
+ kwargs={
+ 'help': 'Type of module files',
+ 'default': 'tcl',
+ 'choices': spack.modules.module_types
+ })
+_arguments['module_type'] = parms
+
+parms = Bunch(
+ flags=('-y', '--yes-to-all'),
+ kwargs={
+ 'action': 'store_true',
+ 'dest': 'yes_to_all',
+ 'help': 'Assume "yes" is the answer to every confirmation asked to the user.' # NOQA: ignore=E501
+ })
+_arguments['yes_to_all'] = parms
+
+parms = Bunch(
+ flags=('-r', '--dependencies'),
+ kwargs={
+ 'action': 'store_true',
+ 'dest': 'recurse_dependencies',
+ 'help': 'Recursively traverse spec dependencies'
+ })
+_arguments['recurse_dependencies'] = parms
diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py
index 18c748e483..2c440096d1 100644
--- a/lib/spack/spack/cmd/create.py
+++ b/lib/spack/spack/cmd/create.py
@@ -103,6 +103,64 @@ ${versions}
${install}
""")
+# Build dependencies and extensions
+dependencies_dict = {
+ 'autotools': "# depends_on('foo')",
+ 'cmake': "depends_on('cmake')",
+ 'scons': "depends_on('scons')",
+ 'python': "extends('python')",
+ 'R': "extends('R')",
+ 'octave': "extends('octave')",
+ 'unknown': "# depends_on('foo')"
+}
+
+# Default installation instructions
+install_dict = {
+ 'autotools': """\
+ # FIXME: Modify the configure line to suit your build system here.
+ configure('--prefix={0}'.format(prefix))
+
+ # FIXME: Add logic to build and install here.
+ make()
+ make('install')""",
+
+ 'cmake': """\
+ with working_dir('spack-build', create=True):
+ # FIXME: Modify the cmake line to suit your build system here.
+ cmake('..', *std_cmake_args)
+
+ # FIXME: Add logic to build and install here.
+ make()
+ make('install')""",
+
+ 'scons': """\
+ # FIXME: Add logic to build and install here.
+ scons('prefix={0}'.format(prefix))
+ scons('install')""",
+
+ 'python': """\
+ # FIXME: Add logic to build and install here.
+ python('setup.py', 'install', '--prefix={0}'.format(prefix))""",
+
+ 'R': """\
+ # FIXME: Add logic to build and install here.
+ R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
+ self.stage.source_path)""",
+
+ 'octave': """\
+ # FIXME: Add logic to build and install here.
+ octave('--quiet', '--norc',
+ '--built-in-docstrings-file=/dev/null',
+ '--texi-macros-file=/dev/null',
+ '--eval', 'pkg prefix {0}; pkg install {1}'.format(
+ prefix, self.stage.archive_file))""",
+
+ 'unknown': """\
+ # FIXME: Unknown build system
+ make()
+ make('install')"""
+}
+
def make_version_calls(ver_hash_tuples):
"""Adds a version() call to the package for each version found."""
@@ -133,60 +191,17 @@ def setup_parser(subparser):
setup_parser.subparser = subparser
-class ConfigureGuesser(object):
- def __call__(self, stage):
- """Try to guess the type of build system used by the project.
- Set any necessary build dependencies or extensions.
- Set the appropriate default installation instructions."""
-
- # Build dependencies and extensions
- dependenciesDict = {
- 'autotools': "# depends_on('foo')",
- 'cmake': "depends_on('cmake')",
- 'scons': "depends_on('scons')",
- 'python': "extends('python')",
- 'R': "extends('R')",
- 'unknown': "# depends_on('foo')"
- }
-
- # Default installation instructions
- installDict = {
- 'autotools': """\
- # FIXME: Modify the configure line to suit your build system here.
- configure('--prefix={0}'.format(prefix))
-
- # FIXME: Add logic to build and install here.
- make()
- make('install')""",
-
- 'cmake': """\
- with working_dir('spack-build', create=True):
- # FIXME: Modify the cmake line to suit your build system here.
- cmake('..', *std_cmake_args)
+class BuildSystemGuesser(object):
+ def __call__(self, stage, url):
+ """Try to guess the type of build system used by a project based on
+ the contents of its archive or the URL it was downloaded from."""
- # FIXME: Add logic to build and install here.
- make()
- make('install')""",
-
- 'scons': """\
- # FIXME: Add logic to build and install here.
- scons('prefix={0}'.format(prefix))
- scons('install')""",
-
- 'python': """\
- # FIXME: Add logic to build and install here.
- python('setup.py', 'install', '--prefix={0}'.format(prefix))""",
-
- 'R': """\
- # FIXME: Add logic to build and install here.
- R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
- self.stage.source_path)""",
-
- 'unknown': """\
- # FIXME: Unknown build system
- make()
- make('install')"""
- }
+ # Most octave extensions are hosted on Octave-Forge:
+ # http://octave.sourceforge.net/index.html
+ # They all have the same base URL.
+ if 'downloads.sourceforge.net/octave/' in url:
+ self.build_system = 'octave'
+ return
# A list of clues that give us an idea of the build system a package
# uses. If the regular expression matches a file contained in the
@@ -224,12 +239,6 @@ class ConfigureGuesser(object):
self.build_system = build_system
- # Set any necessary build dependencies or extensions.
- self.dependencies = dependenciesDict[build_system]
-
- # Set the appropriate default installation instructions
- self.install = installDict[build_system]
-
def guess_name_and_version(url, args):
# Try to deduce name and version of the new package from the URL
@@ -334,8 +343,8 @@ def create(parser, args):
# Fetch tarballs (prompting user if necessary)
versions, urls = fetch_tarballs(url, name, version)
- # Try to guess what configure system is used.
- guesser = ConfigureGuesser()
+ # Try to guess what build system is used.
+ guesser = BuildSystemGuesser()
ver_hash_tuples = spack.cmd.checksum.get_checksums(
versions, urls,
first_stage_function=guesser,
@@ -344,13 +353,13 @@ def create(parser, args):
if not ver_hash_tuples:
tty.die("Could not fetch any tarballs for %s" % name)
- # Prepend 'py-' to python package names, by convention.
+ # Add prefix to package name if it is an extension.
if guesser.build_system == 'python':
- name = 'py-%s' % name
-
- # Prepend 'r-' to R package names, by convention.
+ name = 'py-{0}'.format(name)
if guesser.build_system == 'R':
- name = 'r-%s' % name
+ name = 'r-{0}'.format(name)
+ if guesser.build_system == 'octave':
+ name = 'octave-{0}'.format(name)
# Create a directory for the new package.
pkg_path = repo.filename_for_package_name(name)
@@ -367,8 +376,8 @@ def create(parser, args):
class_name=mod_to_class(name),
url=url,
versions=make_version_calls(ver_hash_tuples),
- dependencies=guesser.dependencies,
- install=guesser.install))
+ dependencies=dependencies_dict[guesser.build_system],
+ install=install_dict[guesser.build_system]))
# If everything checks out, go ahead and edit.
spack.editor(pkg_path)
diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py
index e40caaa234..1afc51d9fa 100644
--- a/lib/spack/spack/cmd/fetch.py
+++ b/lib/spack/spack/cmd/fetch.py
@@ -51,7 +51,7 @@ def fetch(parser, args):
for spec in specs:
if args.missing or args.dependencies:
to_fetch = set()
- for s in spec.traverse():
+ for s in spec.traverse(deptype_query=spack.alldeps):
package = spack.repo.get(s)
if args.missing and package.installed:
continue
diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py
index 3ec671f93f..d3ea38c573 100644
--- a/lib/spack/spack/cmd/find.py
+++ b/lib/spack/spack/cmd/find.py
@@ -31,7 +31,7 @@ import spack.spec
from llnl.util.lang import *
from llnl.util.tty.colify import *
from llnl.util.tty.color import *
-from llnl.util.lang import *
+from spack.cmd import display_specs
description = "Find installed spack packages"
@@ -104,89 +104,6 @@ def setup_parser(subparser):
help='optional specs to filter results')
-def gray_hash(spec, length):
- return colorize('@K{%s}' % spec.dag_hash(length))
-
-
-def display_specs(specs, **kwargs):
- mode = kwargs.get('mode', 'short')
- hashes = kwargs.get('long', False)
- namespace = kwargs.get('namespace', False)
- flags = kwargs.get('show_flags', False)
- variants = kwargs.get('variants', False)
-
- hlen = 7
- if kwargs.get('very_long', False):
- hashes = True
- hlen = None
-
- nfmt = '.' if namespace else '_'
- ffmt = '$%+' if flags else ''
- vfmt = '$+' if variants else ''
- format_string = '$%s$@%s%s' % (nfmt, ffmt, vfmt)
-
- # Make a dict with specs keyed by architecture and compiler.
- index = index_by(specs, ('architecture', 'compiler'))
-
- # Traverse the index and print out each package
- for i, (architecture, compiler) in enumerate(sorted(index)):
- if i > 0:
- print
-
- header = "%s{%s} / %s{%s}" % (spack.spec.architecture_color,
- architecture, spack.spec.compiler_color,
- compiler)
- tty.hline(colorize(header), char='-')
-
- specs = index[(architecture, compiler)]
- specs.sort()
-
- abbreviated = [s.format(format_string, color=True) for s in specs]
- if mode == 'paths':
- # Print one spec per line along with prefix path
- width = max(len(s) for s in abbreviated)
- width += 2
- format = " %%-%ds%%s" % width
-
- for abbrv, spec in zip(abbreviated, specs):
- if hashes:
- print(gray_hash(spec, hlen), )
- print(format % (abbrv, spec.prefix))
-
- elif mode == 'deps':
- for spec in specs:
- print(spec.tree(
- format=format_string,
- color=True,
- indent=4,
- prefix=(lambda s: gray_hash(s, hlen)) if hashes else None))
-
- elif mode == 'short':
- # Print columns of output if not printing flags
- if not flags:
-
- def fmt(s):
- string = ""
- if hashes:
- string += gray_hash(s, hlen) + ' '
- string += s.format('$-%s$@%s' % (nfmt, vfmt), color=True)
-
- return string
-
- colify(fmt(s) for s in specs)
- # Print one entry per line if including flags
- else:
- for spec in specs:
- # Print the hash if necessary
- hsh = gray_hash(spec, hlen) + ' ' if hashes else ''
- print(hsh + spec.format(format_string, color=True) + '\n')
-
- else:
- raise ValueError(
- "Invalid mode for display_specs: %s. Must be one of (paths,"
- "deps, short)." % mode) # NOQA: ignore=E501
-
-
def query_arguments(args):
# Check arguments
if args.explicit and args.implicit:
diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py
index 64d0d20e24..498518057b 100644
--- a/lib/spack/spack/cmd/info.py
+++ b/lib/spack/spack/cmd/info.py
@@ -29,9 +29,11 @@ import spack.fetch_strategy as fs
description = "Get detailed information on a particular package"
+
def padder(str_list, extra=0):
"""Return a function to pad elements of a list."""
length = max(len(str(s)) for s in str_list) + extra
+
def pad(string):
string = str(string)
padding = max(0, length - len(string))
@@ -40,7 +42,8 @@ def padder(str_list, extra=0):
def setup_parser(subparser):
- subparser.add_argument('name', metavar="PACKAGE", help="Name of package to get info for.")
+ subparser.add_argument(
+ 'name', metavar="PACKAGE", help="Name of package to get info for.")
def print_text_info(pkg):
@@ -81,12 +84,14 @@ def print_text_info(pkg):
print " " + fmt % (name, default, desc)
- print
- print "Dependencies:"
- if pkg.dependencies:
- colify(pkg.dependencies, indent=4)
- else:
- print " None"
+ for deptype in ('build', 'link', 'run'):
+ print
+ print "%s Dependencies:" % deptype.capitalize()
+ deps = pkg.dependencies_of_type(deptype)
+ if deps:
+ colify(deps, indent=4)
+ else:
+ print " None"
print
print "Virtual packages: "
diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py
index d5f7abe212..0cf682fc4f 100644
--- a/lib/spack/spack/cmd/mirror.py
+++ b/lib/spack/spack/cmd/mirror.py
@@ -179,7 +179,7 @@ def mirror_create(args):
new_specs = set()
for spec in specs:
spec.concretize()
- for s in spec.traverse():
+ for s in spec.traverse(deptype_query=spack.alldeps):
new_specs.add(s)
specs = list(new_specs)
diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py
index 70da689b67..a10e36e077 100644
--- a/lib/spack/spack/cmd/module.py
+++ b/lib/spack/spack/cmd/module.py
@@ -23,135 +23,233 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from __future__ import print_function
+
+import collections
import os
import shutil
import sys
import llnl.util.tty as tty
import spack.cmd
-from llnl.util.filesystem import mkdirp
+import spack.cmd.common.arguments as arguments
+import llnl.util.filesystem as filesystem
from spack.modules import module_types
-from spack.util.string import *
-
-description = "Manipulate modules and dotkits."
-
-
-def setup_parser(subparser):
- sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='module_command')
-
- sp.add_parser('refresh', help='Regenerate all module files.')
- find_parser = sp.add_parser('find', help='Find module files for packages.')
+description = "Manipulate module files"
- find_parser.add_argument(
- 'module_type',
- help="Type of module to find file for. [" +
- '|'.join(module_types) + "]")
+# Dictionary that will be populated with the list of sub-commands
+# Each sub-command must be callable and accept 3 arguments :
+# - mtype : the type of the module file
+# - specs : the list of specs to be processed
+# - args : namespace containing the parsed command line arguments
+callbacks = {}
- find_parser.add_argument(
- '-r', '--dependencies', action='store_true',
- dest='recurse_dependencies',
- help='Recursively traverse dependencies for modules to load.')
- find_parser.add_argument(
- '-s', '--shell', action='store_true', dest='shell',
- help='Generate shell script (instead of input for module command)')
+def subcommand(subparser_name):
+ """Registers a function in the callbacks dictionary"""
+ def decorator(callback):
+ callbacks[subparser_name] = callback
+ return callback
+ return decorator
- find_parser.add_argument(
- '-p', '--prefix', dest='prefix',
- help='Prepend to module names when issuing module load commands')
- find_parser.add_argument(
- 'spec', nargs='+',
- help='spec to find a module file for.')
-
-
-def module_find(mtype, flags, spec_array):
- """Look at all installed packages and see if the spec provided
- matches any. If it does, check whether there is a module file
- of type <mtype> there, and print out the name that the user
- should type to use that package's module.
- prefix:
- Prepend this to module names when issuing "module load" commands.
- Some systems seem to need it.
+def setup_parser(subparser):
+ sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='subparser_name')
+
+ # spack module refresh
+ refresh_parser = sp.add_parser('refresh', help='Regenerate module files')
+ refresh_parser.add_argument(
+ '--delete-tree',
+ help='Delete the module file tree before refresh',
+ action='store_true'
+ )
+ arguments.add_common_arguments(
+ refresh_parser, ['constraint', 'module_type', 'yes_to_all']
+ )
+
+ # spack module find
+ find_parser = sp.add_parser('find', help='Find module files for packages')
+ arguments.add_common_arguments(find_parser, ['constraint', 'module_type'])
+
+ # spack module rm
+ rm_parser = sp.add_parser('rm', help='Remove module files')
+ arguments.add_common_arguments(
+ rm_parser, ['constraint', 'module_type', 'yes_to_all']
+ )
+
+ # spack module loads
+ loads_parser = sp.add_parser(
+ 'loads',
+ help='Prompt the list of modules associated with a constraint'
+ )
+ loads_parser.add_argument(
+ '--input-only', action='store_false', dest='shell',
+ help='Generate input for module command (instead of a shell script)'
+ )
+ loads_parser.add_argument(
+ '-p', '--prefix', dest='prefix', default='',
+ help='Prepend to module names when issuing module load commands'
+ )
+ arguments.add_common_arguments(
+ loads_parser, ['constraint', 'module_type', 'recurse_dependencies']
+ )
+
+
+class MultipleMatches(Exception):
+ pass
+
+
+class NoMatch(Exception):
+ pass
+
+
+@subcommand('loads')
+def loads(mtype, specs, args):
+ """Prompt the list of modules associated with a list of specs"""
+ # Get a comprehensive list of specs
+ if args.recurse_dependencies:
+ specs_from_user_constraint = specs[:]
+ specs = []
+ # FIXME : during module file creation nodes seem to be visited
+ # FIXME : multiple times even if cover='nodes' is given. This
+ # FIXME : work around permits to get a unique list of spec anyhow.
+ # FIXME : (same problem as in spack/modules.py)
+ seen = set()
+ seen_add = seen.add
+ for spec in specs_from_user_constraint:
+ specs.extend(
+ [item for item in spec.traverse(order='post', cover='nodes') if not (item in seen or seen_add(item))] # NOQA: ignore=E501
+ )
+
+ module_cls = module_types[mtype]
+ modules = [(spec, module_cls(spec).use_name)
+ for spec in specs if os.path.exists(module_cls(spec).file_name)]
+
+ module_commands = {
+ 'tcl': 'module load ',
+ 'dotkit': 'dotkit use '
+ }
+
+ d = {
+ 'command': '' if not args.shell else module_commands[mtype],
+ 'prefix': args.prefix
+ }
+
+ prompt_template = '{comment}{command}{prefix}{name}'
+ for spec, mod in modules:
+ d['comment'] = '' if not args.shell else '# {0}\n'.format(
+ spec.format())
+ d['name'] = mod
+ print(prompt_template.format(**d))
+
+
+@subcommand('find')
+def find(mtype, specs, args):
"""
- if mtype not in module_types:
- tty.die("Invalid module type: '%s'. Options are %s" %
- (mtype, comma_or(module_types)))
-
- # --------------------------------------
- def _find_modules(spec, modules_list):
- """Finds all modules and sub-modules for a spec"""
- if str(spec.version) == 'system':
- # No Spack module for system-installed packages
- return
-
- if flags.recurse_dependencies:
- for dep in spec.dependencies.values():
- _find_modules(dep, modules_list)
-
- mod = module_types[mtype](spec)
- if not os.path.isfile(mod.file_name):
- tty.die("No %s module is installed for %s" % (mtype, spec))
- modules_list.append((spec, mod))
-
-
- # --------------------------------------
- raw_specs = spack.cmd.parse_specs(spec_array)
- modules = set() # Modules we will load
- seen = set()
- for raw_spec in raw_specs:
-
- # ----------- Make sure the spec only resolves to ONE thing
- specs = spack.installed_db.query(raw_spec)
- if len(specs) == 0:
- tty.die("No installed packages match spec %s" % raw_spec)
-
- if len(specs) > 1:
- tty.error("Multiple matches for spec %s. Choose one:" % raw_spec)
- for s in specs:
- sys.stderr.write(s.tree(color=True))
- sys.exit(1)
- spec = specs[0]
-
- # ----------- Chase down modules for it and all its dependencies
- modules_dups = list()
- _find_modules(spec, modules_dups)
-
- # Remove duplicates while keeping order
- modules_unique = list()
- for spec,mod in modules_dups:
- if mod.use_name not in seen:
- modules_unique.append((spec,mod))
- seen.add(mod.use_name)
-
- # Output...
- if flags.shell:
- module_cmd = {'tcl': 'module load', 'dotkit': 'dotkit use'}[mtype]
- for spec,mod in modules_unique:
- if flags.shell:
- print('# %s' % spec.format())
- print('%s %s%s' % (module_cmd, flags.prefix, mod.use_name))
- else:
- print(mod.use_name)
-
-def module_refresh():
- """Regenerate all module files for installed packages known to
- spack (some packages may no longer exist)."""
- specs = [s for s in spack.installed_db.query(installed=True, known=True)]
-
- for name, cls in module_types.items():
- tty.msg("Regenerating %s module files." % name)
- if os.path.isdir(cls.path):
- shutil.rmtree(cls.path, ignore_errors=False)
- mkdirp(cls.path)
- for spec in specs:
- cls(spec).write()
+ Look at all installed packages and see if the spec provided
+ matches any. If it does, check whether there is a module file
+ of type <mtype> there, and print out the name that the user
+ should type to use that package's module.
+ """
+ if len(specs) == 0:
+ raise NoMatch()
+
+ if len(specs) > 1:
+ raise MultipleMatches()
+
+ spec = specs.pop()
+ mod = module_types[mtype](spec)
+ if not os.path.isfile(mod.file_name):
+ tty.die("No %s module is installed for %s" % (mtype, spec))
+ print(mod.use_name)
+
+
+@subcommand('rm')
+def rm(mtype, specs, args):
+ """Deletes module files associated with items in specs"""
+ module_cls = module_types[mtype]
+ specs_with_modules = [
+ spec for spec in specs if os.path.exists(module_cls(spec).file_name)]
+ modules = [module_cls(spec) for spec in specs_with_modules]
+
+ if not modules:
+ tty.msg('No module file matches your query')
+ raise SystemExit(1)
+
+ # Ask for confirmation
+ if not args.yes_to_all:
+ tty.msg('You are about to remove {0} module files the following specs:\n'.format(mtype)) # NOQA: ignore=E501
+ spack.cmd.display_specs(specs_with_modules, long=True)
+ print('')
+ spack.cmd.ask_for_confirmation('Do you want to proceed ? ')
+
+ # Remove the module files
+ for s in modules:
+ s.remove()
+
+
+@subcommand('refresh')
+def refresh(mtype, specs, args):
+ """Regenerate module files for item in specs"""
+ # Prompt a message to the user about what is going to change
+ if not specs:
+ tty.msg('No package matches your query')
+ return
+
+ if not args.yes_to_all:
+ tty.msg('You are about to regenerate {name} module files for the following specs:\n'.format(name=mtype)) # NOQA: ignore=E501
+ spack.cmd.display_specs(specs, long=True)
+ print('')
+ spack.cmd.ask_for_confirmation('Do you want to proceed ? ')
+
+ cls = module_types[mtype]
+
+ # Detect name clashes
+ writers = [cls(spec) for spec in specs]
+ file2writer = collections.defaultdict(list)
+ for item in writers:
+ file2writer[item.file_name].append(item)
+
+ if len(file2writer) != len(writers):
+ message = 'Name clashes detected in module files:\n'
+ for filename, writer_list in file2writer.items():
+ if len(writer_list) > 1:
+ message += '\nfile : {0}\n'.format(filename)
+ for x in writer_list:
+ message += 'spec : {0}\n'.format(x.spec.format(color=True))
+ tty.error(message)
+ tty.error('Operation aborted')
+ raise SystemExit(1)
+
+ # Proceed regenerating module files
+ tty.msg('Regenerating {name} module files'.format(name=mtype))
+ if os.path.isdir(cls.path) and args.delete_tree:
+ shutil.rmtree(cls.path, ignore_errors=False)
+ filesystem.mkdirp(cls.path)
+ for x in writers:
+ x.write(overwrite=True)
def module(parser, args):
- if args.module_command == 'refresh':
- module_refresh()
-
- elif args.module_command == 'find':
- module_find(args.module_type, args, args.spec)
+ # Qualifiers to be used when querying the db for specs
+ constraint_qualifiers = {
+ 'refresh': {
+ 'installed': True,
+ 'known': True
+ },
+ }
+ arguments.ConstraintAction.qualifiers.update(constraint_qualifiers)
+
+ module_type = args.module_type
+ constraint = args.constraint
+ try:
+ callbacks[args.subparser_name](module_type, args.specs, args)
+ except MultipleMatches:
+ message = 'the constraint \'{query}\' matches multiple packages, and this is not allowed in this context' # NOQA: ignore=E501
+ tty.error(message.format(query=constraint))
+ for s in args.specs:
+ sys.stderr.write(s.format(color=True) + '\n')
+ raise SystemExit(1)
+ except NoMatch:
+ message = 'the constraint \'{query}\' match no package, and this is not allowed in this context' # NOQA: ignore=E501
+ tty.die(message.format(query=constraint))
diff --git a/lib/spack/spack/cmd/package-list.py b/lib/spack/spack/cmd/package-list.py
index 6c5c4ae8c6..a27502d30e 100644
--- a/lib/spack/spack/cmd/package-list.py
+++ b/lib/spack/spack/cmd/package-list.py
@@ -22,10 +22,8 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
-import re
import cgi
from StringIO import StringIO
-import llnl.util.tty as tty
from llnl.util.tty.colify import *
import spack
@@ -34,21 +32,22 @@ description = "Print a list of all packages in reStructuredText."
def github_url(pkg):
"""Link to a package file on github."""
- return ("https://github.com/llnl/spack/blob/master/var/spack/packages/%s/package.py" %
- pkg.name)
+ url = "https://github.com/llnl/spack/blob/master/var/spack/packages/%s/package.py" # NOQA: ignore=E501
+ return (url % pkg.name)
def rst_table(elts):
"""Print out a RST-style table."""
cols = StringIO()
ncol, widths = colify(elts, output=cols, tty=True)
- header = " ".join("=" * (w-1) for w in widths)
+ header = " ".join("=" * (w - 1) for w in widths)
return "%s\n%s%s" % (header, cols.getvalue(), header)
def print_rst_package_list():
"""Print out information on all packages in restructured text."""
- pkgs = sorted(spack.repo.all_packages(), key=lambda s:s.name.lower())
+ pkgs = sorted(spack.repo.all_packages(), key=lambda s: s.name.lower())
+ pkg_names = [p.name for p in pkgs]
print ".. _package-list:"
print
@@ -62,7 +61,7 @@ def print_rst_package_list():
print "Spack currently has %d mainline packages:" % len(pkgs)
print
- print rst_table("`%s`_" % p.name for p in pkgs)
+ print rst_table("`%s`_" % p for p in pkg_names)
print
print "-----"
@@ -79,12 +78,17 @@ def print_rst_package_list():
print
if pkg.versions:
print "Versions:"
- print " " + ", ".join(str(v) for v in reversed(sorted(pkg.versions)))
- if pkg.dependencies:
- print "Dependencies"
- print " " + ", ".join("`%s`_" % d if d != "mpi" else d
- for d in pkg.dependencies)
- print
+ print " " + ", ".join(str(v) for v in
+ reversed(sorted(pkg.versions)))
+
+ for deptype in spack.alldeps:
+ deps = pkg.dependencies_of_type(deptype)
+ if deps:
+ print "%s Dependencies" % deptype.capitalize()
+ print " " + ", ".join("%s_" % d if d in pkg_names
+ else d for d in deps)
+ print
+
print "Description:"
print pkg.format_doc(indent=2)
print
diff --git a/lib/spack/spack/cmd/setup.py b/lib/spack/spack/cmd/setup.py
index 02e9bfd281..04f3d663df 100644
--- a/lib/spack/spack/cmd/setup.py
+++ b/lib/spack/spack/cmd/setup.py
@@ -44,7 +44,7 @@ def setup_parser(subparser):
help="Display verbose build output while installing.")
subparser.add_argument(
'spec', nargs=argparse.REMAINDER,
- help="specs to use for install. Must contain package AND verison.")
+ help="specs to use for install. Must contain package AND version.")
def setup(self, args):
diff --git a/lib/spack/spack/cmd/test-install.py b/lib/spack/spack/cmd/test-install.py
index 45592a7dda..14c06d136d 100644
--- a/lib/spack/spack/cmd/test-install.py
+++ b/lib/spack/spack/cmd/test-install.py
@@ -133,7 +133,12 @@ def fetch_log(path):
def failed_dependencies(spec):
- return set(item for item in spec.dependencies.itervalues() if not spack.repo.get(item).installed)
+ def get_deps(deptype):
+ return set(item for item in spec.dependencies(deptype)
+ if not spack.repo.get(item).installed)
+ link_deps = get_deps('link')
+ run_deps = get_deps('run')
+ return link_deps.union(run_deps)
def get_top_spec_or_die(args):
diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py
index a6f08d09ed..a17b7c685c 100644
--- a/lib/spack/spack/cmd/uninstall.py
+++ b/lib/spack/spack/cmd/uninstall.py
@@ -30,7 +30,6 @@ import llnl.util.tty as tty
import spack
import spack.cmd
import spack.repository
-from spack.cmd.find import display_specs
description = "Remove an installed package"
@@ -43,21 +42,10 @@ error_message = """You can either:
display_args = {
'long': True,
'show_flags': True,
- 'variants':True
+ 'variants': True
}
-def ask_for_confirmation(message):
- while True:
- tty.msg(message + '[y/n]')
- choice = raw_input().lower()
- if choice == 'y':
- break
- elif choice == 'n':
- raise SystemExit('Operation aborted')
- tty.warn('Please reply either "y" or "n"')
-
-
def setup_parser(subparser):
subparser.add_argument(
'-f', '--force', action='store_true', dest='force',
@@ -65,32 +53,37 @@ def setup_parser(subparser):
subparser.add_argument(
'-a', '--all', action='store_true', dest='all',
help="USE CAREFULLY. Remove ALL installed packages that match each " +
- "supplied spec. i.e., if you say uninstall libelf, ALL versions of " +
- "libelf are uninstalled. This is both useful and dangerous, like rm -r.")
+ "supplied spec. i.e., if you say uninstall libelf, ALL versions of " + # NOQA: ignore=E501
+ "libelf are uninstalled. This is both useful and dangerous, like rm -r.") # NOQA: ignore=E501
subparser.add_argument(
'-d', '--dependents', action='store_true', dest='dependents',
- help='Also uninstall any packages that depend on the ones given via command line.'
+ help='Also uninstall any packages that depend on the ones given via command line.' # NOQA: ignore=E501
)
subparser.add_argument(
'-y', '--yes-to-all', action='store_true', dest='yes_to_all',
- help='Assume "yes" is the answer to every confirmation asked to the user.'
+ help='Assume "yes" is the answer to every confirmation asked to the user.' # NOQA: ignore=E501
)
- subparser.add_argument('packages', nargs=argparse.REMAINDER, help="specs of packages to uninstall")
+ subparser.add_argument(
+ 'packages',
+ nargs=argparse.REMAINDER,
+ help="specs of packages to uninstall"
+ )
def concretize_specs(specs, allow_multiple_matches=False, force=False):
- """
- Returns a list of specs matching the non necessarily concretized specs given from cli
+ """Returns a list of specs matching the non necessarily
+ concretized specs given from cli
Args:
specs: list of specs to be matched against installed packages
- allow_multiple_matches : boolean (if True multiple matches for each item in specs are admitted)
+ allow_multiple_matches : if True multiple matches are admitted
Return:
list of specs
"""
- specs_from_cli = [] # List of specs that match expressions given via command line
+ # List of specs that match expressions given via command line
+ specs_from_cli = []
has_errors = False
for spec in specs:
matching = spack.installed_db.query(spec)
@@ -99,7 +92,7 @@ def concretize_specs(specs, allow_multiple_matches=False, force=False):
if not allow_multiple_matches and len(matching) > 1:
tty.error("%s matches multiple packages:" % spec)
print()
- display_specs(matching, **display_args)
+ spack.cmd.display_specs(matching, **display_args)
print()
has_errors = True
@@ -116,8 +109,8 @@ def concretize_specs(specs, allow_multiple_matches=False, force=False):
def installed_dependents(specs):
- """
- Returns a dictionary that maps a spec with a list of its installed dependents
+ """Returns a dictionary that maps a spec with a list of its
+ installed dependents
Args:
specs: list of specs to be checked for dependents
@@ -147,7 +140,7 @@ def do_uninstall(specs, force):
try:
# should work if package is known to spack
packages.append(item.package)
- except spack.repository.UnknownPackageError as e:
+ except spack.repository.UnknownPackageError:
# The package.py file has gone away -- but still
# want to uninstall.
spack.Package(item).do_uninstall(force=True)
@@ -169,17 +162,20 @@ def uninstall(parser, args):
with spack.installed_db.write_transaction():
specs = spack.cmd.parse_specs(args.packages)
# Gets the list of installed specs that match the ones give via cli
- uninstall_list = concretize_specs(specs, args.all, args.force) # takes care of '-a' is given in the cli
- dependent_list = installed_dependents(uninstall_list) # takes care of '-d'
+ # takes care of '-a' is given in the cli
+ uninstall_list = concretize_specs(specs, args.all, args.force)
+ dependent_list = installed_dependents(
+ uninstall_list) # takes care of '-d'
# Process dependent_list and update uninstall_list
has_error = False
if dependent_list and not args.dependents and not args.force:
for spec, lst in dependent_list.items():
- tty.error("Will not uninstall %s" % spec.format("$_$@$%@$#", color=True))
+ tty.error("Will not uninstall %s" %
+ spec.format("$_$@$%@$#", color=True))
print('')
print("The following packages depend on it:")
- display_specs(lst, **display_args)
+ spack.cmd.display_specs(lst, **display_args)
print('')
has_error = True
elif args.dependents:
@@ -188,14 +184,14 @@ def uninstall(parser, args):
uninstall_list = list(set(uninstall_list))
if has_error:
- tty.die('You can use spack uninstall --dependents to uninstall these dependencies as well')
+ tty.die('You can use spack uninstall --dependents to uninstall these dependencies as well') # NOQA: ignore=E501
if not args.yes_to_all:
tty.msg("The following packages will be uninstalled : ")
print('')
- display_specs(uninstall_list, **display_args)
+ spack.cmd.display_specs(uninstall_list, **display_args)
print('')
- ask_for_confirmation('Do you want to proceed ? ')
+ spack.cmd.ask_for_confirmation('Do you want to proceed ? ')
# Uninstall everything on the list
do_uninstall(uninstall_list, args.force)
diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py
index d9992a5680..386df08b2e 100644
--- a/lib/spack/spack/concretize.py
+++ b/lib/spack/spack/concretize.py
@@ -103,7 +103,7 @@ class DefaultConcretizer(object):
usable.sort(cmp=cmp_externals)
return usable
-
+ # XXX(deptypes): Look here.
def choose_virtual_or_external(self, spec):
"""Given a list of candidate virtual and external packages, try to
find one that is most ABI compatible.
@@ -394,8 +394,10 @@ def find_spec(spec, condition):
"""Searches the dag from spec in an intelligent order and looks
for a spec that matches a condition"""
# First search parents, then search children
- dagiter = chain(spec.traverse(direction='parents', root=False),
- spec.traverse(direction='children', root=False))
+ deptype = ('build', 'link')
+ dagiter = chain(
+ spec.traverse(direction='parents', deptype=deptype, root=False),
+ spec.traverse(direction='children', deptype=deptype, root=False))
visited = set()
for relative in dagiter:
if condition(relative):
@@ -403,7 +405,7 @@ def find_spec(spec, condition):
visited.add(id(relative))
# Then search all other relatives in the DAG *except* spec
- for relative in spec.root.traverse():
+ for relative in spec.root.traverse(deptypes=spack.alldeps):
if relative is spec: continue
if id(relative) in visited: continue
if condition(relative):
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index 84179e1469..8b5e96f97d 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -328,6 +328,11 @@ section_schemas = {
'anyOf': [
{
'properties': {
+ 'hash_length': {
+ 'type': 'integer',
+ 'minimum': 0,
+ 'default': 7
+ },
'whitelist': {'$ref': '#/definitions/array_of_strings'},
'blacklist': {'$ref': '#/definitions/array_of_strings'},
'naming_scheme': {
@@ -492,8 +497,15 @@ class ConfigScope(object):
"""Empty cached config information."""
self.sections = {}
+"""Default configuration scope is the lowest-level scope. These are
+ versioned with Spack and can be overridden by sites or users."""
+ConfigScope('defaults', os.path.join(spack.etc_path, 'spack', 'defaults'))
-ConfigScope('site', os.path.join(spack.etc_path, 'spack')),
+"""Site configuration is per spack instance, for sites or projects.
+ No site-level configs should be checked into spack by default."""
+ConfigScope('site', os.path.join(spack.etc_path, 'spack'))
+
+"""User configuration can override both spack defaults and site config."""
ConfigScope('user', os.path.expanduser('~/.spack'))
diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py
index a4bbff3d5a..317b0d5784 100644
--- a/lib/spack/spack/database.py
+++ b/lib/spack/spack/database.py
@@ -60,7 +60,7 @@ from spack.repository import UnknownPackageError
_db_dirname = '.spack-db'
# DB version. This is stuck in the DB file to track changes in format.
-_db_version = Version('0.9.1')
+_db_version = Version('0.9.2')
# Default timeout for spack database locks is 5 min.
_db_lock_timeout = 60
@@ -215,9 +215,10 @@ class Database(object):
# Add dependencies from other records in the install DB to
# form a full spec.
if 'dependencies' in spec_dict[spec.name]:
- for dep_hash in spec_dict[spec.name]['dependencies'].values():
- child = self._read_spec_from_yaml(dep_hash, installs, hash_key)
- spec._add_dependency(child)
+ yaml_deps = spec_dict[spec.name]['dependencies']
+ for dname, dhash, dtypes in Spec.read_yaml_dep_specs(yaml_deps):
+ child = self._read_spec_from_yaml(dhash, installs, hash_key)
+ spec._add_dependency(child, dtypes)
# Specs from the database need to be marked concrete because
# they represent actual installations.
@@ -334,7 +335,10 @@ class Database(object):
counts = {}
for key, rec in self._data.items():
counts.setdefault(key, 0)
- for dep in rec.spec.dependencies.values():
+ # XXX(deptype): This checks all dependencies, but build
+ # dependencies might be able to be dropped in the
+ # future.
+ for dep in rec.spec.dependencies():
dep_key = dep.dag_hash()
counts.setdefault(dep_key, 0)
counts[dep_key] += 1
@@ -406,7 +410,7 @@ class Database(object):
else:
self._data[key] = InstallRecord(spec, path, True,
explicit=explicit)
- for dep in spec.dependencies.values():
+ for dep in spec.dependencies(('link', 'run')):
self._increment_ref_count(dep, directory_layout)
def _increment_ref_count(self, spec, directory_layout=None):
@@ -421,7 +425,7 @@ class Database(object):
self._data[key] = InstallRecord(spec.copy(), path, installed)
- for dep in spec.dependencies.values():
+ for dep in spec.dependencies('link'):
self._increment_ref_count(dep)
self._data[key].ref_count += 1
@@ -466,7 +470,7 @@ class Database(object):
if rec.ref_count == 0 and not rec.installed:
del self._data[key]
- for dep in spec.dependencies.values():
+ for dep in spec.dependencies('link'):
self._decrement_ref_count(dep)
def _remove(self, spec):
@@ -480,7 +484,7 @@ class Database(object):
return rec.spec
del self._data[key]
- for dep in rec.spec.dependencies.values():
+ for dep in rec.spec.dependencies('link'):
self._decrement_ref_count(dep)
# Returns the concrete spec so we know it in the case where a
@@ -631,13 +635,14 @@ class WriteTransaction(_Transaction):
class CorruptDatabaseError(SpackError):
def __init__(self, path, msg=''):
super(CorruptDatabaseError, self).__init__(
- "Spack database is corrupt: %s. %s." + \
- "Try running `spack reindex` to fix." % (path, msg))
+ "Spack database is corrupt: %s. %s." % (path, msg),
+ "Try running `spack reindex` to fix.")
class InvalidDatabaseVersionError(SpackError):
def __init__(self, expected, found):
super(InvalidDatabaseVersionError, self).__init__(
- "Expected database version %s but found version %s." + \
- "Try running `spack reindex` to fix." %
- (expected, found))
+ "Expected database version %s but found version %s."
+ % (expected, found),
+ "`spack reindex` may fix this, or you may need a newer "
+ "Spack version.")
diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py
index ca8f21dc08..e92dd6fb67 100644
--- a/lib/spack/spack/directives.py
+++ b/lib/spack/spack/directives.py
@@ -171,7 +171,7 @@ def version(pkg, ver, checksum=None, **kwargs):
pkg.versions[Version(ver)] = kwargs
-def _depends_on(pkg, spec, when=None):
+def _depends_on(pkg, spec, when=None, type=None):
# If when is False do nothing
if when is False:
return
@@ -180,10 +180,29 @@ def _depends_on(pkg, spec, when=None):
when = pkg.name
when_spec = parse_anonymous_spec(when, pkg.name)
+ if type is None:
+ # The default deptype is build and link because the common case is to
+ # build against a library which then turns into a runtime dependency
+ # due to the linker.
+ # XXX(deptype): Add 'run' to this? It's an uncommon dependency type,
+ # but is most backwards-compatible.
+ type = ('build', 'link')
+
+ if isinstance(type, str):
+ type = spack.spec.special_types.get(type, (type,))
+
+ for deptype in type:
+ if deptype not in spack.spec.alldeps:
+ raise UnknownDependencyTypeError('depends_on', pkg.name, deptype)
+
dep_spec = Spec(spec)
if pkg.name == dep_spec.name:
raise CircularReferenceError('depends_on', pkg.name)
+ pkg_deptypes = pkg._deptypes.setdefault(dep_spec.name, set())
+ for deptype in type:
+ pkg_deptypes.add(deptype)
+
conditions = pkg.dependencies.setdefault(dep_spec.name, {})
if when_spec in conditions:
conditions[when_spec].constrain(dep_spec, deps=False)
@@ -191,13 +210,13 @@ def _depends_on(pkg, spec, when=None):
conditions[when_spec] = dep_spec
-@directive('dependencies')
-def depends_on(pkg, spec, when=None):
+@directive(('dependencies', '_deptypes'))
+def depends_on(pkg, spec, when=None, type=None):
"""Creates a dict of deps with specs defining when they apply."""
- _depends_on(pkg, spec, when=when)
+ _depends_on(pkg, spec, when=when, type=type)
-@directive(('extendees', 'dependencies'))
+@directive(('extendees', 'dependencies', '_deptypes'))
def extends(pkg, spec, **kwargs):
"""Same as depends_on, but dependency is symlinked into parent prefix.
@@ -326,3 +345,13 @@ class CircularReferenceError(DirectiveError):
directive,
"Package '%s' cannot pass itself to %s" % (package, directive))
self.package = package
+
+
+class UnknownDependencyTypeError(DirectiveError):
+ """This is raised when a dependency is of an unknown type."""
+ def __init__(self, directive, package, deptype):
+ super(UnknownDependencyTypeError, self).__init__(
+ directive,
+ "Package '%s' cannot depend on a package via %s." %
+ (package, deptype))
+ self.package = package
diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index ee13e2dcbc..8150a6da2b 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -34,6 +34,7 @@ import yaml
import llnl.util.tty as tty
from llnl.util.filesystem import join_path, mkdirp
+import spack
from spack.spec import Spec
from spack.error import SpackError
@@ -223,8 +224,14 @@ class YamlDirectoryLayout(DirectoryLayout):
def read_spec(self, path):
"""Read the contents of a file and parse them as a spec"""
- with open(path) as f:
- spec = Spec.from_yaml(f)
+ try:
+ with open(path) as f:
+ spec = Spec.from_yaml(f)
+ except Exception as e:
+ if spack.debug:
+ raise
+ raise SpecReadError(
+ 'Unable to read file: %s' % path, 'Cause: ' + str(e))
# Specs read from actual installations are always concrete
spec._mark_concrete()
@@ -285,7 +292,7 @@ class YamlDirectoryLayout(DirectoryLayout):
return path
if spec.dag_hash() == installed_spec.dag_hash():
- raise SpecHashCollisionError(installed_hash, spec_hash)
+ raise SpecHashCollisionError(spec, installed_spec)
else:
raise InconsistentInstallDirectoryError(
'Spec file in %s does not match hash!' % spec_file_path)
@@ -431,7 +438,7 @@ class SpecHashCollisionError(DirectoryLayoutError):
def __init__(self, installed_spec, new_spec):
super(SpecHashCollisionError, self).__init__(
'Specs %s and %s have the same SHA-1 prefix!'
- % installed_spec, new_spec)
+ % (installed_spec, new_spec))
class RemoveFailedError(DirectoryLayoutError):
@@ -456,10 +463,12 @@ class InstallDirectoryAlreadyExistsError(DirectoryLayoutError):
"Install path %s already exists!")
+class SpecReadError(DirectoryLayoutError):
+ """Raised when directory layout can't read a spec."""
+
+
class InvalidExtensionSpecError(DirectoryLayoutError):
"""Raised when an extension file has a bad spec in it."""
- def __init__(self, message):
- super(InvalidExtensionSpecError, self).__init__(message)
class ExtensionAlreadyInstalledError(DirectoryLayoutError):
diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py
index 22058d41d8..063e4647b6 100644
--- a/lib/spack/spack/graph.py
+++ b/lib/spack/spack/graph.py
@@ -80,12 +80,14 @@ def topological_sort(spec, **kwargs):
"""
reverse = kwargs.get('reverse', False)
+ # XXX(deptype): iterate over a certain kind of dependency. Maybe color
+ # edges based on the type of dependency?
if not reverse:
- parents = lambda s: s.dependents
- children = lambda s: s.dependencies
+ parents = lambda s: s.dependents()
+ children = lambda s: s.dependencies()
else:
- parents = lambda s: s.dependencies
- children = lambda s: s.dependents
+ parents = lambda s: s.dependencies()
+ children = lambda s: s.dependents()
# Work on a copy so this is nondestructive.
spec = spec.copy()
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index ce46047fa3..72656b8ae0 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -120,7 +120,7 @@ def dependencies(spec, request='all'):
return []
if request == 'direct':
- return [xx for _, xx in spec.dependencies.items()]
+ return spec.dependencies()
# FIXME : during module file creation nodes seem to be visited multiple
# FIXME : times even if cover='nodes' is given. This work around permits
@@ -188,6 +188,8 @@ def parse_config_options(module_generator):
#####
# Automatic loading loads
+ module_file_actions['hash_length'] = module_configuration.get(
+ 'hash_length', 7)
module_file_actions['autoload'] = dependencies(
module_generator.spec, module_file_actions.get('autoload', 'none'))
# Prerequisites
@@ -237,6 +239,7 @@ class EnvModule(object):
formats = {}
class __metaclass__(type):
+
def __init__(cls, name, bases, dict):
type.__init__(cls, name, bases, dict)
if cls.name != 'env_module' and cls.name in CONFIGURATION[
@@ -295,7 +298,9 @@ class EnvModule(object):
if constraint in self.spec:
suffixes.append(suffix)
# Always append the hash to make the module file unique
- suffixes.append(self.spec.dag_hash())
+ hash_length = configuration.pop('hash_length', 7)
+ if hash_length != 0:
+ suffixes.append(self.spec.dag_hash(length=hash_length))
name = '-'.join(suffixes)
return name
@@ -338,7 +343,7 @@ class EnvModule(object):
return False
- def write(self):
+ def write(self, overwrite=False):
"""
Writes out a module file for this object.
@@ -399,6 +404,15 @@ class EnvModule(object):
for line in self.module_specific_content(module_configuration):
module_file_content += line
+ # Print a warning in case I am accidentally overwriting
+ # a module file that is already there (name clash)
+ if not overwrite and os.path.exists(self.file_name):
+ message = 'Module file already exists : skipping creation\n'
+ message += 'file : {0.file_name}\n'
+ message += 'spec : {0.spec}'
+ tty.warn(message.format(self))
+ return
+
# Dump to file
with open(self.file_name, 'w') as f:
f.write(module_file_content)
@@ -454,7 +468,7 @@ class EnvModule(object):
class Dotkit(EnvModule):
name = 'dotkit'
-
+ path = join_path(spack.share_path, 'dotkit')
environment_modifications_formats = {
PrependPath: 'dk_alter {name} {value}\n',
SetEnv: 'dk_setenv {name} {value}\n'
@@ -466,7 +480,7 @@ class Dotkit(EnvModule):
@property
def file_name(self):
- return join_path(spack.share_path, "dotkit", self.spec.architecture,
+ return join_path(self.path, self.spec.architecture,
'%s.dk' % self.use_name)
@property
@@ -494,7 +508,7 @@ class Dotkit(EnvModule):
class TclModule(EnvModule):
name = 'tcl'
-
+ path = join_path(spack.share_path, "modules")
environment_modifications_formats = {
PrependPath: 'prepend-path --delim "{delim}" {name} \"{value}\"\n',
AppendPath: 'append-path --delim "{delim}" {name} \"{value}\"\n',
@@ -514,7 +528,7 @@ class TclModule(EnvModule):
@property
def file_name(self):
- return join_path(spack.share_path, "modules", self.spec.architecture, self.use_name)
+ return join_path(self.path, self.spec.architecture, self.use_name)
@property
def header(self):
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index 74008c4dd9..c916bfaaa2 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -37,7 +37,6 @@ import os
import re
import textwrap
import time
-import glob
import string
import llnl.util.tty as tty
@@ -62,10 +61,10 @@ from llnl.util.tty.log import log_output
from spack.stage import Stage, ResourceStage, StageComposite
from spack.util.compression import allowed_archive
from spack.util.environment import dump_environment
-from spack.util.executable import ProcessError, Executable, which
+from spack.util.executable import ProcessError, which
from spack.version import *
from spack import directory_layout
-from urlparse import urlparse
+
"""Allowed URL schemes for spack packages."""
_ALLOWED_URL_SCHEMES = ["http", "https", "ftp", "file", "git"]
@@ -410,7 +409,6 @@ class Package(object):
"""Return the directory where the package.py file lives."""
return os.path.dirname(self.module.__file__)
-
@property
def global_license_dir(self):
"""Returns the directory where global license files for all
@@ -565,6 +563,11 @@ class Package(object):
def fetcher(self, f):
self._fetcher = f
+ def dependencies_of_type(self, *deptypes):
+ """Get subset of the dependencies with certain types."""
+ return dict((name, conds) for name, conds in self.dependencies.items()
+ if any(d in self._deptypes[name] for d in deptypes))
+
@property
def extendee_spec(self):
"""
@@ -577,7 +580,7 @@ class Package(object):
name = next(iter(self.extendees))
# If the extendee is in the spec's deps already, return that.
- for dep in self.spec.traverse():
+ for dep in self.spec.traverse(deptypes=('link', 'run')):
if name == dep.name:
return dep
@@ -642,12 +645,13 @@ class Package(object):
yield self
for name in sorted(self.dependencies.keys()):
- spec = self.dependencies[name]
+ dep_spec = self.get_dependency(name)
+ spec = dep_spec.spec
- # currently, we do not descend into virtual dependencies, as this
+ # Currently, we do not descend into virtual dependencies, as this
# makes doing a sensible traversal much harder. We just assume
# that ANY of the virtual deps will work, which might not be true
- # (due to conflicts or unsatisfiable specs). For now this is ok
+ # (due to conflicts or unsatisfiable specs). For now this is ok,
# but we might want to reinvestigate if we start using a lot of
# complicated virtual dependencies
# TODO: reinvestigate this.
@@ -685,7 +689,9 @@ class Package(object):
for spec in spack.installed_db.query():
if self.name == spec.name:
continue
- for dep in spec.traverse():
+ # XXX(deptype): Should build dependencies not count here?
+ # for dep in spec.traverse(deptype=('run')):
+ for dep in spec.traverse(deptype=spack.alldeps):
if self.spec == dep:
dependents.append(spec)
return dependents
@@ -696,13 +702,13 @@ class Package(object):
return self.spec.prefix
@property
- #TODO: Change this to architecture
+ # TODO: Change this to architecture
def compiler(self):
"""Get the spack.compiler.Compiler object used to build this package"""
if not self.spec.concrete:
raise ValueError("Can only get a compiler for a concrete package.")
return spack.compilers.compiler_for_spec(self.spec.compiler,
- self.spec.architecture)
+ self.spec.architecture)
def url_version(self, version):
"""
@@ -758,7 +764,6 @@ class Package(object):
self.stage.cache_local()
-
def do_stage(self, mirror_only=False):
"""Unpacks the fetched tarball, then changes into the expanded tarball
directory."""
@@ -876,6 +881,7 @@ class Package(object):
return resource_stage_folder
install_phases = set(['configure', 'build', 'install', 'provenance'])
+
def do_install(self,
keep_prefix=False,
keep_stage=False,
@@ -887,7 +893,7 @@ class Package(object):
fake=False,
explicit=False,
dirty=False,
- install_phases = install_phases):
+ install_phases=install_phases):
"""Called by commands to install a package and its dependencies.
Package implementations should override install() to describe
@@ -908,7 +914,8 @@ class Package(object):
run_tests -- Runn tests within the package's install()
"""
if not self.spec.concrete:
- raise ValueError("Can only install concrete packages.")
+ raise ValueError("Can only install concrete packages: %s."
+ % self.spec.name)
# No installation needed if package is external
if self.spec.external:
@@ -917,7 +924,8 @@ class Package(object):
return
# Ensure package is not already installed
- if 'install' in install_phases and spack.install_layout.check_installed(self.spec):
+ layout = spack.install_layout
+ if 'install' in install_phases and layout.check_installed(self.spec):
tty.msg("%s is already installed in %s" % (self.name, self.prefix))
rec = spack.installed_db.get_record(self.spec)
if (not rec.explicit) and explicit:
@@ -998,20 +1006,17 @@ class Package(object):
if 'install' in self.install_phases:
self.sanity_check_prefix()
-
# Copy provenance into the install directory on success
if 'provenance' in self.install_phases:
- log_install_path = spack.install_layout.build_log_path(
- self.spec)
- env_install_path = spack.install_layout.build_env_path(
- self.spec)
- packages_dir = spack.install_layout.build_packages_path(
- self.spec)
+ log_install_path = layout.build_log_path(self.spec)
+ env_install_path = layout.build_env_path(self.spec)
+ packages_dir = layout.build_packages_path(self.spec)
# Remove first if we're overwriting another build
# (can happen with spack setup)
try:
- shutil.rmtree(packages_dir) # log_install_path and env_install_path are inside this
+ # log_install_path and env_install_path are here
+ shutil.rmtree(packages_dir)
except:
pass
@@ -1038,7 +1043,7 @@ class Package(object):
except directory_layout.InstallDirectoryAlreadyExistsError:
if 'install' in install_phases:
# Abort install if install directory exists.
- # But do NOT remove it (you'd be overwriting someon else's stuff)
+ # But do NOT remove it (you'd be overwriting someone's data)
tty.warn("Keeping existing install prefix in place.")
raise
else:
@@ -1089,7 +1094,7 @@ class Package(object):
def do_install_dependencies(self, **kwargs):
# Pass along paths of dependencies here
- for dep in self.spec.dependencies.values():
+ for dep in self.spec.dependencies():
dep.package.do_install(**kwargs)
@property
@@ -1270,7 +1275,7 @@ class Package(object):
(self.name, self.extendee.name))
def do_activate(self, force=False):
- """Called on an etension to invoke the extendee's activate method.
+ """Called on an extension to invoke the extendee's activate method.
Commands should call this routine, and should not call
activate() directly.
@@ -1282,7 +1287,7 @@ class Package(object):
# Activate any package dependencies that are also extensions.
if not force:
- for spec in self.spec.traverse(root=False):
+ for spec in self.spec.traverse(root=False, deptype='run'):
if spec.package.extends(self.extendee_spec):
if not spec.package.activated:
spec.package.do_activate(force=force)
@@ -1328,7 +1333,7 @@ class Package(object):
for name, aspec in activated.items():
if aspec == self.spec:
continue
- for dep in aspec.traverse():
+ for dep in aspec.traverse(deptype='run'):
if self.spec == dep:
raise ActivationError(
"Cannot deactivate %s because %s is activated and depends on it." # NOQA: ignore=E501
@@ -1414,9 +1419,10 @@ class Package(object):
def rpath(self):
"""Get the rpath this package links with, as a list of paths."""
rpaths = [self.prefix.lib, self.prefix.lib64]
- rpaths.extend(d.prefix.lib for d in self.spec.traverse(root=False)
+ deps = self.spec.dependencies(deptype='link')
+ rpaths.extend(d.prefix.lib for d in deps
if os.path.isdir(d.prefix.lib))
- rpaths.extend(d.prefix.lib64 for d in self.spec.traverse(root=False)
+ rpaths.extend(d.prefix.lib64 for d in deps
if os.path.isdir(d.prefix.lib64))
return rpaths
@@ -1433,6 +1439,13 @@ def install_dependency_symlinks(pkg, spec, prefix):
flatten_dependencies(spec, prefix)
+def use_cray_compiler_names():
+ """Compiler names for builds that rely on cray compiler names."""
+ os.environ['CC'] = 'cc'
+ os.environ['CXX'] = 'CC'
+ os.environ['FC'] = 'ftn'
+ os.environ['F77'] = 'ftn'
+
def flatten_dependencies(spec, flat_dir):
"""Make each dependency of spec present in dir via symlink."""
for dep in spec.traverse(root=False):
@@ -1529,24 +1542,29 @@ def _hms(seconds):
parts.append("%.2fs" % s)
return ' '.join(parts)
+
class StagedPackage(Package):
"""A Package subclass where the install() is split up into stages."""
def install_setup(self):
- """Creates an spack_setup.py script to configure the package later if we like."""
- raise InstallError("Package %s provides no install_setup() method!" % self.name)
+ """Creates a spack_setup.py script to configure the package later."""
+ raise InstallError(
+ "Package %s provides no install_setup() method!" % self.name)
def install_configure(self):
"""Runs the configure process."""
- raise InstallError("Package %s provides no install_configure() method!" % self.name)
+ raise InstallError(
+ "Package %s provides no install_configure() method!" % self.name)
def install_build(self):
"""Runs the build process."""
- raise InstallError("Package %s provides no install_build() method!" % self.name)
+ raise InstallError(
+ "Package %s provides no install_build() method!" % self.name)
def install_install(self):
"""Runs the install process."""
- raise InstallError("Package %s provides no install_install() method!" % self.name)
+ raise InstallError(
+ "Package %s provides no install_install() method!" % self.name)
def install(self, spec, prefix):
if 'setup' in self.install_phases:
@@ -1563,9 +1581,10 @@ class StagedPackage(Package):
else:
# Create a dummy file so the build doesn't fail.
# That way, the module file will also be created.
- with open(os.path.join(prefix, 'dummy'), 'w') as fout:
+ with open(os.path.join(prefix, 'dummy'), 'w'):
pass
+
# stackoverflow.com/questions/12791997/how-do-you-do-a-simple-chmod-x-from-within-python
def make_executable(path):
mode = os.stat(path).st_mode
@@ -1573,9 +1592,7 @@ def make_executable(path):
os.chmod(path, mode)
-
class CMakePackage(StagedPackage):
-
def make_make(self):
import multiprocessing
# number of jobs spack will to build with.
@@ -1589,37 +1606,41 @@ class CMakePackage(StagedPackage):
return make
def configure_args(self):
- """Returns package-specific arguments to be provided to the configure command."""
+ """Returns package-specific arguments to be provided to
+ the configure command.
+ """
return list()
def configure_env(self):
- """Returns package-specific environment under which the configure command should be run."""
+ """Returns package-specific environment under which the
+ configure command should be run.
+ """
return dict()
- def spack_transitive_include_path(self):
+ def transitive_inc_path(self):
return ';'.join(
os.path.join(dep, 'include')
for dep in os.environ['SPACK_DEPENDENCIES'].split(os.pathsep)
)
def install_setup(self):
- cmd = [str(which('cmake'))] + \
- spack.build_environment.get_std_cmake_args(self) + \
- ['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'],
- '-DCMAKE_C_COMPILER=%s' % os.environ['SPACK_CC'],
- '-DCMAKE_CXX_COMPILER=%s' % os.environ['SPACK_CXX'],
- '-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']] + \
- self.configure_args()
-
- env = dict()
- env['PATH'] = os.environ['PATH']
- env['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path()
- env['CMAKE_PREFIX_PATH'] = os.environ['CMAKE_PREFIX_PATH']
+ cmd = [str(which('cmake'))]
+ cmd += spack.build_environment.get_std_cmake_args(self)
+ cmd += ['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'],
+ '-DCMAKE_C_COMPILER=%s' % os.environ['SPACK_CC'],
+ '-DCMAKE_CXX_COMPILER=%s' % os.environ['SPACK_CXX'],
+ '-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']]
+ cmd += self.configure_args()
+
+ env = {
+ 'PATH': os.environ['PATH'],
+ 'SPACK_TRANSITIVE_INCLUDE_PATH': self.transitive_inc_path(),
+ 'CMAKE_PREFIX_PATH': os.environ['CMAKE_PREFIX_PATH']
+ }
setup_fname = 'spconfig.py'
with open(setup_fname, 'w') as fout:
- fout.write(\
-r"""#!%s
+ fout.write(r"""#!%s
#
import sys
@@ -1627,7 +1648,7 @@ import os
import subprocess
def cmdlist(str):
- return list(x.strip().replace("'",'') for x in str.split('\n') if x)
+ return list(x.strip().replace("'",'') for x in str.split('\n') if x)
env = dict(os.environ)
""" % sys.executable)
@@ -1635,34 +1656,39 @@ env = dict(os.environ)
for name in env_vars:
val = env[name]
if string.find(name, 'PATH') < 0:
- fout.write('env[%s] = %s\n' % (repr(name),repr(val)))
+ fout.write('env[%s] = %s\n' % (repr(name), repr(val)))
else:
if name == 'SPACK_TRANSITIVE_INCLUDE_PATH':
sep = ';'
else:
sep = ':'
- fout.write('env[%s] = "%s".join(cmdlist("""\n' % (repr(name),sep))
+ fout.write('env[%s] = "%s".join(cmdlist("""\n'
+ % (repr(name), sep))
for part in string.split(val, sep):
fout.write(' %s\n' % part)
fout.write('"""))\n')
- fout.write("env['CMAKE_TRANSITIVE_INCLUDE_PATH'] = env['SPACK_TRANSITIVE_INCLUDE_PATH'] # Deprecated\n")
+ fout.write("env['CMAKE_TRANSITIVE_INCLUDE_PATH'] = "
+ "env['SPACK_TRANSITIVE_INCLUDE_PATH'] # Deprecated\n")
fout.write('\ncmd = cmdlist("""\n')
fout.write('%s\n' % cmd[0])
for arg in cmd[1:]:
fout.write(' %s\n' % arg)
fout.write('""") + sys.argv[1:]\n')
- fout.write('\nproc = subprocess.Popen(cmd, env=env)\nproc.wait()\n')
+ fout.write('\nproc = subprocess.Popen(cmd, env=env)\n')
+ fout.write('proc.wait()\n')
make_executable(setup_fname)
-
def install_configure(self):
cmake = which('cmake')
with working_dir(self.build_directory, create=True):
- os.environ.update(self.configure_env())
- os.environ['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path()
- options = self.configure_args() + spack.build_environment.get_std_cmake_args(self)
+ env = os.environ
+ env.update(self.configure_env())
+ env['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.transitive_inc_path()
+
+ options = self.configure_args()
+ options += spack.build_environment.get_std_cmake_args(self)
cmake(self.source_directory, *options)
def install_build(self):
diff --git a/lib/spack/spack/platforms/cray_xc.py b/lib/spack/spack/platforms/cray_xc.py
index e710303e23..2b065d5bbd 100644
--- a/lib/spack/spack/platforms/cray_xc.py
+++ b/lib/spack/spack/platforms/cray_xc.py
@@ -2,6 +2,8 @@ import os
from spack.architecture import Platform, Target
from spack.operating_systems.linux_distro import LinuxDistro
from spack.operating_systems.cnl import Cnl
+from spack.util.executable import which
+
class CrayXc(Platform):
priority = 20
@@ -9,9 +11,8 @@ class CrayXc(Platform):
back_end = 'ivybridge'
default = 'ivybridge'
- front_os = "SuSE11"
back_os = "CNL10"
- default_os = "CNL10"
+ default_os = "CNL10"
def __init__(self):
''' Since cori doesn't have ivybridge as a front end it's better
@@ -32,15 +33,37 @@ class CrayXc(Platform):
# Could switch to use modules and fe targets for front end
# Currently using compilers by path for front end.
self.add_target('sandybridge', Target('sandybridge'))
- self.add_target('ivybridge',
+ self.add_target('ivybridge',
Target('ivybridge', 'craype-ivybridge'))
- self.add_target('haswell',
- Target('haswell','craype-haswell'))
+ self.add_target('haswell',
+ Target('haswell', 'craype-haswell'))
- self.add_operating_system('SuSE11', LinuxDistro())
+ # Front end of the cray platform is a linux distro.
+ linux_dist = LinuxDistro()
+ self.front_os = str(linux_dist)
+ self.add_operating_system(str(linux_dist), linux_dist)
self.add_operating_system('CNL10', Cnl())
@classmethod
- def detect(self):
- return os.path.exists('/opt/cray/craype')
+ def setup_platform_environment(self, pkg, env):
+ """ Change the linker to default dynamic to be more
+ similar to linux/standard linker behavior
+ """
+ env.set('CRAYPE_LINK_TYPE', 'dynamic')
+ cray_wrapper_names = join_path(spack.build_env_path, 'cray')
+ if os.path.isdir(cray_wrapper_names):
+ env.prepend_path('PATH', cray_wrapper_names)
+ @classmethod
+ def detect(self):
+ try:
+ cc_verbose = which('ftn')
+ text = cc_verbose('-craype-verbose',
+ output=str, error=str,
+ ignore_errors=True).split()
+ if '-D__CRAYXC' in text:
+ return True
+ else:
+ return False
+ except:
+ return False
diff --git a/lib/spack/spack/preferred_packages.py b/lib/spack/spack/preferred_packages.py
index 4820584150..1b94f03de7 100644
--- a/lib/spack/spack/preferred_packages.py
+++ b/lib/spack/spack/preferred_packages.py
@@ -26,8 +26,10 @@
import spack
from spack.version import *
+
class PreferredPackages(object):
- _default_order = {'compiler' : [ 'gcc', 'intel', 'clang', 'pgi', 'xlc' ] } # Arbitrary, but consistent
+ # Arbitrary, but consistent
+ _default_order = {'compiler': ['gcc', 'intel', 'clang', 'pgi', 'xlc']}
def __init__(self):
self.preferred = spack.config.get_config('packages')
@@ -35,24 +37,25 @@ class PreferredPackages(object):
# Given a package name, sort component (e.g, version, compiler, ...), and
# a second_key (used by providers), return the list
- def _order_for_package(self, pkgname, component, second_key, test_all=True):
+ def _order_for_package(self, pkgname, component, second_key,
+ test_all=True):
pkglist = [pkgname]
if test_all:
pkglist.append('all')
for pkg in pkglist:
order = self.preferred.get(pkg, {}).get(component, {})
- if type(order) is dict:
+ if isinstance(order, dict) and second_key:
order = order.get(second_key, {})
if not order:
continue
return [str(s).strip() for s in order]
return []
-
# A generic sorting function. Given a package name and sort
# component, return less-than-0, 0, or greater-than-0 if
# a is respectively less-than, equal to, or greater than b.
- def _component_compare(self, pkgname, component, a, b, reverse_natural_compare, second_key):
+ def _component_compare(self, pkgname, component, a, b,
+ reverse_natural_compare, second_key):
if a is None:
return -1
if b is None:
@@ -84,92 +87,102 @@ class PreferredPackages(object):
else:
return 0
-
# A sorting function for specs. Similar to component_compare, but
# a and b are considered to match entries in the sorting list if they
# satisfy the list component.
- def _spec_compare(self, pkgname, component, a, b, reverse_natural_compare, second_key):
- if not a or not a.concrete:
+ def _spec_compare(self, pkgname, component, a, b,
+ reverse_natural_compare, second_key):
+ if not a or (not a.concrete and not second_key):
return -1
- if not b or not b.concrete:
+ if not b or (not b.concrete and not second_key):
return 1
specs = self._spec_for_pkgname(pkgname, component, second_key)
a_index = None
b_index = None
reverse = -1 if reverse_natural_compare else 1
for i, cspec in enumerate(specs):
- if a_index == None and (cspec.satisfies(a) or a.satisfies(cspec)):
+ if a_index is None and (cspec.satisfies(a) or a.satisfies(cspec)):
a_index = i
if b_index:
break
- if b_index == None and (cspec.satisfies(b) or b.satisfies(cspec)):
+ if b_index is None and (cspec.satisfies(b) or b.satisfies(cspec)):
b_index = i
if a_index:
break
- if a_index != None and b_index == None: return -1
- elif a_index == None and b_index != None: return 1
- elif a_index != None and b_index == a_index: return -1 * cmp(a, b)
- elif a_index != None and b_index != None and a_index != b_index: return cmp(a_index, b_index)
- else: return cmp(a, b) * reverse
-
-
+ if a_index is not None and b_index is None:
+ return -1
+ elif a_index is None and b_index is not None:
+ return 1
+ elif a_index is not None and b_index == a_index:
+ return -1 * cmp(a, b)
+ elif (a_index is not None and b_index is not None and
+ a_index != b_index):
+ return cmp(a_index, b_index)
+ else:
+ return cmp(a, b) * reverse
# Given a sort order specified by the pkgname/component/second_key, return
# a list of CompilerSpecs, VersionLists, or Specs for that sorting list.
def _spec_for_pkgname(self, pkgname, component, second_key):
key = (pkgname, component, second_key)
- if not key in self._spec_for_pkgname_cache:
+ if key not in self._spec_for_pkgname_cache:
pkglist = self._order_for_package(pkgname, component, second_key)
if not pkglist:
if component in self._default_order:
pkglist = self._default_order[component]
if component == 'compiler':
- self._spec_for_pkgname_cache[key] = [spack.spec.CompilerSpec(s) for s in pkglist]
+ self._spec_for_pkgname_cache[key] = \
+ [spack.spec.CompilerSpec(s) for s in pkglist]
elif component == 'version':
- self._spec_for_pkgname_cache[key] = [VersionList(s) for s in pkglist]
+ self._spec_for_pkgname_cache[key] = \
+ [VersionList(s) for s in pkglist]
else:
- self._spec_for_pkgname_cache[key] = [spack.spec.Spec(s) for s in pkglist]
+ self._spec_for_pkgname_cache[key] = \
+ [spack.spec.Spec(s) for s in pkglist]
return self._spec_for_pkgname_cache[key]
-
def provider_compare(self, pkgname, provider_str, a, b):
- """Return less-than-0, 0, or greater than 0 if a is respecively less-than, equal-to, or
- greater-than b. A and b are possible implementations of provider_str.
- One provider is less-than another if it is preferred over the other.
- For example, provider_compare('scorep', 'mpi', 'mvapich', 'openmpi') would return -1 if
- mvapich should be preferred over openmpi for scorep."""
- return self._spec_compare(pkgname, 'providers', a, b, False, provider_str)
-
+ """Return less-than-0, 0, or greater than 0 if a is respecively
+ less-than, equal-to, or greater-than b. A and b are possible
+ implementations of provider_str. One provider is less-than another
+ if it is preferred over the other. For example,
+ provider_compare('scorep', 'mpi', 'mvapich', 'openmpi') would
+ return -1 if mvapich should be preferred over openmpi for scorep."""
+ return self._spec_compare(pkgname, 'providers', a, b, False,
+ provider_str)
def spec_has_preferred_provider(self, pkgname, provider_str):
- """Return True iff the named package has a list of preferred provider"""
- return bool(self._order_for_package(pkgname, 'providers', provider_str, False))
-
+ """Return True iff the named package has a list of preferred
+ providers"""
+ return bool(self._order_for_package(pkgname, 'providers',
+ provider_str, False))
def version_compare(self, pkgname, a, b):
"""Return less-than-0, 0, or greater than 0 if version a of pkgname is
- respecively less-than, equal-to, or greater-than version b of pkgname.
- One version is less-than another if it is preferred over the other."""
+ respectively less-than, equal-to, or greater-than version b of
+ pkgname. One version is less-than another if it is preferred over
+ the other."""
return self._spec_compare(pkgname, 'version', a, b, True, None)
-
def variant_compare(self, pkgname, a, b):
"""Return less-than-0, 0, or greater than 0 if variant a of pkgname is
- respecively less-than, equal-to, or greater-than variant b of pkgname.
- One variant is less-than another if it is preferred over the other."""
+ respectively less-than, equal-to, or greater-than variant b of
+ pkgname. One variant is less-than another if it is preferred over
+ the other."""
return self._component_compare(pkgname, 'variant', a, b, False, None)
-
def architecture_compare(self, pkgname, a, b):
- """Return less-than-0, 0, or greater than 0 if architecture a of pkgname is
- respecively less-than, equal-to, or greater-than architecture b of pkgname.
- One architecture is less-than another if it is preferred over the other."""
- return self._component_compare(pkgname, 'architecture', a, b, False, None)
-
+ """Return less-than-0, 0, or greater than 0 if architecture a of pkgname
+ is respectively less-than, equal-to, or greater-than architecture b
+ of pkgname. One architecture is less-than another if it is preferred
+ over the other."""
+ return self._component_compare(pkgname, 'architecture', a, b,
+ False, None)
def compiler_compare(self, pkgname, a, b):
"""Return less-than-0, 0, or greater than 0 if compiler a of pkgname is
- respecively less-than, equal-to, or greater-than compiler b of pkgname.
- One compiler is less-than another if it is preferred over the other."""
+ respecively less-than, equal-to, or greater-than compiler b of
+ pkgname. One compiler is less-than another if it is preferred over
+ the other."""
return self._spec_compare(pkgname, 'compiler', a, b, False, None)
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 77bc57147d..8bdae0445e 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -96,7 +96,6 @@ specs to avoid ambiguity. Both are provided because ~ can cause shell
expansion when it is the first character in an id typed on the command line.
"""
import sys
-import itertools
import hashlib
import base64
import imp
@@ -116,8 +115,6 @@ import spack.parse
import spack.error
import spack.compilers as compilers
-# TODO: move display_specs to some other location.
-from spack.cmd.find import display_specs
from spack.version import *
from spack.util.string import *
from spack.util.prefix import Prefix
@@ -155,6 +152,14 @@ _separators = '[%s]' % ''.join(color_formats.keys())
every time we call str()"""
_any_version = VersionList([':'])
+# Special types of dependencies.
+alldeps = ('build', 'link', 'run')
+nolink = ('build', 'run')
+special_types = {
+ 'alldeps': alldeps,
+ 'nolink': nolink,
+}
+
def index_specs(specs):
"""Take a list of specs and return a dict of lists. Dict is
@@ -292,6 +297,32 @@ class CompilerSpec(object):
@key_ordering
+class DependencySpec(object):
+ """Dependencies can be one (or more) of several types:
+
+ - build: needs to be in the PATH at build time.
+ - link: is linked to and added to compiler flags.
+ - run: needs to be in the PATH for the package to run.
+
+ Fields:
+ - spec: the spack.spec.Spec description of a dependency.
+ - deptypes: strings representing the type of dependency this is.
+ """
+ def __init__(self, spec, deptypes):
+ self.spec = spec
+ self.deptypes = deptypes
+
+ def _cmp_key(self):
+ return self.spec
+
+ def copy(self):
+ return DependencySpec(self.spec.copy(), self.deptype)
+
+ def __str__(self):
+ return str(self.spec)
+
+
+@key_ordering
class VariantSpec(object):
"""Variants are named, build-time options for a package. Names depend
@@ -440,11 +471,11 @@ class DependencyMap(HashableMap):
The DependencyMap is keyed by name. """
@property
def concrete(self):
- return all(d.concrete for d in self.values())
+ return all(d.spec.concrete for d in self.values())
def __str__(self):
return ''.join(
- ["^" + str(self[name]) for name in sorted(self.keys())])
+ ["^" + str(self[name].spec) for name in sorted(self.keys())])
@key_ordering
@@ -472,13 +503,13 @@ class Spec(object):
# writes directly into this Spec object.
other = spec_list[0]
self.name = other.name
- self.dependents = other.dependents
self.versions = other.versions
self.architecture = other.architecture
self.compiler = other.compiler
self.compiler_flags = other.compiler_flags
self.compiler_flags.spec = self
- self.dependencies = other.dependencies
+ self._dependencies = other._dependencies
+ self._dependents = other._dependents
self.variants = other.variants
self.variants.spec = self
self.namespace = other.namespace
@@ -500,7 +531,50 @@ class Spec(object):
# Spec(a, b) will copy a but just add b as a dep.
for dep in dep_like:
spec = dep if isinstance(dep, Spec) else Spec(dep)
- self._add_dependency(spec)
+ # XXX(deptype): default deptypes
+ self._add_dependency(spec, ('build', 'link'))
+
+ def get_dependency(self, name):
+ dep = self._dependencies.get(name)
+ if dep is not None:
+ return dep
+ raise InvalidDependencyException(
+ self.name + " does not depend on " + comma_or(name))
+
+ def _deptype_norm(self, deptype):
+ if deptype is None:
+ return alldeps
+ # Force deptype to be a set object so that we can do set intersections.
+ if isinstance(deptype, str):
+ # Support special deptypes.
+ return special_types.get(deptype, (deptype,))
+ return deptype
+
+ def _find_deps(self, where, deptype):
+ deptype = self._deptype_norm(deptype)
+
+ return [dep.spec
+ for dep in where.values()
+ if deptype and any(d in deptype for d in dep.deptypes)]
+
+ def dependencies(self, deptype=None):
+ return self._find_deps(self._dependencies, deptype)
+
+ def dependents(self, deptype=None):
+ return self._find_deps(self._dependents, deptype)
+
+ def _find_deps_dict(self, where, deptype):
+ deptype = self._deptype_norm(deptype)
+
+ return dict((dep.spec.name, dep)
+ for dep in where.values()
+ if deptype and any(d in deptype for d in dep.deptypes))
+
+ def dependencies_dict(self, deptype=None):
+ return self._find_deps_dict(self._dependencies, deptype)
+
+ def dependents_dict(self, deptype=None):
+ return self._find_deps_dict(self._dependents, deptype)
#
# Private routines here are called by the parser when building a spec.
@@ -578,7 +652,8 @@ class Spec(object):
mod = imp.load_source(mod_name, path)
class_name = mod_to_class(value)
if not hasattr(mod, class_name):
- tty.die('No class %s defined in %s' % (class_name, mod_name))
+ tty.die(
+ 'No class %s defined in %s' % (class_name, mod_name))
cls = getattr(mod, class_name)
if not inspect.isclass(cls):
tty.die('%s.%s is not a class' % (mod_name, class_name))
@@ -601,29 +676,32 @@ class Spec(object):
def _set_os(self, value):
"""Called by the parser to set the architecture operating system"""
- if self.architecture.platform:
- self.architecture.platform_os = self.architecture.platform.operating_system(value)
+ arch = self.architecture
+ if arch.platform:
+ arch.platform_os = arch.platform.operating_system(value)
def _set_target(self, value):
"""Called by the parser to set the architecture target"""
- if self.architecture.platform:
- self.architecture.target = self.architecture.platform.target(value)
+ arch = self.architecture
+ if arch.platform:
+ arch.target = arch.platform.target(value)
- def _add_dependency(self, spec):
+ def _add_dependency(self, spec, deptypes):
"""Called by the parser to add another spec as a dependency."""
- if spec.name in self.dependencies:
+ if spec.name in self._dependencies:
raise DuplicateDependencyError(
"Cannot depend on '%s' twice" % spec)
- self.dependencies[spec.name] = spec
- spec.dependents[self.name] = self
+ self._dependencies[spec.name] = DependencySpec(spec, deptypes)
+ spec._dependents[self.name] = DependencySpec(self, deptypes)
#
# Public interface
#
@property
def fullname(self):
- return (('%s.%s' % (self.namespace, self.name)) if self.namespace else
- (self.name if self.name else ''))
+ return (
+ ('%s.%s' % (self.namespace, self.name)) if self.namespace else
+ (self.name if self.name else ''))
@property
def root(self):
@@ -632,15 +710,15 @@ class Spec(object):
installed). This will throw an assertion error if that is not
the case.
"""
- if not self.dependents:
+ if not self._dependents:
return self
# If the spec has multiple dependents, ensure that they all
# lead to the same place. Spack shouldn't deal with any DAGs
# with multiple roots, so something's wrong if we find one.
- depiter = iter(self.dependents.values())
- first_root = next(depiter).root
- assert(all(first_root is d.root for d in depiter))
+ depiter = iter(self._dependents.values())
+ first_root = next(depiter).spec.root
+ assert(all(first_root is d.spec.root for d in depiter))
return first_root
@property
@@ -679,18 +757,29 @@ class Spec(object):
if self._concrete:
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.architecture.concrete
- and self.compiler and self.compiler.concrete
- and self.compiler_flags.concrete
- and self.dependencies.concrete)
+ self._concrete = bool(not self.virtual and
+ self.namespace is not None and
+ self.versions.concrete and
+ self.variants.concrete and
+ self.architecture and
+ self.architecture.concrete and
+ self.compiler and self.compiler.concrete and
+ self.compiler_flags.concrete and
+ self._dependencies.concrete)
return self._concrete
- def traverse(self, visited=None, d=0, **kwargs):
+ def traverse(self, visited=None, deptype=None, **kwargs):
+ traversal = self.traverse_with_deptype(visited=visited,
+ deptype=deptype,
+ **kwargs)
+ if kwargs.get('depth', False):
+ return [(s[0], s[1].spec) for s in traversal]
+ else:
+ return [s.spec for s in traversal]
+
+ def traverse_with_deptype(self, visited=None, d=0, deptype=None,
+ deptype_query=None, _self_deptype=None,
+ **kwargs):
"""Generic traversal of the DAG represented by this spec.
This will yield each node in the spec. Options:
@@ -742,6 +831,12 @@ class Spec(object):
direction = kwargs.get('direction', 'children')
order = kwargs.get('order', 'pre')
+ if deptype is None:
+ deptype = alldeps
+
+ if deptype_query is None:
+ deptype_query = ('link', 'run')
+
# Make sure kwargs have legal values; raise ValueError if not.
def validate(name, val, allowed_values):
if val not in allowed_values:
@@ -759,30 +854,37 @@ class Spec(object):
if key in visited and cover == 'nodes':
return
- # Determine whether and what to yield for this node.
+ def return_val(res):
+ return (d, res) if depth else res
+
yield_me = yield_root or d > 0
- result = (d, self) if depth else self
# Preorder traversal yields before successors
if yield_me and order == 'pre':
- yield result
+ yield return_val(DependencySpec(self, _self_deptype))
+
+ deps = self.dependencies_dict(deptype)
# Edge traversal yields but skips children of visited nodes
if not (key in visited and cover == 'edges'):
# This code determines direction and yields the children/parents
- successors = self.dependencies
+ successors = deps
if direction == 'parents':
- successors = self.dependents
+ successors = self.dependents_dict()
visited.add(key)
for name in sorted(successors):
child = successors[name]
- for elt in child.traverse(visited, d + 1, **kwargs):
+ children = child.spec.traverse_with_deptype(
+ visited, d=d + 1, deptype=deptype_query,
+ deptype_query=deptype_query,
+ _self_deptype=child.deptypes, **kwargs)
+ for elt in children:
yield elt
# Postorder traversal yields after successors
if yield_me and order == 'post':
- yield result
+ yield return_val(DependencySpec(self, _self_deptype))
@property
def short_spec(self):
@@ -807,6 +909,7 @@ class Spec(object):
if self._hash:
return self._hash[:length]
else:
+ # XXX(deptype): ignore 'build' dependencies here
yaml_text = yaml.dump(
self.to_node_dict(), default_flow_style=True, width=sys.maxint)
sha = hashlib.sha1(yaml_text)
@@ -819,11 +922,15 @@ class Spec(object):
params = dict((name, v.value) for name, v in self.variants.items())
params.update(dict((name, value)
for name, value in self.compiler_flags.items()))
+ deps = self.dependencies_dict(deptype=('link', 'run'))
d = {
- 'parameters' : params,
- 'arch' : self.architecture,
- 'dependencies' : dict((d, self.dependencies[d].dag_hash())
- for d in sorted(self.dependencies))
+ 'parameters': params,
+ 'arch': self.architecture,
+ 'dependencies': dict(
+ (name, {
+ 'hash': dspec.spec.dag_hash(),
+ 'type': [str(s) for s in dspec.deptypes]})
+ for name, dspec in deps.items())
}
# Older concrete specs do not have a namespace. Omit for
@@ -848,7 +955,7 @@ class Spec(object):
def to_yaml(self, stream=None):
node_list = []
- for s in self.traverse(order='pre'):
+ for s in self.traverse(order='pre', deptype=('link', 'run')):
node = s.to_node_dict()
node[s.name]['hash'] = s.dag_hash()
node_list.append(node)
@@ -889,9 +996,34 @@ class Spec(object):
raise SpackRecordError(
"Did not find a valid format for variants in YAML file")
+ # Don't read dependencies here; from_node_dict() is used by
+ # from_yaml() to read the root *and* each dependency spec.
+
return spec
@staticmethod
+ def read_yaml_dep_specs(dependency_dict):
+ """Read the DependencySpec portion of a YAML-formatted Spec.
+
+ This needs to be backward-compatible with older spack spec
+ formats so that reindex will work on old specs/databases.
+ """
+ for dep_name, elt in dependency_dict.items():
+ if isinstance(elt, basestring):
+ # original format, elt is just the dependency hash.
+ dag_hash, deptypes = elt, ['build', 'link']
+ elif isinstance(elt, tuple):
+ # original deptypes format: (used tuples, not future-proof)
+ dag_hash, deptypes = elt
+ elif isinstance(elt, dict):
+ # new format: elements of dependency spec are keyed.
+ dag_hash, deptypes = elt['hash'], elt['type']
+ else:
+ raise SpecError("Couldn't parse dependency types in spec.")
+
+ yield dep_name, dag_hash, list(deptypes)
+
+ @staticmethod
def from_yaml(stream):
"""Construct a spec from YAML.
@@ -902,25 +1034,30 @@ class Spec(object):
represent more than the DAG does.
"""
- deps = {}
- spec = None
-
try:
yfile = yaml.load(stream)
except MarkedYAMLError, e:
raise SpackYAMLError("error parsing YAML spec:", str(e))
- for node in yfile['spec']:
- name = next(iter(node))
- dep = Spec.from_node_dict(node)
- if not spec:
- spec = dep
- deps[dep.name] = dep
+ nodes = yfile['spec']
+
+ # Read nodes out of list. Root spec is the first element;
+ # dependencies are the following elements.
+ dep_list = [Spec.from_node_dict(node) for node in nodes]
+ if not dep_list:
+ raise SpecError("YAML spec contains no nodes.")
+ deps = dict((spec.name, spec) for spec in dep_list)
+ spec = dep_list[0]
- for node in yfile['spec']:
+ for node in nodes:
+ # get dependency dict from the node.
name = next(iter(node))
- for dep_name in node[name]['dependencies']:
- deps[name].dependencies[dep_name] = deps[dep_name]
+ yaml_deps = node[name]['dependencies']
+ for dname, dhash, dtypes in Spec.read_yaml_dep_specs(yaml_deps):
+ # Fill in dependencies by looking them up by name in deps dict
+ deps[name]._dependencies[dname] = DependencySpec(
+ deps[dname], set(dtypes))
+
return spec
def _concretize_helper(self, presets=None, visited=None):
@@ -940,8 +1077,9 @@ class Spec(object):
changed = False
# Concretize deps first -- this is a bottom-up process.
- for name in sorted(self.dependencies.keys()):
- changed |= self.dependencies[name]._concretize_helper(presets, visited)
+ for name in sorted(self._dependencies.keys()):
+ changed |= self._dependencies[
+ name].spec._concretize_helper(presets, visited)
if self.name in presets:
changed |= self.constrain(presets[self.name])
@@ -965,13 +1103,16 @@ class Spec(object):
def _replace_with(self, concrete):
"""Replace this virtual spec with a concrete spec."""
assert(self.virtual)
- for name, dependent in self.dependents.items():
+ for name, dep_spec in self._dependents.items():
+ dependent = dep_spec.spec
+ deptypes = dep_spec.deptypes
+
# remove self from all dependents.
- del dependent.dependencies[self.name]
+ del dependent._dependencies[self.name]
# add the replacement, unless it is already a dep of dependent.
- if concrete.name not in dependent.dependencies:
- dependent._add_dependency(concrete)
+ if concrete.name not in dependent._dependencies:
+ dependent._add_dependency(concrete, deptypes)
def _replace_node(self, replacement):
"""Replace this spec with another.
@@ -982,13 +1123,15 @@ class Spec(object):
to be normalized.
"""
- for name, dependent in self.dependents.items():
- del dependent.dependencies[self.name]
- dependent._add_dependency(replacement)
+ for name, dep_spec in self._dependents.items():
+ dependent = dep_spec.spec
+ deptypes = dep_spec.deptypes
+ del dependent._dependencies[self.name]
+ dependent._add_dependency(replacement, deptypes)
- for name, dep in self.dependencies.items():
- del dep.dependents[self.name]
- del self.dependencies[dep.name]
+ for name, dep_spec in self._dependencies.items():
+ del dep_spec.spec.dependents[self.name]
+ del self._dependencies[dep.name]
def _expand_virtual_packages(self):
"""Find virtual packages in this spec, replace them with providers,
@@ -1008,13 +1151,14 @@ class Spec(object):
a problem.
"""
# Make an index of stuff this spec already provides
+ # XXX(deptype): 'link' and 'run'?
self_index = ProviderIndex(self.traverse(), restrict=True)
changed = False
done = False
while not done:
done = True
-
+ # XXX(deptype): 'link' and 'run'?
for spec in list(self.traverse()):
replacement = None
if spec.virtual:
@@ -1054,24 +1198,26 @@ class Spec(object):
# If replacement is external then trim the dependencies
if replacement.external or replacement.external_module:
- if (spec.dependencies):
+ if (spec._dependencies):
changed = True
- spec.dependencies = DependencyMap()
- replacement.dependencies = DependencyMap()
+ spec._dependencies = DependencyMap()
+ replacement._dependencies = DependencyMap()
replacement.architecture = self.architecture
# TODO: could this and the stuff in _dup be cleaned up?
def feq(cfield, sfield):
return (not cfield) or (cfield == sfield)
- if replacement is spec or (feq(replacement.name, spec.name) and
- feq(replacement.versions, spec.versions) and
- feq(replacement.compiler, spec.compiler) and
- feq(replacement.architecture, spec.architecture) and
- feq(replacement.dependencies, spec.dependencies) and
- feq(replacement.variants, spec.variants) and
- feq(replacement.external, spec.external) and
- feq(replacement.external_module, spec.external_module)):
+ if replacement is spec or (
+ feq(replacement.name, spec.name) and
+ feq(replacement.versions, spec.versions) and
+ feq(replacement.compiler, spec.compiler) and
+ feq(replacement.architecture, spec.architecture) and
+ feq(replacement._dependencies, spec._dependencies) and
+ feq(replacement.variants, spec.variants) and
+ feq(replacement.external, spec.external) and
+ feq(replacement.external_module,
+ spec.external_module)):
continue
# Refine this spec to the candidate. This uses
# replace_with AND dup so that it can work in
@@ -1116,7 +1262,7 @@ class Spec(object):
changed = any(changes)
force = True
- for s in self.traverse():
+ for s in self.traverse(deptype_query=alldeps):
# 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
@@ -1128,10 +1274,10 @@ class Spec(object):
if s.namespace is None:
s.namespace = spack.repo.repo_for_pkg(s.name).namespace
-
for s in self.traverse(root=False):
if s.external_module:
- compiler = spack.compilers.compiler_for_spec(s.compiler, s.architecture)
+ compiler = spack.compilers.compiler_for_spec(
+ s.compiler, s.architecture)
for mod in compiler.modules:
load_module(mod)
@@ -1146,7 +1292,7 @@ class Spec(object):
Only for internal use -- client code should use "concretize"
unless there is a need to force a spec to be concrete.
"""
- for s in self.traverse():
+ for s in self.traverse(deptype_query=alldeps):
s._normal = True
s._concrete = True
@@ -1159,6 +1305,13 @@ class Spec(object):
return clone
def flat_dependencies(self, **kwargs):
+ flat_deps = DependencyMap()
+ flat_deps_deptypes = self.flat_dependencies_with_deptype(**kwargs)
+ for name, depspec in flat_deps_deptypes.items():
+ flat_deps[name] = depspec.spec
+ return flat_deps
+
+ def flat_dependencies_with_deptype(self, **kwargs):
"""Return a DependencyMap containing all of this spec's
dependencies with their constraints merged.
@@ -1169,23 +1322,31 @@ class Spec(object):
returns them.
"""
copy = kwargs.get('copy', True)
+ deptype_query = kwargs.get('deptype_query')
flat_deps = DependencyMap()
try:
- for spec in self.traverse(root=False):
+ deptree = self.traverse_with_deptype(root=False,
+ deptype_query=deptype_query)
+ for depspec in deptree:
+ spec = depspec.spec
+ deptypes = depspec.deptypes
+
if spec.name not in flat_deps:
if copy:
- flat_deps[spec.name] = spec.copy(deps=False)
+ dep_spec = DependencySpec(spec.copy(deps=False),
+ deptypes)
else:
- flat_deps[spec.name] = spec
+ dep_spec = DependencySpec(spec, deptypes)
+ flat_deps[spec.name] = dep_spec
else:
- flat_deps[spec.name].constrain(spec)
+ flat_deps[spec.name].spec.constrain(spec)
if not copy:
- for dep in flat_deps.values():
- dep.dependencies.clear()
- dep.dependents.clear()
- self.dependencies.clear()
+ for depspec in flat_deps.values():
+ depspec.spec._dependencies.clear()
+ depspec.spec._dependents.clear()
+ self._dependencies.clear()
return flat_deps
@@ -1200,17 +1361,11 @@ class Spec(object):
"""Return DependencyMap that points to all the dependencies in this
spec."""
dm = DependencyMap()
+ # XXX(deptype): use a deptype kwarg.
for spec in self.traverse():
dm[spec.name] = spec
return dm
- def flatten(self):
- """Pull all dependencies up to the root (this spec).
- Merge constraints for dependencies with the same name, and if they
- conflict, throw an exception. """
- for dep in self.flat_dependencies(copy=False):
- self._add_dependency(dep)
-
def _evaluate_dependency_conditions(self, name):
"""Evaluate all the conditions on a dependency with this name.
@@ -1267,7 +1422,8 @@ class Spec(object):
elif required:
raise UnsatisfiableProviderSpecError(required[0], vdep)
- def _merge_dependency(self, dep, visited, spec_deps, provider_index):
+ def _merge_dependency(self, dep, deptypes, visited, spec_deps,
+ provider_index):
"""Merge the dependency into this spec.
This is the core of normalize(). There are some basic steps:
@@ -1294,7 +1450,9 @@ class Spec(object):
dep = provider
else:
index = ProviderIndex([dep], restrict=True)
- for vspec in (v for v in spec_deps.values() if v.virtual):
+ for vspec in (v.spec
+ for v in spec_deps.values()
+ if v.spec.virtual):
if index.providers_for(vspec):
vspec._replace_with(dep)
del spec_deps[vspec.name]
@@ -1307,25 +1465,25 @@ class Spec(object):
# If the spec isn't already in the set of dependencies, clone
# it from the package description.
if dep.name not in spec_deps:
- spec_deps[dep.name] = dep.copy()
+ spec_deps[dep.name] = DependencySpec(dep.copy(), deptypes)
changed = True
# Constrain package information with spec info
try:
- changed |= spec_deps[dep.name].constrain(dep)
+ changed |= spec_deps[dep.name].spec.constrain(dep)
except UnsatisfiableSpecError, e:
e.message = "Invalid spec: '%s'. "
e.message += "Package %s requires %s %s, but spec asked for %s"
- e.message %= (spec_deps[dep.name], dep.name, e.constraint_type,
- e.required, e.provided)
+ e.message %= (spec_deps[dep.name].spec, dep.name,
+ e.constraint_type, e.required, e.provided)
raise e
# Add merged spec to my deps and recurse
dependency = spec_deps[dep.name]
- if dep.name not in self.dependencies:
- self._add_dependency(dependency)
+ if dep.name not in self._dependencies:
+ self._add_dependency(dependency.spec, dependency.deptypes)
- changed |= dependency._normalize_helper(
+ changed |= dependency.spec._normalize_helper(
visited, spec_deps, provider_index)
return changed
@@ -1351,10 +1509,11 @@ class Spec(object):
for dep_name in pkg.dependencies:
# Do we depend on dep_name? If so pkg_dep is not None.
pkg_dep = self._evaluate_dependency_conditions(dep_name)
+ deptypes = pkg._deptypes[dep_name]
# If pkg_dep is a dependency, merge it.
if pkg_dep:
changed |= self._merge_dependency(
- pkg_dep, visited, spec_deps, provider_index)
+ pkg_dep, deptypes, visited, spec_deps, provider_index)
any_change |= changed
return any_change
@@ -1385,11 +1544,13 @@ class Spec(object):
# Ensure first that all packages & compilers in the DAG exist.
self.validate_names()
# Get all the dependencies into one DependencyMap
- spec_deps = self.flat_dependencies(copy=False)
+ spec_deps = self.flat_dependencies_with_deptype(
+ copy=False, deptype_query=alldeps)
# Initialize index of virtual dependency providers if
# concretize didn't pass us one already
- provider_index = ProviderIndex(spec_deps.values(), restrict=True)
+ provider_index = ProviderIndex(
+ [s.spec for s in spec_deps.values()], restrict=True)
# traverse the package DAG and fill out dependencies according
# to package files & their 'when' specs
@@ -1462,20 +1623,17 @@ class Spec(object):
other.variants[v])
# TODO: Check out the logic here
- if self.architecture is not None and other.architecture is not None:
- if self.architecture.platform is not None and other.architecture.platform is not None:
- if self.architecture.platform != other.architecture.platform:
- raise UnsatisfiableArchitectureSpecError(self.architecture,
- other.architecture)
- if self.architecture.platform_os is not None and other.architecture.platform_os is not None:
- if self.architecture.platform_os != other.architecture.platform_os:
- raise UnsatisfiableArchitectureSpecError(self.architecture,
- other.architecture)
- if self.architecture.target is not None and other.architecture.target is not None:
- if self.architecture.target != other.architecture.target:
- raise UnsatisfiableArchitectureSpecError(self.architecture,
- other.architecture)
-
+ sarch, oarch = self.architecture, other.architecture
+ if sarch is not None and oarch is not None:
+ if sarch.platform is not None and oarch.platform is not None:
+ if sarch.platform != oarch.platform:
+ raise UnsatisfiableArchitectureSpecError(sarch, oarch)
+ if sarch.platform_os is not None and oarch.platform_os is not None:
+ if sarch.platform_os != oarch.platform_os:
+ raise UnsatisfiableArchitectureSpecError(sarch, oarch)
+ if sarch.target is not None and oarch.target is not None:
+ if sarch.target != oarch.target:
+ raise UnsatisfiableArchitectureSpecError(sarch, oarch)
changed = False
if self.compiler is not None and other.compiler is not None:
@@ -1490,15 +1648,16 @@ class Spec(object):
changed |= self.compiler_flags.constrain(other.compiler_flags)
old = str(self.architecture)
- if self.architecture is None or other.architecture is None:
- self.architecture = self.architecture or other.architecture
+ sarch, oarch = self.architecture, other.architecture
+ if sarch is None or other.architecture is None:
+ self.architecture = sarch or oarch
else:
- if self.architecture.platform is None or other.architecture.platform is None:
- self.architecture.platform = self.architecture.platform or other.architecture.platform
- if self.architecture.platform_os is None or other.architecture.platform_os is None:
- self.architecture.platform_os = self.architecture.platform_os or other.architecture.platform_os
- if self.architecture.target is None or other.architecture.target is None:
- self.architecture.target = self.architecture.target or other.architecture.target
+ if sarch.platform is None or oarch.platform is None:
+ self.architecture.platform = sarch.platform or oarch.platform
+ if sarch.platform_os is None or oarch.platform_os is None:
+ sarch.platform_os = sarch.platform_os or oarch.platform_os
+ if sarch.target is None or oarch.target is None:
+ sarch.target = sarch.target or oarch.target
changed |= (str(self.architecture) != old)
if deps:
@@ -1510,7 +1669,7 @@ class Spec(object):
"""Apply constraints of other spec's dependencies to this spec."""
other = self._autospec(other)
- if not self.dependencies or not other.dependencies:
+ if not self._dependencies or not other._dependencies:
return False
# TODO: might want more detail than this, e.g. specific deps
@@ -1526,13 +1685,17 @@ class Spec(object):
# Update with additional constraints from other spec
for name in other.dep_difference(self):
- self._add_dependency(other[name].copy())
+ dep_spec_copy = other.get_dependency(name)
+ dep_copy = dep_spec_copy.spec
+ deptypes = dep_spec_copy.deptypes
+ self._add_dependency(dep_copy.copy(), deptypes)
changed = True
return changed
def common_dependencies(self, other):
"""Return names of dependencies that self an other have in common."""
+ # XXX(deptype): handle deptypes via deptype kwarg.
common = set(
s.name for s in self.traverse(root=False))
common.intersection_update(
@@ -1625,15 +1788,25 @@ class Spec(object):
# Architecture satisfaction is currently just string equality.
# If not strict, None means unconstrained.
- if self.architecture and other.architecture:
- if ((self.architecture.platform and other.architecture.platform and self.architecture.platform != other.architecture.platform) or
- (self.architecture.platform_os and other.architecture.platform_os and self.architecture.platform_os != other.architecture.platform_os) or
- (self.architecture.target and other.architecture.target and self.architecture.target != other.architecture.target)):
+ sarch, oarch = self.architecture, other.architecture
+ if sarch and oarch:
+ if ((sarch.platform and
+ oarch.platform and
+ sarch.platform != oarch.platform) or
+
+ (sarch.platform_os and
+ oarch.platform_os and
+ sarch.platform_os != oarch.platform_os) or
+
+ (sarch.target and
+ oarch.target and
+ sarch.target != oarch.target)):
return False
- elif strict and ((other.architecture and not self.architecture) or
- (other.architecture.platform and not self.architecture.platform) or
- (other.architecture.platform_os and not self.architecture.platform_os) or
- (other.architecture.target and not self.architecture.target)):
+
+ elif strict and ((oarch and not sarch) or
+ (oarch.platform and not sarch.platform) or
+ (oarch.platform_os and not sarch.platform_os) or
+ (oarch.target and not sarch.target)):
return False
if not self.compiler_flags.satisfies(
@@ -1657,13 +1830,14 @@ class Spec(object):
other = self._autospec(other)
if strict:
- if other.dependencies and not self.dependencies:
+ if other._dependencies and not self._dependencies:
return False
- if not all(dep in self.dependencies for dep in other.dependencies):
+ if not all(dep in self._dependencies
+ for dep in other._dependencies):
return False
- elif not self.dependencies or not other.dependencies:
+ elif not self._dependencies or not other._dependencies:
# if either spec doesn't restrict dependencies then both are
# compatible.
return True
@@ -1714,11 +1888,16 @@ class Spec(object):
# We don't count dependencies as changes here
changed = True
if hasattr(self, 'name'):
- changed = (self.name != other.name and self.versions != other.versions and \
- self.architecture != other.architecture and self.compiler != other.compiler and \
- self.variants != other.variants and self._normal != other._normal and \
- self.concrete != other.concrete and self.external != other.external and \
- self.external_module != other.external_module and self.compiler_flags != other.compiler_flags)
+ changed = (self.name != other.name and
+ self.versions != other.versions and
+ self.architecture != other.architecture and
+ self.compiler != other.compiler and
+ self.variants != other.variants and
+ self._normal != other._normal and
+ self.concrete != other.concrete and
+ self.external != other.external and
+ self.external_module != other.external_module and
+ self.compiler_flags != other.compiler_flags)
# Local node attributes get copied first.
self.name = other.name
@@ -1726,8 +1905,8 @@ class Spec(object):
self.architecture = other.architecture
self.compiler = other.compiler.copy() if other.compiler else None
if kwargs.get('cleardeps', True):
- self.dependents = DependencyMap()
- self.dependencies = DependencyMap()
+ self._dependents = DependencyMap()
+ self._dependencies = DependencyMap()
self.compiler_flags = other.compiler_flags.copy()
self.variants = other.variants.copy()
self.variants.spec = self
@@ -1739,15 +1918,30 @@ class Spec(object):
# If we copy dependencies, preserve DAG structure in the new spec
if kwargs.get('deps', True):
# This copies the deps from other using _dup(deps=False)
- new_nodes = other.flat_dependencies()
+ # XXX(deptype): We can keep different instances of specs here iff
+ # it is only a 'build' dependency (from its parent).
+ # All other instances must be shared (due to symbol
+ # and PATH contention). These should probably search
+ # for any existing installation which can satisfy the
+ # build and latch onto that because if 3 things need
+ # the same build dependency and it is *not*
+ # available, we only want to build it once.
+ new_nodes = other.flat_dependencies(deptype_query=alldeps)
new_nodes[self.name] = self
- # Hook everything up properly here by traversing.
- for spec in other.traverse(cover='nodes'):
- parent = new_nodes[spec.name]
- for child in spec.dependencies:
- if child not in parent.dependencies:
- parent._add_dependency(new_nodes[child])
+ stack = [other]
+ while stack:
+ cur_spec = stack.pop(0)
+ new_spec = new_nodes[cur_spec.name]
+
+ for depspec in cur_spec._dependencies.values():
+ stack.append(depspec.spec)
+
+ # XXX(deptype): add any new deptypes that may have appeared
+ # here.
+ if depspec.spec.name not in new_spec._dependencies:
+ new_spec._add_dependency(
+ new_nodes[depspec.spec.name], depspec.deptypes)
# Since we preserved structure, we can copy _normal safely.
self._normal = other._normal
@@ -1790,7 +1984,7 @@ class Spec(object):
raise KeyError("No spec with name %s in %s" % (name, self))
def __contains__(self, spec):
- """True if this spec satisfis the provided spec, or if any dependency
+ """True if this spec satisfies the provided spec, or if any dependency
does. If the spec has no name, then we parse this one first.
"""
spec = self._autospec(spec)
@@ -1814,13 +2008,13 @@ class Spec(object):
if self.ne_node(other):
return False
- if len(self.dependencies) != len(other.dependencies):
+ if len(self._dependencies) != len(other._dependencies):
return False
- ssorted = [self.dependencies[name]
- for name in sorted(self.dependencies)]
- osorted = [other.dependencies[name]
- for name in sorted(other.dependencies)]
+ ssorted = [self._dependencies[name].spec
+ for name in sorted(self._dependencies)]
+ osorted = [other._dependencies[name].spec
+ for name in sorted(other._dependencies)]
for s, o in zip(ssorted, osorted):
visited_s = id(s) in vs
@@ -1858,7 +2052,6 @@ class Spec(object):
self.compiler,
self.compiler_flags)
-
def eq_node(self, other):
"""Equality with another spec, not including dependencies."""
return self._cmp_node() == other._cmp_node()
@@ -1874,9 +2067,10 @@ class Spec(object):
1. A tuple describing this node in the DAG.
2. The hash of each of this node's dependencies' cmp_keys.
"""
+ dep_dict = self.dependencies_dict(deptype=('link', 'run'))
return self._cmp_node() + (
- tuple(hash(self.dependencies[name])
- for name in sorted(self.dependencies)),)
+ tuple(hash(dep_dict[name])
+ for name in sorted(dep_dict)),)
def colorized(self):
return colorize_spec(self)
@@ -2053,41 +2247,39 @@ class Spec(object):
def dep_string(self):
return ''.join("^" + dep.format() for dep in self.sorted_deps())
-
def __cmp__(self, other):
- #Package name sort order is not configurable, always goes alphabetical
+ # Package name sort order is not configurable, always goes alphabetical
if self.name != other.name:
return cmp(self.name, other.name)
- #Package version is second in compare order
+ # Package version is second in compare order
pkgname = self.name
if self.versions != other.versions:
- return spack.pkgsort.version_compare(pkgname,
- self.versions, other.versions)
+ return spack.pkgsort.version_compare(
+ pkgname, self.versions, other.versions)
- #Compiler is third
+ # Compiler is third
if self.compiler != other.compiler:
- return spack.pkgsort.compiler_compare(pkgname,
- self.compiler, other.compiler)
+ return spack.pkgsort.compiler_compare(
+ pkgname, self.compiler, other.compiler)
- #Variants
+ # Variants
if self.variants != other.variants:
- return spack.pkgsort.variant_compare(pkgname,
- self.variants, other.variants)
+ return spack.pkgsort.variant_compare(
+ pkgname, self.variants, other.variants)
- #Target
+ # Target
if self.architecture != other.architecture:
- return spack.pkgsort.architecture_compare(pkgname,
- self.architecture, other.architecture)
+ return spack.pkgsort.architecture_compare(
+ pkgname, self.architecture, other.architecture)
- #Dependency is not configurable
- if self.dependencies != other.dependencies:
- return -1 if self.dependencies < other.dependencies else 1
+ # Dependency is not configurable
+ if self._dependencies != other._dependencies:
+ return -1 if self._dependencies < other._dependencies else 1
- #Equal specs
+ # Equal specs
return 0
-
def __str__(self):
return self.format() + self.dep_string()
@@ -2101,12 +2293,14 @@ class Spec(object):
indent = kwargs.pop('indent', 0)
fmt = kwargs.pop('format', '$_$@$%@+$+$=')
prefix = kwargs.pop('prefix', None)
+ deptypes = kwargs.pop('deptypes', ('build', 'link'))
check_kwargs(kwargs, self.tree)
out = ""
cur_id = 0
ids = {}
- for d, node in self.traverse(order='pre', cover=cover, depth=True):
+ for d, node in self.traverse(
+ order='pre', cover=cover, depth=True, deptypes=deptypes):
if prefix is not None:
out += prefix(node)
out += " " * indent
@@ -2160,8 +2354,8 @@ class SpecLexer(spack.parse.Lexer):
# Lexer is always the same for every parser.
_lexer = SpecLexer()
-class SpecParser(spack.parse.Parser):
+class SpecParser(spack.parse.Parser):
def __init__(self):
super(SpecParser, self).__init__(_lexer)
self.previous = None
@@ -2196,10 +2390,13 @@ class SpecParser(spack.parse.Parser):
specs.append(self.spec(None))
self.previous = None
if self.accept(HASH):
- specs[-1]._add_dependency(self.spec_by_hash())
+ dep = self.spec_by_hash()
else:
self.expect(ID)
- specs[-1]._add_dependency(self.spec(self.token.value))
+ dep = self.spec(self.token.value)
+ # XXX(deptype): default deptypes
+ def_deptypes = ('build', 'link')
+ specs[-1]._add_dependency(dep, def_deptypes)
else:
# Attempt to construct an anonymous spec, but check that
@@ -2211,8 +2408,8 @@ class SpecParser(spack.parse.Parser):
except spack.parse.ParseError, e:
raise SpecParseError(e)
-
- # If the spec has an os or a target and no platform, give it the default platform
+ # If the spec has an os or a target and no platform, give it
+ # the default platform
for spec in specs:
for s in spec.traverse():
if s.architecture.os_string or s.architecture.target_string:
@@ -2263,8 +2460,8 @@ class SpecParser(spack.parse.Parser):
spec.external = None
spec.external_module = None
spec.compiler_flags = FlagMap(spec)
- spec.dependents = DependencyMap()
- spec.dependencies = DependencyMap()
+ spec._dependents = DependencyMap()
+ spec._dependencies = DependencyMap()
spec.namespace = spec_namespace
spec._hash = None
diff --git a/lib/spack/spack/test/__init__.py b/lib/spack/spack/test/__init__.py
index fb91f24721..a849d5f350 100644
--- a/lib/spack/spack/test/__init__.py
+++ b/lib/spack/spack/test/__init__.py
@@ -32,15 +32,17 @@ from llnl.util.tty.colify import colify
from spack.test.tally_plugin import Tally
"""Names of tests to be included in Spack's test suite"""
-test_names = ['architecture', 'versions', 'url_parse', 'url_substitution', 'packages', 'stage',
- 'spec_syntax', 'spec_semantics', 'spec_dag', 'concretize',
- 'multimethod', 'install', 'package_sanity', 'config',
- 'directory_layout', 'pattern', 'python_version', 'git_fetch',
- 'svn_fetch', 'hg_fetch', 'mirror', 'modules', 'url_extrapolate',
- 'cc', 'link_tree', 'spec_yaml', 'optional_deps',
- 'make_executable', 'configure_guess', 'lock', 'database',
- 'namespace_trie', 'yaml', 'sbang', 'environment', 'cmd.find',
- 'cmd.uninstall', 'cmd.test_install', 'cmd.test_compiler_cmd']
+test_names = [
+ 'architecture', 'versions', 'url_parse', 'url_substitution', 'packages',
+ 'stage', 'spec_syntax', 'spec_semantics', 'spec_dag', 'concretize',
+ 'multimethod', 'install', 'package_sanity', 'config', 'directory_layout',
+ 'pattern', 'python_version', 'git_fetch', 'svn_fetch', 'hg_fetch',
+ 'mirror', 'modules', 'url_extrapolate', 'cc', 'link_tree', 'spec_yaml',
+ 'optional_deps', 'make_executable', 'build_system_guess', 'lock',
+ 'database', 'namespace_trie', 'yaml', 'sbang', 'environment', 'cmd.find',
+ 'cmd.uninstall', 'cmd.test_install', 'cmd.test_compiler_cmd',
+ 'cmd.module'
+]
def list_tests():
diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py
index ae3f08deed..09bdb021af 100644
--- a/lib/spack/spack/test/architecture.py
+++ b/lib/spack/spack/test/architecture.py
@@ -1,7 +1,31 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
""" Test checks if the architecture class is created correctly and also that
the functions are looking for the correct architecture name
"""
-import unittest
+import itertools
import os
import platform as py_platform
import spack
@@ -14,9 +38,8 @@ from spack.platforms.darwin import Darwin
from spack.test.mock_packages_test import *
-#class ArchitectureTest(unittest.TestCase):
-class ArchitectureTest(MockPackagesTest):
+class ArchitectureTest(MockPackagesTest):
def setUp(self):
super(ArchitectureTest, self).setUp()
self.platform = spack.architecture.platform()
@@ -36,24 +59,22 @@ class ArchitectureTest(MockPackagesTest):
self.assertEqual(arch, new_arch)
- self.assertTrue( isinstance(arch, spack.architecture.Arch) )
- self.assertTrue( isinstance(arch.platform, spack.architecture.Platform) )
- self.assertTrue( isinstance(arch.platform_os,
- spack.architecture.OperatingSystem) )
- self.assertTrue( isinstance(arch.target,
- spack.architecture.Target) )
- self.assertTrue( isinstance(new_arch, spack.architecture.Arch) )
- self.assertTrue( isinstance(new_arch.platform,
- spack.architecture.Platform) )
- self.assertTrue( isinstance(new_arch.platform_os,
- spack.architecture.OperatingSystem) )
- self.assertTrue( isinstance(new_arch.target,
- spack.architecture.Target) )
-
+ self.assertTrue(isinstance(arch, spack.architecture.Arch))
+ self.assertTrue(isinstance(arch.platform, spack.architecture.Platform))
+ self.assertTrue(isinstance(arch.platform_os,
+ spack.architecture.OperatingSystem))
+ self.assertTrue(isinstance(arch.target,
+ spack.architecture.Target))
+ self.assertTrue(isinstance(new_arch, spack.architecture.Arch))
+ self.assertTrue(isinstance(new_arch.platform,
+ spack.architecture.Platform))
+ self.assertTrue(isinstance(new_arch.platform_os,
+ spack.architecture.OperatingSystem))
+ self.assertTrue(isinstance(new_arch.target,
+ spack.architecture.Target))
def test_platform(self):
output_platform_class = spack.architecture.platform()
- my_arch_class = None
if os.path.exists('/opt/cray/craype'):
my_platform_class = CrayXc()
elif os.path.exists('/bgsys'):
@@ -91,7 +112,7 @@ class ArchitectureTest(MockPackagesTest):
default_os = self.platform.operating_system("default_os")
default_target = self.platform.target("default_target")
- default_spec = Spec("libelf") # default is no args
+ default_spec = Spec("libelf") # default is no args
default_spec.concretize()
self.assertEqual(default_os, default_spec.architecture.platform_os)
self.assertEqual(default_target, default_spec.architecture.target)
@@ -107,10 +128,11 @@ class ArchitectureTest(MockPackagesTest):
combinations = itertools.product(os_list, target_list)
results = []
for arch in combinations:
- o,t = arch
+ o, t = arch
spec = Spec("libelf os=%s target=%s" % (o, t))
spec.concretize()
- results.append(spec.architecture.platform_os == self.platform.operating_system(o))
+ results.append(spec.architecture.platform_os ==
+ self.platform.operating_system(o))
results.append(spec.architecture.target == self.platform.target(t))
res = all(results)
diff --git a/lib/spack/spack/test/configure_guess.py b/lib/spack/spack/test/build_system_guess.py
index bad3673e7a..e728a47cf4 100644
--- a/lib/spack/spack/test/configure_guess.py
+++ b/lib/spack/spack/test/build_system_guess.py
@@ -28,14 +28,14 @@ import tempfile
import unittest
from llnl.util.filesystem import *
-from spack.cmd.create import ConfigureGuesser
+from spack.cmd.create import BuildSystemGuesser
from spack.stage import Stage
from spack.test.mock_packages_test import *
from spack.util.executable import which
class InstallTest(unittest.TestCase):
- """Tests the configure guesser in spack create"""
+ """Tests the build system guesser in spack create"""
def setUp(self):
self.tar = which('tar')
@@ -44,12 +44,10 @@ class InstallTest(unittest.TestCase):
os.chdir(self.tmpdir)
self.stage = None
-
def tearDown(self):
shutil.rmtree(self.tmpdir, ignore_errors=True)
os.chdir(self.orig_dir)
-
def check_archive(self, filename, system):
mkdirp('archive')
touch(join_path('archive', filename))
@@ -60,24 +58,24 @@ class InstallTest(unittest.TestCase):
with Stage(url) as stage:
stage.fetch()
- guesser = ConfigureGuesser()
- guesser(stage)
+ guesser = BuildSystemGuesser()
+ guesser(stage, url)
self.assertEqual(system, guesser.build_system)
-
- def test_python(self):
- self.check_archive('setup.py', 'python')
-
-
def test_autotools(self):
self.check_archive('configure', 'autotools')
-
def test_cmake(self):
self.check_archive('CMakeLists.txt', 'cmake')
+ def test_scons(self):
+ self.check_archive('SConstruct', 'scons')
- def test_unknown(self):
- self.check_archive('foobar', 'unknown')
+ def test_python(self):
+ self.check_archive('setup.py', 'python')
+ def test_R(self):
+ self.check_archive('NAMESPACE', 'R')
+ def test_unknown(self):
+ self.check_archive('foobar', 'unknown')
diff --git a/lib/spack/spack/test/cmd/find.py b/lib/spack/spack/test/cmd/find.py
index 371e9650e0..fa82db7733 100644
--- a/lib/spack/spack/test/cmd/find.py
+++ b/lib/spack/spack/test/cmd/find.py
@@ -27,11 +27,7 @@
import spack.cmd.find
import unittest
-
-class Bunch(object):
-
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
+from spack.util.pattern import Bunch
class FindTest(unittest.TestCase):
diff --git a/lib/spack/spack/test/cmd/module.py b/lib/spack/spack/test/cmd/module.py
new file mode 100644
index 0000000000..36a4a73fe6
--- /dev/null
+++ b/lib/spack/spack/test/cmd/module.py
@@ -0,0 +1,83 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+import argparse
+import os.path
+
+import spack.cmd.module as module
+import spack.modules as modules
+import spack.test.mock_database
+
+
+class TestModule(spack.test.mock_database.MockDatabase):
+
+ def _get_module_files(self, args):
+ return [
+ modules.module_types[args.module_type](spec).file_name for spec in args.specs # NOQA: ignore=E501
+ ]
+
+ def test_module_common_operations(self):
+ parser = argparse.ArgumentParser()
+ module.setup_parser(parser)
+ # Try to remove a non existing module [tcl]
+ args = parser.parse_args(['rm', 'doesnotexist'])
+ self.assertRaises(SystemExit, module.module, parser, args)
+ # Remove existing modules [tcl]
+ args = parser.parse_args(['rm', '-y', 'mpileaks'])
+ module_files = self._get_module_files(args)
+ for item in module_files:
+ self.assertTrue(os.path.exists(item))
+ module.module(parser, args)
+ for item in module_files:
+ self.assertFalse(os.path.exists(item))
+ # Add them back [tcl]
+ args = parser.parse_args(['refresh', '-y', 'mpileaks'])
+ module.module(parser, args)
+ for item in module_files:
+ self.assertTrue(os.path.exists(item))
+ # TODO : test the --delete-tree option
+ # TODO : this requires having a separate directory for test modules
+ # Try to find a module with multiple matches
+ args = parser.parse_args(['find', 'mpileaks'])
+ self.assertRaises(SystemExit, module.module, parser, args)
+ # Try to find a module with no matches
+ args = parser.parse_args(['find', 'doesnotexist'])
+ self.assertRaises(SystemExit, module.module, parser, args)
+ # Try to find a module
+ args = parser.parse_args(['find', 'libelf'])
+ module.module(parser, args)
+ # Remove existing modules [dotkit]
+ args = parser.parse_args(['rm', '-y', '-m', 'dotkit', 'mpileaks'])
+ module_files = self._get_module_files(args)
+ for item in module_files:
+ self.assertTrue(os.path.exists(item))
+ module.module(parser, args)
+ for item in module_files:
+ self.assertFalse(os.path.exists(item))
+ # Add them back [dotkit]
+ args = parser.parse_args(['refresh', '-y', '-m', 'dotkit', 'mpileaks'])
+ module.module(parser, args)
+ for item in module_files:
+ self.assertTrue(os.path.exists(item))
+ # TODO : add tests for loads and find to check the prompt format
diff --git a/lib/spack/spack/test/cmd/test_install.py b/lib/spack/spack/test/cmd/test_install.py
index d17e013ed2..a94d3c8bba 100644
--- a/lib/spack/spack/test/cmd/test_install.py
+++ b/lib/spack/spack/test/cmd/test_install.py
@@ -58,16 +58,39 @@ test_install = __import__("spack.cmd.test-install", fromlist=['test_install'])
class MockSpec(object):
def __init__(self, name, version, hashStr=None):
- self.dependencies = {}
+ self._dependencies = {}
self.name = name
self.version = version
self.hash = hashStr if hashStr else hash((name, version))
+ def _deptype_norm(self, deptype):
+ if deptype is None:
+ return spack.alldeps
+ # Force deptype to be a tuple so that we can do set intersections.
+ if isinstance(deptype, str):
+ return (deptype,)
+ return deptype
+
+ def _find_deps(self, where, deptype):
+ deptype = self._deptype_norm(deptype)
+
+ return [dep.spec
+ for dep in where.values()
+ if deptype and any(d in deptype for d in dep.deptypes)]
+
+ def dependencies(self, deptype=None):
+ return self._find_deps(self._dependencies, deptype)
+
+ def dependents(self, deptype=None):
+ return self._find_deps(self._dependents, deptype)
+
def traverse(self, order=None):
- for _, spec in self.dependencies.items():
- yield spec
+ for _, spec in self._dependencies.items():
+ yield spec.spec
yield self
- #allDeps = itertools.chain.from_iterable(i.traverse() for i in self.dependencies.itervalues())
+ #from_iterable = itertools.chain.from_iterable
+ #allDeps = from_iterable(i.traverse()
+ # for i in self.dependencies())
#return set(itertools.chain([self], allDeps))
def dag_hash(self):
@@ -104,7 +127,7 @@ def mock_fetch_log(path):
specX = MockSpec('X', "1.2.0")
specY = MockSpec('Y', "2.3.8")
-specX.dependencies['Y'] = specY
+specX._dependencies['Y'] = spack.DependencySpec(specY, spack.alldeps)
pkgX = MockPackage(specX, 'logX')
pkgY = MockPackage(specY, 'logY')
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index ce02b08bc3..ae3ceecfc8 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -197,32 +197,36 @@ class ConcretizeTest(MockPackagesTest):
def test_virtual_is_fully_expanded_for_callpath(self):
# force dependence on fake "zmpi" by asking for MPI 10.0
spec = Spec('callpath ^mpi@10.0')
- self.assertTrue('mpi' in spec.dependencies)
+ self.assertTrue('mpi' in spec._dependencies)
self.assertFalse('fake' in spec)
spec.concretize()
- self.assertTrue('zmpi' in spec.dependencies)
- self.assertTrue(all(not 'mpi' in d.dependencies for d in spec.traverse()))
+ self.assertTrue('zmpi' in spec._dependencies)
+ self.assertTrue(all('mpi' not in d._dependencies
+ for d in spec.traverse()))
self.assertTrue('zmpi' in spec)
self.assertTrue('mpi' in spec)
- self.assertTrue('fake' in spec.dependencies['zmpi'])
+ self.assertTrue('fake' in spec._dependencies['zmpi'].spec)
def test_virtual_is_fully_expanded_for_mpileaks(self):
spec = Spec('mpileaks ^mpi@10.0')
- self.assertTrue('mpi' in spec.dependencies)
+ self.assertTrue('mpi' in spec._dependencies)
self.assertFalse('fake' in spec)
spec.concretize()
- self.assertTrue('zmpi' in spec.dependencies)
- self.assertTrue('callpath' in spec.dependencies)
- self.assertTrue('zmpi' in spec.dependencies['callpath'].dependencies)
- self.assertTrue('fake' in spec.dependencies['callpath'].dependencies['zmpi'].dependencies)
+ self.assertTrue('zmpi' in spec._dependencies)
+ self.assertTrue('callpath' in spec._dependencies)
+ self.assertTrue('zmpi' in spec._dependencies['callpath'].
+ spec._dependencies)
+ self.assertTrue('fake' in spec._dependencies['callpath'].
+ spec._dependencies['zmpi'].
+ spec._dependencies)
- self.assertTrue(all(not 'mpi' in d.dependencies for d in spec.traverse()))
+ self.assertTrue(all(not 'mpi' in d._dependencies for d in spec.traverse()))
self.assertTrue('zmpi' in spec)
self.assertTrue('mpi' in spec)
diff --git a/lib/spack/spack/test/mock_packages_test.py b/lib/spack/spack/test/mock_packages_test.py
index c8b06cd7d7..9d96622a6e 100644
--- a/lib/spack/spack/test/mock_packages_test.py
+++ b/lib/spack/spack/test/mock_packages_test.py
@@ -191,8 +191,7 @@ class MockPackagesTest(unittest.TestCase):
# restore later.
self.saved_deps = {}
-
- def set_pkg_dep(self, pkg_name, spec):
+ def set_pkg_dep(self, pkg_name, spec, deptypes=spack.alldeps):
"""Alters dependence information for a package.
Adds a dependency on <spec> to pkg.
@@ -206,7 +205,9 @@ class MockPackagesTest(unittest.TestCase):
self.saved_deps[pkg_name] = (pkg, pkg.dependencies.copy())
# Change dep spec
- pkg.dependencies[spec.name] = { Spec(pkg_name) : spec }
+ # XXX(deptype): handle deptypes.
+ pkg.dependencies[spec.name] = {Spec(pkg_name): spec}
+ pkg._deptypes[spec.name] = set(deptypes)
def cleanmock(self):
@@ -216,6 +217,7 @@ class MockPackagesTest(unittest.TestCase):
shutil.rmtree(self.temp_config, ignore_errors=True)
spack.config.clear_config_caches()
+ # XXX(deptype): handle deptypes.
# Restore dependency changes that happened during the test
for pkg_name, (pkg, deps) in self.saved_deps.items():
pkg.dependencies.clear()
diff --git a/lib/spack/spack/test/mock_repo.py b/lib/spack/spack/test/mock_repo.py
index a8098b8eec..386af282e7 100644
--- a/lib/spack/spack/test/mock_repo.py
+++ b/lib/spack/spack/test/mock_repo.py
@@ -103,6 +103,8 @@ class MockGitRepo(MockVCSRepo):
def __init__(self):
super(MockGitRepo, self).__init__('mock-git-stage', 'mock-git-repo')
+ self.url = 'file://' + self.path
+
with working_dir(self.path):
git('init')
@@ -140,8 +142,6 @@ class MockGitRepo(MockVCSRepo):
self.r1 = self.rev_hash(self.branch)
self.r1_file = self.branch_file
- self.url = self.path
-
def rev_hash(self, rev):
return git('rev-parse', rev, output=str).strip()
diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py
index 6d2e3705bd..135cd028e3 100644
--- a/lib/spack/spack/test/modules.py
+++ b/lib/spack/spack/test/modules.py
@@ -27,7 +27,6 @@ from contextlib import contextmanager
import StringIO
import spack.modules
-import unittest
from spack.test.mock_packages_test import MockPackagesTest
FILE_REGISTRY = collections.defaultdict(StringIO.StringIO)
@@ -266,7 +265,7 @@ class TclTests(MockPackagesTest):
def test_blacklist(self):
spack.modules.CONFIGURATION = configuration_blacklist
- spec = spack.spec.Spec('mpileaks')
+ spec = spack.spec.Spec('mpileaks ^zmpi')
content = self.get_modulefile_content(spec)
self.assertEqual(len([x for x in content if 'is-loaded' in x]), 1)
self.assertEqual(len([x for x in content if 'module load ' in x]), 1)
diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py
index c56c70b1fe..972e79aa20 100644
--- a/lib/spack/spack/test/spec_dag.py
+++ b/lib/spack/spack/test/spec_dag.py
@@ -148,10 +148,12 @@ class SpecDagTest(MockPackagesTest):
# Normalize then add conflicting constraints to the DAG (this is an
# extremely unlikely scenario, but we test for it anyway)
mpileaks.normalize()
- mpileaks.dependencies['mpich'] = Spec('mpich@1.0')
- mpileaks.dependencies['callpath'].dependencies['mpich'] = Spec('mpich@2.0')
+ mpileaks._dependencies['mpich'].spec = Spec('mpich@1.0')
+ mpileaks._dependencies['callpath']. \
+ spec._dependencies['mpich'].spec = Spec('mpich@2.0')
- self.assertRaises(spack.spec.InconsistentSpecError, mpileaks.flatten)
+ self.assertRaises(spack.spec.InconsistentSpecError,
+ lambda: mpileaks.flat_dependencies(copy=False))
def test_normalize_twice(self):
@@ -197,15 +199,17 @@ class SpecDagTest(MockPackagesTest):
def check_links(self, spec_to_check):
for spec in spec_to_check.traverse():
- for dependent in spec.dependents.values():
+ for dependent in spec.dependents():
self.assertTrue(
- spec.name in dependent.dependencies,
- "%s not in dependencies of %s" % (spec.name, dependent.name))
+ spec.name in dependent.dependencies_dict(),
+ "%s not in dependencies of %s" %
+ (spec.name, dependent.name))
- for dependency in spec.dependencies.values():
+ for dependency in spec.dependencies():
self.assertTrue(
- spec.name in dependency.dependents,
- "%s not in dependents of %s" % (spec.name, dependency.name))
+ spec.name in dependency.dependents_dict(),
+ "%s not in dependents of %s" %
+ (spec.name, dependency.name))
def test_dependents_and_dependencies_are_correct(self):
@@ -442,3 +446,69 @@ class SpecDagTest(MockPackagesTest):
orig_ids = set(id(s) for s in orig.traverse())
copy_ids = set(id(s) for s in copy.traverse())
self.assertFalse(orig_ids.intersection(copy_ids))
+
+ """
+ Here is the graph with deptypes labeled (assume all packages have a 'dt'
+ prefix). Arrows are marked with the deptypes ('b' for 'build', 'l' for
+ 'link', 'r' for 'run').
+
+ use -bl-> top
+
+ top -b-> build1
+ top -bl-> link1
+ top -r-> run1
+
+ build1 -b-> build2
+ build1 -bl-> link2
+ build1 -r-> run2
+
+ link1 -bl-> link3
+
+ run1 -bl-> link5
+ run1 -r-> run3
+
+ link3 -b-> build2
+ link3 -bl-> link4
+
+ run3 -b-> build3
+ """
+ def test_deptype_traversal(self):
+ dag = Spec('dtuse')
+ dag.normalize()
+
+ names = ['dtuse', 'dttop', 'dtlink1', 'dtlink3', 'dtlink4',
+ 'dtrun1', 'dtlink5', 'dtrun3']
+
+ traversal = dag.traverse()
+ self.assertEqual([x.name for x in traversal], names)
+
+ def test_deptype_traversal_with_builddeps(self):
+ dag = Spec('dttop')
+ dag.normalize()
+
+ names = ['dttop', 'dtbuild1', 'dtlink2', 'dtrun2', 'dtlink1',
+ 'dtlink3', 'dtlink4', 'dtrun1', 'dtlink5', 'dtrun3']
+
+ traversal = dag.traverse()
+ self.assertEqual([x.name for x in traversal], names)
+
+ def test_deptype_traversal_full(self):
+ dag = Spec('dttop')
+ dag.normalize()
+
+ names = ['dttop', 'dtbuild1', 'dtbuild2', 'dtlink2', 'dtrun2',
+ 'dtlink1', 'dtlink3', 'dtlink4', 'dtrun1', 'dtlink5',
+ 'dtrun3', 'dtbuild3']
+
+ traversal = dag.traverse(deptype_query=spack.alldeps)
+ self.assertEqual([x.name for x in traversal], names)
+
+ def test_deptype_traversal_pythonpath(self):
+ dag = Spec('dttop')
+ dag.normalize()
+
+ names = ['dttop', 'dtbuild1', 'dtrun2', 'dtlink1', 'dtrun1',
+ 'dtrun3']
+
+ traversal = dag.traverse(deptype=spack.nolink, deptype_query='run')
+ self.assertEqual([x.name for x in traversal], names)
diff --git a/lib/spack/spack/test/stage.py b/lib/spack/spack/test/stage.py
index 6d8c3ac67c..d3e3bf1383 100644
--- a/lib/spack/spack/test/stage.py
+++ b/lib/spack/spack/test/stage.py
@@ -35,8 +35,8 @@ from llnl.util.filesystem import *
from spack.stage import Stage
from spack.util.executable import which
-test_files_dir = join_path(spack.stage_path, '.test')
-test_tmp_path = join_path(test_files_dir, 'tmp')
+test_files_dir = os.path.realpath(join_path(spack.stage_path, '.test'))
+test_tmp_path = os.path.realpath(join_path(test_files_dir, 'tmp'))
archive_dir = 'test-files'
archive_name = archive_dir + '.tar.gz'
diff --git a/lib/spack/spack/util/pattern.py b/lib/spack/spack/util/pattern.py
index 6d4bcb1039..bc5e9d2ffe 100644
--- a/lib/spack/spack/util/pattern.py
+++ b/lib/spack/spack/util/pattern.py
@@ -28,42 +28,50 @@ import functools
def composite(interface=None, method_list=None, container=list):
- """
- Returns a class decorator that patches a class adding all the methods it needs to be a composite for a given
- interface.
+ """Returns a class decorator that patches a class adding all the methods
+ it needs to be a composite for a given interface.
- :param interface: class exposing the interface to which the composite object must conform. Only non-private and
- non-special methods will be taken into account
+ :param interface: class exposing the interface to which the composite
+ object must conform. Only non-private and non-special methods will be
+ taken into account
:param method_list: names of methods that should be part of the composite
- :param container: container for the composite object (default = list). Must fulfill the MutableSequence contract.
- The composite class will expose the container API to manage object composition
+ :param container: container for the composite object (default = list).
+ Must fulfill the MutableSequence contract. The composite class will expose
+ the container API to manage object composition
:return: class decorator
"""
- # Check if container fulfills the MutableSequence contract and raise an exception if it doesn't
- # The patched class returned by the decorator will inherit from the container class to expose the
- # interface needed to manage objects composition
+ # Check if container fulfills the MutableSequence contract and raise an
+ # exception if it doesn't. The patched class returned by the decorator will
+ # inherit from the container class to expose the interface needed to manage
+ # objects composition
if not issubclass(container, collections.MutableSequence):
raise TypeError("Container must fulfill the MutableSequence contract")
- # Check if at least one of the 'interface' or the 'method_list' arguments are defined
+ # Check if at least one of the 'interface' or the 'method_list' arguments
+ # are defined
if interface is None and method_list is None:
- raise TypeError("Either 'interface' or 'method_list' must be defined on a call to composite")
+ raise TypeError("Either 'interface' or 'method_list' must be defined on a call to composite") # NOQA : ignore=E501
def cls_decorator(cls):
- # Retrieve the base class of the composite. Inspect its methods and decide which ones will be overridden
+ # Retrieve the base class of the composite. Inspect its methods and
+ # decide which ones will be overridden
def no_special_no_private(x):
return inspect.ismethod(x) and not x.__name__.startswith('_')
- # Patch the behavior of each of the methods in the previous list. This is done associating an instance of the
- # descriptor below to any method that needs to be patched.
+ # Patch the behavior of each of the methods in the previous list.
+ # This is done associating an instance of the descriptor below to
+ # any method that needs to be patched.
class IterateOver(object):
+ """Decorator used to patch methods in a composite.
+
+ It iterates over all the items in the instance containing the
+ associated attribute and calls for each of them an attribute
+ with the same name
"""
- Decorator used to patch methods in a composite. It iterates over all the items in the instance containing the
- associated attribute and calls for each of them an attribute with the same name
- """
+
def __init__(self, name, func=None):
self.name = name
self.func = func
@@ -72,8 +80,9 @@ def composite(interface=None, method_list=None, container=list):
def getter(*args, **kwargs):
for item in instance:
getattr(item, self.name)(*args, **kwargs)
- # If we are using this descriptor to wrap a method from an interface, then we must conditionally
- # use the `functools.wraps` decorator to set the appropriate fields.
+ # If we are using this descriptor to wrap a method from an
+ # interface, then we must conditionally use the
+ # `functools.wraps` decorator to set the appropriate fields
if self.func is not None:
getter = functools.wraps(self.func)(getter)
return getter
@@ -81,7 +90,8 @@ def composite(interface=None, method_list=None, container=list):
dictionary_for_type_call = {}
# Construct a dictionary with the methods explicitly passed as name
if method_list is not None:
- # python@2.7: method_list_dict = {name: IterateOver(name) for name in method_list}
+ # python@2.7: method_list_dict = {name: IterateOver(name) for name
+ # in method_list}
method_list_dict = {}
for name in method_list:
method_list_dict[name] = IterateOver(name)
@@ -89,28 +99,40 @@ def composite(interface=None, method_list=None, container=list):
# Construct a dictionary with the methods inspected from the interface
if interface is not None:
##########
- # python@2.7: interface_methods = {name: method for name, method in inspect.getmembers(interface, predicate=no_special_no_private)}
+ # python@2.7: interface_methods = {name: method for name, method in
+ # inspect.getmembers(interface, predicate=no_special_no_private)}
interface_methods = {}
- for name, method in inspect.getmembers(interface, predicate=no_special_no_private):
+ for name, method in inspect.getmembers(interface, predicate=no_special_no_private): # NOQA: ignore=E501
interface_methods[name] = method
##########
- # python@2.7: interface_methods_dict = {name: IterateOver(name, method) for name, method in interface_methods.iteritems()}
+ # python@2.7: interface_methods_dict = {name: IterateOver(name,
+ # method) for name, method in interface_methods.iteritems()}
interface_methods_dict = {}
for name, method in interface_methods.iteritems():
interface_methods_dict[name] = IterateOver(name, method)
##########
dictionary_for_type_call.update(interface_methods_dict)
- # Get the methods that are defined in the scope of the composite class and override any previous definition
+ # Get the methods that are defined in the scope of the composite
+ # class and override any previous definition
##########
- # python@2.7: cls_method = {name: method for name, method in inspect.getmembers(cls, predicate=inspect.ismethod)}
+ # python@2.7: cls_method = {name: method for name, method in
+ # inspect.getmembers(cls, predicate=inspect.ismethod)}
cls_method = {}
- for name, method in inspect.getmembers(cls, predicate=inspect.ismethod):
+ for name, method in inspect.getmembers(cls, predicate=inspect.ismethod): # NOQA: ignore=E501
cls_method[name] = method
##########
dictionary_for_type_call.update(cls_method)
# Generate the new class on the fly and return it
# FIXME : inherit from interface if we start to use ABC classes?
- wrapper_class = type(cls.__name__, (cls, container), dictionary_for_type_call)
+ wrapper_class = type(cls.__name__, (cls, container),
+ dictionary_for_type_call)
return wrapper_class
return cls_decorator
+
+
+class Bunch(object):
+ """Carries a bunch of named attributes (from Alex Martelli bunch)"""
+
+ def __init__(self, **kwargs):
+ self.__dict__.update(kwargs)
diff --git a/share/spack/csh/spack.csh b/share/spack/csh/spack.csh
index d64ce8935b..5acd190449 100644
--- a/share/spack/csh/spack.csh
+++ b/share/spack/csh/spack.csh
@@ -74,25 +74,25 @@ case unload:
# tool's commands to add/remove the result from the environment.
switch ($_sp_subcommand)
case "use":
- set _sp_full_spec = ( "`\spack $_sp_flags module find dotkit $_sp_spec`" )
+ set _sp_full_spec = ( "`\spack $_sp_flags module find --module-type dotkit $_sp_spec`" )
if ( $? == 0 ) then
use $_sp_module_args $_sp_full_spec
endif
breaksw
case "unuse":
- set _sp_full_spec = ( "`\spack $_sp_flags module find dotkit $_sp_spec`" )
+ set _sp_full_spec = ( "`\spack $_sp_flags module find --module-type dotkit $_sp_spec`" )
if ( $? == 0 ) then
unuse $_sp_module_args $_sp_full_spec
endif
breaksw
case "load":
- set _sp_full_spec = ( "`\spack $_sp_flags module find tcl $_sp_spec`" )
+ set _sp_full_spec = ( "`\spack $_sp_flags module find --module-type tcl $_sp_spec`" )
if ( $? == 0 ) then
module load $_sp_module_args $_sp_full_spec
endif
breaksw
case "unload":
- set _sp_full_spec = ( "`\spack $_sp_flags module find tcl $_sp_spec`" )
+ set _sp_full_spec = ( "`\spack $_sp_flags module find --module-type tcl $_sp_spec`" )
if ( $? == 0 ) then
module unload $_sp_module_args $_sp_full_spec
endif
diff --git a/share/spack/qa/run-flake8 b/share/spack/qa/run-flake8
index 57534eb6e2..595df417ec 100755
--- a/share/spack/qa/run-flake8
+++ b/share/spack/qa/run-flake8
@@ -18,7 +18,7 @@ if [[ ! $flake8 ]]; then
fi
# Check if changed files are flake8 conformant [framework]
-changed=$(git diff --name-only develop... | grep '.py$')
+changed=$(git diff --name-only --find-renames develop... | grep '.py$')
# Add approved style exemptions to the changed packages.
for file in $changed; do
@@ -26,6 +26,7 @@ for file in $changed; do
cp "$file" "$file~"
# Exempt lines with urls and descriptions from overlong line errors.
+ perl -i -pe 's/^(\s*homepage\s*=.*)$/\1 # NOQA: ignore=E501/' $file
perl -i -pe 's/^(\s*url\s*=.*)$/\1 # NOQA: ignore=E501/' $file
perl -i -pe 's/^(\s*version\(.*\).*)$/\1 # NOQA: ignore=E501/' $file
perl -i -pe 's/^(\s*variant\(.*\).*)$/\1 # NOQA: ignore=E501/' $file
diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index 8aa259cf15..c6183f990d 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -57,6 +57,11 @@
########################################################################
function spack {
+ # Zsh does not do word splitting by default, this enables it for this function only
+ if [ -n "$ZSH_VERSION" ]; then
+ emulate -L sh
+ fi
+
# save raw arguments into an array before butchering them
args=( "$@" )
@@ -93,11 +98,18 @@ function spack {
;;
"use"|"unuse"|"load"|"unload")
# Shift any other args for use off before parsing spec.
+ _sp_subcommand_args=""
_sp_module_args=""
- if [[ "$1" =~ ^- ]]; then
- _sp_module_args="$1"; shift
- _sp_spec="$@"
- fi
+ while [[ "$1" =~ ^- ]]; do
+ if [ "$1" = "-r" -o "$1" = "--dependencies" ]; then
+ _sp_subcommand_args="$_sp_subcommand_args $1"
+ else
+ _sp_module_args="$_sp_module_args $1"
+ fi
+ shift
+ done
+
+ _sp_spec="$@"
# Here the user has run use or unuse with a spec. Find a matching
# spec using 'spack module find', then use the appropriate module
@@ -105,19 +117,19 @@ function spack {
# If spack module command comes back with an error, do nothing.
case $_sp_subcommand in
"use")
- if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
+ if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type dotkit $_sp_spec); then
use $_sp_module_args $_sp_full_spec
fi ;;
"unuse")
- if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
+ if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type dotkit $_sp_spec); then
unuse $_sp_module_args $_sp_full_spec
fi ;;
"load")
- if _sp_full_spec=$(command spack $_sp_flags module find tcl $_sp_spec); then
+ if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type tcl $_sp_spec); then
module load $_sp_module_args $_sp_full_spec
fi ;;
"unload")
- if _sp_full_spec=$(command spack $_sp_flags module find tcl $_sp_spec); then
+ if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type tcl $_sp_spec); then
module unload $_sp_module_args $_sp_full_spec
fi ;;
esac
diff --git a/var/spack/repos/builtin.mock/packages/cmake-client/package.py b/var/spack/repos/builtin.mock/packages/cmake-client/package.py
index 355689a2d2..c58430317a 100644
--- a/var/spack/repos/builtin.mock/packages/cmake-client/package.py
+++ b/var/spack/repos/builtin.mock/packages/cmake-client/package.py
@@ -38,7 +38,7 @@ class CmakeClient(Package):
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
- depends_on('cmake')
+ depends_on('cmake', type='build')
def setup_environment(self, spack_env, run_env):
diff --git a/var/spack/repos/builtin.mock/packages/dtbuild1/package.py b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py
new file mode 100644
index 0000000000..7429b2a8ef
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py
@@ -0,0 +1,18 @@
+from spack import *
+
+
+class Dtbuild1(Package):
+ """Package for use as a build tool for deptypes testing which has its own
+ deptree"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtbuild1-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dtbuild2', type='build')
+ depends_on('dtlink2')
+ depends_on('dtrun2', type='run')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtbuild2/package.py b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py
new file mode 100644
index 0000000000..cf3bb82a10
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtbuild2(Package):
+ """Simple package which acts as a build dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtbuild2-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtbuild3/package.py b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py
new file mode 100644
index 0000000000..6ba7e69a41
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtbuild3(Package):
+ """Simple package which acts as a build dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtbuild3-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink1/package.py b/var/spack/repos/builtin.mock/packages/dtlink1/package.py
new file mode 100644
index 0000000000..2747dcf354
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink1/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+
+class Dtlink1(Package):
+ """Simple package which acts as a link dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtlink1-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dtlink3')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink2/package.py b/var/spack/repos/builtin.mock/packages/dtlink2/package.py
new file mode 100644
index 0000000000..b80bad053f
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink2/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtlink2(Package):
+ """Simple package which acts as a link dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtlink2-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink3/package.py b/var/spack/repos/builtin.mock/packages/dtlink3/package.py
new file mode 100644
index 0000000000..bee8b4b8f8
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink3/package.py
@@ -0,0 +1,16 @@
+from spack import *
+
+
+class Dtlink3(Package):
+ """Simple package which acts as a link dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtlink3-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dtbuild2', type='build')
+ depends_on('dtlink4')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink4/package.py b/var/spack/repos/builtin.mock/packages/dtlink4/package.py
new file mode 100644
index 0000000000..3f05d5c0d6
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink4/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtlink4(Package):
+ """Simple package which acts as a link dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtlink4-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtlink5/package.py b/var/spack/repos/builtin.mock/packages/dtlink5/package.py
new file mode 100644
index 0000000000..c8b1e97d37
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtlink5/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtlink5(Package):
+ """Simple package which acts as a link dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtlink5-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtrun1/package.py b/var/spack/repos/builtin.mock/packages/dtrun1/package.py
new file mode 100644
index 0000000000..fb33b9b2f2
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtrun1/package.py
@@ -0,0 +1,16 @@
+from spack import *
+
+
+class Dtrun1(Package):
+ """Simple package which acts as a run dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtrun1-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dtlink5')
+ depends_on('dtrun3', type='run')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtrun2/package.py b/var/spack/repos/builtin.mock/packages/dtrun2/package.py
new file mode 100644
index 0000000000..e5d4b5e0b4
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtrun2/package.py
@@ -0,0 +1,13 @@
+from spack import *
+
+
+class Dtrun2(Package):
+ """Simple package which acts as a run dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtrun2-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtrun3/package.py b/var/spack/repos/builtin.mock/packages/dtrun3/package.py
new file mode 100644
index 0000000000..70dacf45ff
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtrun3/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+
+class Dtrun3(Package):
+ """Simple package which acts as a run dependency"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtrun3-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dtbuild3', type='build')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dttop/package.py b/var/spack/repos/builtin.mock/packages/dttop/package.py
new file mode 100644
index 0000000000..202a3b6883
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dttop/package.py
@@ -0,0 +1,17 @@
+from spack import *
+
+
+class Dttop(Package):
+ """Package with a complicated dependency tree"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dttop-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dtbuild1', type='build')
+ depends_on('dtlink1')
+ depends_on('dtrun1', type='run')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin.mock/packages/dtuse/package.py b/var/spack/repos/builtin.mock/packages/dtuse/package.py
new file mode 100644
index 0000000000..bd7391cee8
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/dtuse/package.py
@@ -0,0 +1,15 @@
+from spack import *
+
+
+class Dtuse(Package):
+ """Simple package which uses dttop"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/dtuse-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ depends_on('dttop')
+
+ def install(self, spec, prefix):
+ pass
diff --git a/var/spack/repos/builtin/packages/ImageMagick/package.py b/var/spack/repos/builtin/packages/ImageMagick/package.py
index f8173169e1..b0ccba1009 100644
--- a/var/spack/repos/builtin/packages/ImageMagick/package.py
+++ b/var/spack/repos/builtin/packages/ImageMagick/package.py
@@ -51,7 +51,7 @@ class Imagemagick(Package):
url="http://sourceforge.net/projects/imagemagick/files/old-sources/6.x/6.8/ImageMagick-6.8.9-10.tar.gz/download")
depends_on('jpeg')
- depends_on('libtool')
+ depends_on('libtool', type='build')
depends_on('libpng')
depends_on('freetype')
depends_on('fontconfig')
diff --git a/var/spack/repos/builtin/packages/Mitos/package.py b/var/spack/repos/builtin/packages/Mitos/package.py
index 83aca3dc6a..d577a1b285 100644
--- a/var/spack/repos/builtin/packages/Mitos/package.py
+++ b/var/spack/repos/builtin/packages/Mitos/package.py
@@ -41,6 +41,7 @@ class Mitos(Package):
depends_on('dyninst@8.2.1:')
depends_on('hwloc')
depends_on('mpi')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
with working_dir('spack-build', create=True):
diff --git a/var/spack/repos/builtin/packages/R/package.py b/var/spack/repos/builtin/packages/R/package.py
index 07bb6b6b03..ad06c2ca48 100644
--- a/var/spack/repos/builtin/packages/R/package.py
+++ b/var/spack/repos/builtin/packages/R/package.py
@@ -123,7 +123,7 @@ class R(Package):
# Set R_LIBS to include the library dir for the
# extension and any other R extensions it depends on.
r_libs_path = []
- for d in extension_spec.traverse():
+ for d in extension_spec.traverse(deptype=nolink, deptype_query='run'):
if d.package.extends(self.spec):
r_libs_path.append(os.path.join(d.prefix, self.r_lib_dir))
@@ -136,6 +136,14 @@ class R(Package):
run_env.prepend_path('R_LIBS', os.path.join(
extension_spec.prefix, self.r_lib_dir))
+ def setup_environment(self, spack_env, run_env):
+ run_env.prepend_path('LIBRARY_PATH',
+ join_path(self.prefix, 'rlib', 'R', 'lib'))
+ run_env.prepend_path('LD_LIBRARY_PATH',
+ join_path(self.prefix, 'rlib', 'R', 'lib'))
+ run_env.prepend_path('CPATH',
+ join_path(self.prefix, 'rlib', 'R', 'include'))
+
def setup_dependent_package(self, module, ext_spec):
"""Called before R modules' install() methods. In most cases,
extensions will only need to have one line:
diff --git a/var/spack/repos/builtin/packages/adept-utils/package.py b/var/spack/repos/builtin/packages/adept-utils/package.py
index 7b6c3702af..592681bb82 100644
--- a/var/spack/repos/builtin/packages/adept-utils/package.py
+++ b/var/spack/repos/builtin/packages/adept-utils/package.py
@@ -35,6 +35,7 @@ class AdeptUtils(Package):
depends_on("boost")
depends_on("mpi")
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake(*std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/adios/package.py b/var/spack/repos/builtin/packages/adios/package.py
index 9e0452ba6f..59e0a451a9 100644
--- a/var/spack/repos/builtin/packages/adios/package.py
+++ b/var/spack/repos/builtin/packages/adios/package.py
@@ -12,9 +12,9 @@ class Adios(Package):
"""
homepage = "http://www.olcf.ornl.gov/center-projects/adios/"
- url = "http://users.nccs.gov/~pnorbert/adios-1.9.0.tar.gz"
+ url = "https://github.com/ornladios/ADIOS/archive/v1.9.0.tar.gz"
- version('1.9.0', 'dbf5cb10e32add2f04c9b4052b7ffa76')
+ version('1.9.0', '310ff02388bbaa2b1c1710ee970b5678')
# Lots of setting up here for this package
# module swap PrgEnv-intel PrgEnv-$COMP
diff --git a/var/spack/repos/builtin/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py
index 20cbd8e8c6..59fbe50c93 100644
--- a/var/spack/repos/builtin/packages/apex/package.py
+++ b/var/spack/repos/builtin/packages/apex/package.py
@@ -33,7 +33,7 @@ class Apex(Package):
depends_on("binutils+libiberty")
depends_on("boost@1.54:")
- depends_on("cmake@2.8.12:")
+ depends_on('cmake@2.8.12:', type='build')
depends_on("activeharmony@4.5:")
depends_on("ompt-openmp")
diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py
index b3e5994e30..4356f60aca 100644
--- a/var/spack/repos/builtin/packages/armadillo/package.py
+++ b/var/spack/repos/builtin/packages/armadillo/package.py
@@ -33,11 +33,13 @@ class Armadillo(Package):
homepage = "http://arma.sourceforge.net/"
url = "http://sourceforge.net/projects/arma/files/armadillo-7.200.1.tar.xz"
+ version('7.200.2', 'b21585372d67a8876117fd515d8cf0a2')
version('7.200.1', 'ed86d6df0058979e107502e1fe3e469e')
variant('hdf5', default=False, description='Include HDF5 support')
- depends_on('arpack')
+ depends_on('cmake@2.8:', type='build')
+ depends_on('arpack-ng') # old arpack causes undefined symbols
depends_on('blas')
depends_on('lapack')
depends_on('superlu@5.2:')
@@ -46,8 +48,8 @@ class Armadillo(Package):
def install(self, spec, prefix):
cmake_args = [
# ARPACK support
- '-DARPACK_LIBRARY={0}/libarpack.a'.format(
- spec['arpack'].prefix.lib),
+ '-DARPACK_LIBRARY={0}/libarpack.{1}'.format(
+ spec['arpack-ng'].prefix.lib, dso_suffix),
# BLAS support
'-DBLAS_LIBRARY={0}'.format(spec['blas'].blas_shared_lib),
# LAPACK support
diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py
index d9021f8043..d5dc703c06 100644
--- a/var/spack/repos/builtin/packages/arpack-ng/package.py
+++ b/var/spack/repos/builtin/packages/arpack-ng/package.py
@@ -72,10 +72,10 @@ class ArpackNg(Package):
depends_on('blas')
depends_on('lapack')
- depends_on('automake', when='@3.3.0')
- depends_on('autoconf', when='@3.3.0')
- depends_on('libtool@2.4.2:', when='@3.3.0')
- depends_on('cmake@2.8.6:', when='@3.4.0:')
+ depends_on('automake', when='@3.3.0', type='build')
+ depends_on('autoconf', when='@3.3.0', type='build')
+ depends_on('libtool@2.4.2:', when='@3.3.0', type='build')
+ depends_on('cmake@2.8.6:', when='@3.4.0:', type='build')
depends_on('mpi', when='+mpi')
diff --git a/var/spack/repos/builtin/packages/autoconf/package.py b/var/spack/repos/builtin/packages/autoconf/package.py
index 770ceed48b..2de1c390db 100644
--- a/var/spack/repos/builtin/packages/autoconf/package.py
+++ b/var/spack/repos/builtin/packages/autoconf/package.py
@@ -35,7 +35,7 @@ class Autoconf(Package):
version('2.69', '82d05e03b93e45f5a39b828dc9c6c29b')
version('2.62', '6c1f3b3734999035d77da5024aab4fbd')
- depends_on('m4')
+ depends_on('m4', type='build')
def _make_executable(self, name):
return Executable(join_path(self.prefix.bin, name))
diff --git a/var/spack/repos/builtin/packages/automaded/package.py b/var/spack/repos/builtin/packages/automaded/package.py
index fc65a04a06..2b4681778f 100644
--- a/var/spack/repos/builtin/packages/automaded/package.py
+++ b/var/spack/repos/builtin/packages/automaded/package.py
@@ -44,6 +44,7 @@ class Automaded(Package):
depends_on('mpi')
depends_on('boost')
depends_on('callpath')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake("-DSTATE_TRACKER_WITH_CALLPATH=ON", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/bear/package.py b/var/spack/repos/builtin/packages/bear/package.py
index 730a684ec5..a137fded08 100644
--- a/var/spack/repos/builtin/packages/bear/package.py
+++ b/var/spack/repos/builtin/packages/bear/package.py
@@ -31,7 +31,7 @@ class Bear(Package):
version('2.0.4', 'fd8afb5e8e18f8737ba06f90bd77d011')
- depends_on("cmake")
+ depends_on('cmake', type='build')
depends_on("python")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/bertini/package.py b/var/spack/repos/builtin/packages/bertini/package.py
index 8d7da705e4..7dd17a062e 100644
--- a/var/spack/repos/builtin/packages/bertini/package.py
+++ b/var/spack/repos/builtin/packages/bertini/package.py
@@ -37,8 +37,8 @@ class Bertini(Package):
variant('mpi', default=True, description='Compile in parallel')
- depends_on('flex')
- depends_on('bison')
+ depends_on('flex', type='build')
+ depends_on('bison', type='build')
depends_on('gmp')
depends_on('mpfr')
depends_on('mpi', when='+mpi')
diff --git a/var/spack/repos/builtin/packages/binutils/package.py b/var/spack/repos/builtin/packages/binutils/package.py
index 35d52128c3..e329e6fd7a 100644
--- a/var/spack/repos/builtin/packages/binutils/package.py
+++ b/var/spack/repos/builtin/packages/binutils/package.py
@@ -38,9 +38,9 @@ class Binutils(Package):
version('2.23.2', '4f8fa651e35ef262edc01d60fb45702e')
version('2.20.1', '2b9dc8f2b7dbd5ec5992c6e29de0b764')
- depends_on('m4')
- depends_on('flex')
- depends_on('bison')
+ depends_on('m4', type='build')
+ depends_on('flex', type='build')
+ depends_on('bison', type='build')
# Add a patch that creates binutils libiberty_pic.a which is preferred by
# OpenSpeedShop and cbtf-krell
diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py
index c5bc051c80..c7a125df15 100644
--- a/var/spack/repos/builtin/packages/bison/package.py
+++ b/var/spack/repos/builtin/packages/bison/package.py
@@ -34,7 +34,7 @@ class Bison(Package):
version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8')
- depends_on("m4")
+ depends_on("m4", type='build')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/boxlib/package.py b/var/spack/repos/builtin/packages/boxlib/package.py
index ec7db6c08e..216ae1ec12 100644
--- a/var/spack/repos/builtin/packages/boxlib/package.py
+++ b/var/spack/repos/builtin/packages/boxlib/package.py
@@ -35,6 +35,7 @@ class Boxlib(Package):
version('master', git='https://ccse.lbl.gov/pub/Downloads/BoxLib.git')
depends_on('mpi')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
args = std_cmake_args
diff --git a/var/spack/repos/builtin/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py
index 3b6d1d830e..27303293d2 100644
--- a/var/spack/repos/builtin/packages/bzip2/package.py
+++ b/var/spack/repos/builtin/packages/bzip2/package.py
@@ -24,54 +24,59 @@
##############################################################################
from spack import *
+
class Bzip2(Package):
"""bzip2 is a freely available, patent free high-quality data
- compressor. It typically compresses files to within 10% to 15%
- of the best available techniques (the PPM family of statistical
- compressors), whilst being around twice as fast at compression
- and six times faster at decompression.
+ compressor. It typically compresses files to within 10% to 15%
+ of the best available techniques (the PPM family of statistical
+ compressors), whilst being around twice as fast at compression
+ and six times faster at decompression."""
- """
homepage = "http://www.bzip.org"
url = "http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz"
version('1.0.6', '00b516f4704d4a7cb50a1d97e6e8e15b')
-
def patch(self):
- mf = FileFilter('Makefile-libbz2_so')
- mf.filter(r'^CC=gcc', 'CC=cc')
+ # bzip2 comes with two separate Makefiles for static and dynamic builds
+ # Tell both to use Spack's compiler wrapper instead of GCC
+ filter_file(r'^CC=gcc', 'CC=cc', 'Makefile')
+ filter_file(r'^CC=gcc', 'CC=cc', 'Makefile-libbz2_so')
- # Below stuff patches the link line to use RPATHs on Mac OS X.
+ # Patch the link line to use RPATHs on macOS
if 'darwin' in self.spec.architecture:
v = self.spec.version
- v1, v2, v3 = (v.up_to(i) for i in (1,2,3))
+ v1, v2, v3 = (v.up_to(i) for i in (1, 2, 3))
- mf.filter('$(CC) -shared -Wl,-soname -Wl,libbz2.so.{0} -o libbz2.so.{1} $(OBJS)'.format(v2, v3),
- '$(CC) -dynamiclib -Wl,-install_name -Wl,@rpath/libbz2.{0}.dylib -current_version {1} -compatibility_version {2} -o libbz2.{3}.dylib $(OBJS)'.format(v1, v2, v3, v3), string=True)
+ kwargs = {'ignore_absent': False, 'backup': False, 'string': True}
- mf.filter('$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.{0}'.format(v3),
- '$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.{0}.dylib'.format(v3), string=True)
+ mf = FileFilter('Makefile-libbz2_so')
+ mf.filter('$(CC) -shared -Wl,-soname -Wl,libbz2.so.{0} -o libbz2.so.{1} $(OBJS)'.format(v2, v3), # NOQA ignore=E501
+ '$(CC) -dynamiclib -Wl,-install_name -Wl,@rpath/libbz2.{0}.dylib -current_version {1} -compatibility_version {2} -o libbz2.{3}.dylib $(OBJS)'.format(v1, v2, v3, v3), **kwargs) # NOQA ignore=E501
+
+ mf.filter('$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.{0}'.format(v3), # NOQA ignore=E501
+ '$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.{0}.dylib'.format(v3), **kwargs) # NOQA ignore=E501
mf.filter('rm -f libbz2.so.{0}'.format(v2),
- 'rm -f libbz2.{0}.dylib'.format(v2), string=True)
+ 'rm -f libbz2.{0}.dylib'.format(v2), **kwargs)
mf.filter('ln -s libbz2.so.{0} libbz2.so.{1}'.format(v3, v2),
- 'ln -s libbz2.{0}.dylib libbz2.{1}.dylib'.format(v3, v2), string=True)
-
+ 'ln -s libbz2.{0}.dylib libbz2.{1}.dylib'.format(v3, v2), **kwargs) # NOQA ignore=E501
def install(self, spec, prefix):
+ # Build the dynamic library first
make('-f', 'Makefile-libbz2_so')
- make('clean')
- make("install", "PREFIX=%s" % prefix)
+ # Build the static library and everything else
+ make()
+ make('install', 'PREFIX={0}'.format(prefix))
install('bzip2-shared', join_path(prefix.bin, 'bzip2'))
- v1, v2, v3 = (self.spec.version.up_to(i) for i in (1,2,3))
+ v1, v2, v3 = (self.spec.version.up_to(i) for i in (1, 2, 3))
if 'darwin' in self.spec.architecture:
lib = 'libbz2.dylib'
- lib1, lib2, lib3 = ('libbz2.{0}.dylib'.format(v) for v in (v1, v2, v3))
+ lib1, lib2, lib3 = ('libbz2.{0}.dylib'.format(v) for v in (v1, v2, v3)) # NOQA ignore=E501
else:
lib = 'libbz2.so'
- lib1, lib2, lib3 = ('libbz2.so.{0}'.format(v) for v in (v1, v2, v3))
+ lib1, lib2, lib3 = ('libbz2.so.{0}'.format(v) for v in (v1, v2, v3)) # NOQA ignore=E501
install(lib3, join_path(prefix.lib, lib3))
with working_dir(prefix.lib):
diff --git a/var/spack/repos/builtin/packages/c-blosc/package.py b/var/spack/repos/builtin/packages/c-blosc/package.py
index dee332be14..49f9861126 100644
--- a/var/spack/repos/builtin/packages/c-blosc/package.py
+++ b/var/spack/repos/builtin/packages/c-blosc/package.py
@@ -38,7 +38,7 @@ class CBlosc(Package):
version('1.8.1', 'd73d5be01359cf271e9386c90dcf5b05')
version('1.8.0', '5b92ecb287695ba20cc33d30bf221c4f')
- depends_on("cmake")
+ depends_on("cmake", type='build')
depends_on("snappy")
depends_on("zlib")
diff --git a/var/spack/repos/builtin/packages/caliper/package.py b/var/spack/repos/builtin/packages/caliper/package.py
index a424c73859..4a0fc54acc 100644
--- a/var/spack/repos/builtin/packages/caliper/package.py
+++ b/var/spack/repos/builtin/packages/caliper/package.py
@@ -41,6 +41,7 @@ class Caliper(Package):
depends_on('libunwind')
depends_on('papi')
depends_on('mpi', when='+mpi')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
with working_dir('build', create=True):
diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py
index 2ad2dc60e4..2f171fb9ce 100644
--- a/var/spack/repos/builtin/packages/callpath/package.py
+++ b/var/spack/repos/builtin/packages/callpath/package.py
@@ -39,6 +39,7 @@ class Callpath(Package):
depends_on("dyninst")
depends_on("adept-utils")
depends_on("mpi")
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
# TODO: offer options for the walker used.
diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py
index e9e5da4486..8e4f23046b 100644
--- a/var/spack/repos/builtin/packages/cantera/package.py
+++ b/var/spack/repos/builtin/packages/cantera/package.py
@@ -42,7 +42,7 @@ class Cantera(Package):
variant('matlab', default=False, description='Build the Cantera Matlab toolbox')
# Required dependencies
- depends_on('scons')
+ depends_on('scons', type='build')
# Recommended dependencies
depends_on('blas', when='+lapack')
@@ -52,10 +52,10 @@ class Cantera(Package):
# Python module dependencies
extends('python', when='+python')
- depends_on('py-numpy', when='+python')
- depends_on('py-scipy', when='+python')
- depends_on('py-cython', when='+python')
- depends_on('py-3to2', when='+python')
+ depends_on('py-numpy', when='+python', type=nolink)
+ depends_on('py-scipy', when='+python', type=nolink)
+ depends_on('py-cython', when='+python', type=nolink)
+ depends_on('py-3to2', when='+python', type=nolink)
# TODO: these "when" specs don't actually work
# depends_on('py-unittest2', when='+python^python@2.6')
# depends_on('py-unittest2py3k', when='+python^python@3.1')
diff --git a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
index 7ce90ce0db..321d02b556 100644
--- a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py
@@ -53,7 +53,7 @@ class CbtfArgonavis(Package):
version('1.6', branch='master', git='https://github.com/OpenSpeedShop/cbtf-argonavis.git')
- depends_on("cmake@3.0.2")
+ depends_on("cmake@3.0.2", type='build')
depends_on("boost@1.50.0:")
depends_on("papi")
depends_on("mrnet@5.0.1:+lwthreads+krellpatch")
diff --git a/var/spack/repos/builtin/packages/cbtf-krell/package.py b/var/spack/repos/builtin/packages/cbtf-krell/package.py
index 7506f78146..acb78a7395 100644
--- a/var/spack/repos/builtin/packages/cbtf-krell/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-krell/package.py
@@ -64,7 +64,7 @@ class CbtfKrell(Package):
variant('mpich', default=False, description="Build mpi experiment collector for mpich MPI when this variant is enabled.")
# Dependencies for cbtf-krell
- depends_on("cmake@3.0.2")
+ depends_on("cmake@3.0.2", type='build')
# For binutils service
depends_on("binutils@2.24+krellpatch")
diff --git a/var/spack/repos/builtin/packages/cbtf-lanl/package.py b/var/spack/repos/builtin/packages/cbtf-lanl/package.py
index fa7de3d4a3..5694535fcc 100644
--- a/var/spack/repos/builtin/packages/cbtf-lanl/package.py
+++ b/var/spack/repos/builtin/packages/cbtf-lanl/package.py
@@ -53,7 +53,7 @@ class CbtfLanl(Package):
version('1.6', branch='master', git='http://git.code.sf.net/p/cbtf-lanl/cbtf-lanl')
- depends_on("cmake@3.0.2")
+ depends_on("cmake@3.0.2", type='build')
# Dependencies for cbtf-krell
depends_on("mrnet@5.0.1:+lwthreads+krellpatch")
depends_on("xerces-c@3.1.1:")
diff --git a/var/spack/repos/builtin/packages/cbtf/package.py b/var/spack/repos/builtin/packages/cbtf/package.py
index 2231cf1d45..017b897f3c 100644
--- a/var/spack/repos/builtin/packages/cbtf/package.py
+++ b/var/spack/repos/builtin/packages/cbtf/package.py
@@ -57,7 +57,7 @@ class Cbtf(Package):
variant('runtime', default=False, description="build only the runtime libraries and collectors.")
- depends_on("cmake@3.0.2")
+ depends_on("cmake@3.0.2", type='build')
depends_on("boost@1.50.0:")
depends_on("mrnet@5.0.1:+lwthreads+krellpatch")
depends_on("xerces-c@3.1.1:")
diff --git a/var/spack/repos/builtin/packages/cdo/package.py b/var/spack/repos/builtin/packages/cdo/package.py
new file mode 100644
index 0000000000..7400c3a56c
--- /dev/null
+++ b/var/spack/repos/builtin/packages/cdo/package.py
@@ -0,0 +1,42 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Cdo(Package):
+ """CDO is a collection of command line Operators to manipulate and analyse
+ Climate and NWP model Data. """
+
+ homepage = "https://code.zmaw.de/projects/cdo"
+ url = "https://code.zmaw.de/attachments/download/10198/cdo-1.6.9.tar.gz"
+
+ version('1.6.9', 'bf0997bf20e812f35e10188a930e24e2')
+
+ depends_on('netcdf')
+
+ def install(self, spec, prefix):
+ configure('--prefix={0}'.format(prefix))
+ make()
+ make('install')
diff --git a/var/spack/repos/builtin/packages/cereal/package.py b/var/spack/repos/builtin/packages/cereal/package.py
index 80198fa224..41dc9a274b 100644
--- a/var/spack/repos/builtin/packages/cereal/package.py
+++ b/var/spack/repos/builtin/packages/cereal/package.py
@@ -40,7 +40,7 @@ class Cereal(Package):
patch("Werror.patch")
- depends_on("cmake @2.6.2:")
+ depends_on('cmake@2.6.2:', type='build')
def install(self, spec, prefix):
# Don't use -Werror
diff --git a/var/spack/repos/builtin/packages/cgal/package.py b/var/spack/repos/builtin/packages/cgal/package.py
index ea1b20e34f..5c87978339 100644
--- a/var/spack/repos/builtin/packages/cgal/package.py
+++ b/var/spack/repos/builtin/packages/cgal/package.py
@@ -46,7 +46,7 @@ class Cgal(Package):
depends_on('mpfr')
depends_on('gmp')
depends_on('zlib')
- depends_on('cmake')
+ depends_on('cmake', type='build')
# FIXME : Qt5 dependency missing (needs Qt5 and OpenGL)
# FIXME : Optional third party libraries missing
diff --git a/var/spack/repos/builtin/packages/cleverleaf/package.py b/var/spack/repos/builtin/packages/cleverleaf/package.py
index 6b54d1bf26..c258e89514 100644
--- a/var/spack/repos/builtin/packages/cleverleaf/package.py
+++ b/var/spack/repos/builtin/packages/cleverleaf/package.py
@@ -40,6 +40,7 @@ class Cleverleaf(Package):
depends_on("SAMRAI@3.8.0:")
depends_on("hdf5+mpi")
depends_on("boost")
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake(*std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py
index 7b2a125fe5..bfb8764feb 100644
--- a/var/spack/repos/builtin/packages/cmake/package.py
+++ b/var/spack/repos/builtin/packages/cmake/package.py
@@ -30,6 +30,7 @@ class Cmake(Package):
homepage = 'https://www.cmake.org'
url = 'https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz'
+ version('3.6.0', 'aa40fbecf49d99c083415c2411d12db9')
version('3.5.2', '701386a1b5ec95f8d1075ecf96383e02')
version('3.5.1', 'ca051f4a66375c89d1a524e726da0296')
version('3.5.0', '33c5d09d4c33d4ffcc63578a6ba8777e')
@@ -47,8 +48,8 @@ class Cmake(Package):
depends_on('ncurses', when='+ncurses')
depends_on('openssl', when='+openssl')
depends_on('qt', when='+qt')
- depends_on('python@2.7.11:', when='+doc')
- depends_on('py-sphinx', when='+doc')
+ depends_on('python@2.7.11:', when='+doc', type='build')
+ depends_on('py-sphinx', when='+doc', type='build')
def url_for_version(self, version):
"""Handle CMake's version-based custom URLs."""
diff --git a/var/spack/repos/builtin/packages/cmocka/package.py b/var/spack/repos/builtin/packages/cmocka/package.py
index 41f80d9761..aa2b3cc3bb 100644
--- a/var/spack/repos/builtin/packages/cmocka/package.py
+++ b/var/spack/repos/builtin/packages/cmocka/package.py
@@ -32,6 +32,8 @@ class Cmocka(Package):
version('1.0.1', 'ed861e501a21a92b2af63e466df2015e')
parallel = False
+ depends_on('cmake', type='build')
+
def install(self, spec, prefix):
with working_dir('spack-build', create=True):
cmake('..', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/cram/package.py b/var/spack/repos/builtin/packages/cram/package.py
index 7e05587087..283bc5adea 100644
--- a/var/spack/repos/builtin/packages/cram/package.py
+++ b/var/spack/repos/builtin/packages/cram/package.py
@@ -33,6 +33,7 @@ class Cram(Package):
extends('python')
depends_on("mpi")
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake(".", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py
index d69f3e5009..a251a94470 100644
--- a/var/spack/repos/builtin/packages/czmq/package.py
+++ b/var/spack/repos/builtin/packages/czmq/package.py
@@ -32,10 +32,10 @@ class Czmq(Package):
version('3.0.2', '23e9885f7ee3ce88d99d0425f52e9be1', url='https://github.com/zeromq/czmq/archive/v3.0.2.tar.gz')
- depends_on('libtool')
- depends_on('automake')
- depends_on('autoconf')
- depends_on('pkg-config')
+ depends_on('libtool', type='build')
+ depends_on('automake', type='build')
+ depends_on('autoconf', type='build')
+ depends_on('pkg-config', type='build')
depends_on('zeromq')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py
index 3a8ddf28ef..d0d22d9728 100644
--- a/var/spack/repos/builtin/packages/dakota/package.py
+++ b/var/spack/repos/builtin/packages/dakota/package.py
@@ -55,6 +55,7 @@ class Dakota(Package):
depends_on('python')
depends_on('boost')
+ depends_on('cmake', type='build')
def url_for_version(self, version):
return Dakota._url_str.format(version=version)
diff --git a/var/spack/repos/builtin/packages/damselfly/package.py b/var/spack/repos/builtin/packages/damselfly/package.py
index 42fab63f98..427997072c 100644
--- a/var/spack/repos/builtin/packages/damselfly/package.py
+++ b/var/spack/repos/builtin/packages/damselfly/package.py
@@ -31,6 +31,8 @@ class Damselfly(Package):
version('1.0', '05cf7e2d8ece4408c0f2abb7ab63fd74c0d62895', git='https://github.com/llnl/damselfly.git', tag='v1.0')
+ depends_on('cmake', type='build')
+
def install(self, spec, prefix):
with working_dir('spack-build', create=True):
cmake('-DCMAKE_BUILD_TYPE=release', '..', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/datamash/package.py b/var/spack/repos/builtin/packages/datamash/package.py
new file mode 100644
index 0000000000..ef30c50ebe
--- /dev/null
+++ b/var/spack/repos/builtin/packages/datamash/package.py
@@ -0,0 +1,45 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Datamash(Package):
+ """
+ GNU datamash is a command-line program which performs basic numeric,
+ textual and statistical operations on input textual data files.
+ """
+
+ homepage = "https://www.gnu.org/software/datamash/"
+ url = "http://ftp.gnu.org/gnu/datamash/datamash-1.0.5.tar.gz"
+
+ version('1.1.0', '79a6affca08107a095e97e4237fc8775')
+ version('1.0.7', '9f317bab07454032ba9c068e7f17b04b')
+ version('1.0.6', 'ff26fdef0f343cb695cf1853e14a1a5b')
+ version('1.0.5', '9a29549dc7feca49fdc5fab696614e11')
+
+ def install(self, spec, prefix):
+ configure('--prefix=%s' % prefix)
+ make()
+ make("install")
diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py
index e7984466ba..54604d351f 100644
--- a/var/spack/repos/builtin/packages/dealii/package.py
+++ b/var/spack/repos/builtin/packages/dealii/package.py
@@ -60,7 +60,7 @@ class Dealii(Package):
depends_on("boost@1.59.0:+thread+system+serialization+iostreams", when='~mpi') # NOQA: ignore=E501
depends_on("boost@1.59.0:+mpi+thread+system+serialization+iostreams", when='+mpi') # NOQA: ignore=E501
depends_on("bzip2")
- depends_on("cmake")
+ depends_on("cmake", type='build')
depends_on("lapack")
depends_on("muparser")
depends_on("suite-sparse")
diff --git a/var/spack/repos/builtin/packages/dia/package.py b/var/spack/repos/builtin/packages/dia/package.py
index 38742b7e7d..1685f0009f 100644
--- a/var/spack/repos/builtin/packages/dia/package.py
+++ b/var/spack/repos/builtin/packages/dia/package.py
@@ -31,7 +31,7 @@ class Dia(Package):
version('0.97.3', '0e744a0f6a6c4cb6a089e4d955392c3c')
- depends_on('intltool')
+ depends_on('intltool', type='build')
depends_on('gtkplus@2.6.0:')
depends_on('cairo')
#depends_on('libart') # optional dependency, not yet supported by spack.
diff --git a/var/spack/repos/builtin/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py
index b2e9582b5a..267ba61756 100644
--- a/var/spack/repos/builtin/packages/doxygen/package.py
+++ b/var/spack/repos/builtin/packages/doxygen/package.py
@@ -24,6 +24,8 @@
##############################################################################
from spack import *
+import sys
+
class Doxygen(Package):
"""Doxygen is the de facto standard tool for generating documentation
@@ -41,12 +43,12 @@ class Doxygen(Package):
# graphviz appears to be a run-time optional dependency
variant('graphviz', default=True, description='Build with dot command support from Graphviz.') # NOQA: ignore=E501
- depends_on("cmake@2.8.12:")
- depends_on("flex")
- depends_on("bison")
+ depends_on("cmake@2.8.12:", type='build')
+ depends_on("flex", type='build')
+ depends_on("bison", type='build')
# optional dependencies
- depends_on("graphviz", when="+graphviz")
+ depends_on("graphviz", when="+graphviz", type='run')
def install(self, spec, prefix):
cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py
index 735936f087..efe4de4abf 100644
--- a/var/spack/repos/builtin/packages/dyninst/package.py
+++ b/var/spack/repos/builtin/packages/dyninst/package.py
@@ -43,6 +43,7 @@ class Dyninst(Package):
depends_on("libelf")
depends_on("libdwarf")
depends_on("boost@1.42:")
+ depends_on('cmake', type='build')
# new version uses cmake
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py
index 9ff4107619..97343f499b 100644
--- a/var/spack/repos/builtin/packages/eigen/package.py
+++ b/var/spack/repos/builtin/packages/eigen/package.py
@@ -47,7 +47,7 @@ class Eigen(Package):
variant('mpfr', default=True, description='Enables support for multi-precisions floating points via mpfr')
# TODO : dependency on googlehash, superlu, adolc missing
- depends_on('cmake')
+ depends_on('cmake', type='build')
depends_on('metis@5:', when='+metis')
depends_on('scotch', when='+scotch')
depends_on('fftw', when='+fftw')
diff --git a/var/spack/repos/builtin/packages/environment-modules/package.py b/var/spack/repos/builtin/packages/environment-modules/package.py
index fe7a5ee4f6..5d5bb3be02 100644
--- a/var/spack/repos/builtin/packages/environment-modules/package.py
+++ b/var/spack/repos/builtin/packages/environment-modules/package.py
@@ -35,7 +35,7 @@ class EnvironmentModules(Package):
version('3.2.10', '8b097fdcb90c514d7540bb55a3cb90fb')
# Dependencies:
- depends_on('tcl')
+ depends_on('tcl', type=alldeps)
def install(self, spec, prefix):
tcl_spec = spec['tcl']
diff --git a/var/spack/repos/builtin/packages/exodusii/package.py b/var/spack/repos/builtin/packages/exodusii/package.py
index 5e9227af46..eb6c23afeb 100644
--- a/var/spack/repos/builtin/packages/exodusii/package.py
+++ b/var/spack/repos/builtin/packages/exodusii/package.py
@@ -44,9 +44,7 @@ class Exodusii(Package):
version('2016-02-08', git='https://github.com/gsjaardema/seacas.git', commit='dcf3529')
- # TODO: Make this a build dependency once build dependencies are supported
- # (see: https://github.com/LLNL/spack/pull/378).
- depends_on('cmake@2.8.7:')
+ depends_on('cmake@2.8.7:', type='build')
depends_on('hdf5~shared~mpi')
depends_on('netcdf~mpi')
diff --git a/var/spack/repos/builtin/packages/expat/package.py b/var/spack/repos/builtin/packages/expat/package.py
index 51e827b2c5..2a9ac123f3 100644
--- a/var/spack/repos/builtin/packages/expat/package.py
+++ b/var/spack/repos/builtin/packages/expat/package.py
@@ -31,7 +31,7 @@ class Expat(Package):
version('2.1.0', 'dd7dab7a5fea97d2a6a43f511449b7cd')
- depends_on('cmake')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py
index b778538606..9b173bb0dd 100644
--- a/var/spack/repos/builtin/packages/flex/package.py
+++ b/var/spack/repos/builtin/packages/flex/package.py
@@ -34,7 +34,8 @@ class Flex(Package):
version('2.6.0', '5724bcffed4ebe39e9b55a9be80859ec')
version('2.5.39', 'e133e9ead8ec0a58d81166b461244fde')
- depends_on("bison")
+ depends_on("bison", type='build')
+ depends_on("m4", type='build')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/flux/package.py b/var/spack/repos/builtin/packages/flux/package.py
index 2b972d63ae..dec339a6af 100644
--- a/var/spack/repos/builtin/packages/flux/package.py
+++ b/var/spack/repos/builtin/packages/flux/package.py
@@ -45,8 +45,8 @@ class Flux(Package):
depends_on("py-cffi")
# TODO: This provides a catalog, hacked with environment below for now
- depends_on("docbook-xml")
- depends_on("asciidoc")
+ depends_on("docbook-xml", type='build')
+ depends_on("asciidoc", type='build')
def install(self, spec, prefix):
# Bootstrap with autotools
diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py
index 4479fc9bee..0ff5765895 100644
--- a/var/spack/repos/builtin/packages/foam-extend/package.py
+++ b/var/spack/repos/builtin/packages/foam-extend/package.py
@@ -29,6 +29,7 @@ class FoamExtend(Package):
depends_on('python')
depends_on('flex@:2.5.99')
depends_on('zlib')
+ depends_on('cmake', type='build')
depends_on('scotch ~ metis', when='~ptscotch+scotch')
depends_on('scotch ~ metis + mpi', when='+ptscotch')
diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py
index caff06bdd6..9ed83bc3be 100644
--- a/var/spack/repos/builtin/packages/gdal/package.py
+++ b/var/spack/repos/builtin/packages/gdal/package.py
@@ -62,7 +62,7 @@ class Gdal(Package):
depends_on("libpng")
depends_on("zlib")
depends_on("proj")
- depends_on("py-numpy")
+ depends_on("py-numpy", type=nolink)
parallel = False
diff --git a/var/spack/repos/builtin/packages/gdb/package.py b/var/spack/repos/builtin/packages/gdb/package.py
index 58d8a545db..78ad4b307d 100644
--- a/var/spack/repos/builtin/packages/gdb/package.py
+++ b/var/spack/repos/builtin/packages/gdb/package.py
@@ -41,7 +41,7 @@ class Gdb(Package):
version('7.9', '8f8ced422fe462a00e0135a643544f17')
version('7.8.2', '8b0ea8b3559d3d90b3ff4952f0aeafbc')
- depends_on('texinfo')
+ depends_on('texinfo', type='build')
def install(self, spec, prefix):
configure('--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/gflags/package.py b/var/spack/repos/builtin/packages/gflags/package.py
index 9f3552d53d..47bbf369ef 100644
--- a/var/spack/repos/builtin/packages/gflags/package.py
+++ b/var/spack/repos/builtin/packages/gflags/package.py
@@ -37,6 +37,8 @@ class Gflags(Package):
version('2.1.2', 'ac432de923f9de1e9780b5254884599f')
+ depends_on('cmake', type='build')
+
def install(self, spec, prefix):
cmake("-DCMAKE_INSTALL_PREFIX=" + prefix,
"-DBUILD_SHARED_LIBS=ON")
diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py
index 03e7d3e031..4cbbaac342 100644
--- a/var/spack/repos/builtin/packages/git/package.py
+++ b/var/spack/repos/builtin/packages/git/package.py
@@ -49,7 +49,7 @@ class Git(Package):
depends_on("openssl")
- depends_on("autoconf")
+ depends_on("autoconf", type='build')
depends_on("curl")
depends_on("expat")
diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py
index 342a61a6a1..0a0a02f464 100644
--- a/var/spack/repos/builtin/packages/glib/package.py
+++ b/var/spack/repos/builtin/packages/glib/package.py
@@ -38,8 +38,8 @@ class Glib(Package):
depends_on("libffi")
depends_on("zlib")
- depends_on("pkg-config")
- depends_on('gettext', sys.platform == 'darwin')
+ depends_on("pkg-config", type='build')
+ depends_on('gettext', when=sys.platform == 'darwin')
# The following patch is needed for gcc-6.1
patch('g_date_strftime.patch')
diff --git a/var/spack/repos/builtin/packages/glm/package.py b/var/spack/repos/builtin/packages/glm/package.py
index 0c9212f17d..442c1cdf40 100644
--- a/var/spack/repos/builtin/packages/glm/package.py
+++ b/var/spack/repos/builtin/packages/glm/package.py
@@ -35,8 +35,8 @@ class Glm(Package):
url = "https://github.com/g-truc/glm/archive/0.9.7.1.tar.gz"
version('0.9.7.1', '61af6639cdf652d1cdd7117190afced8')
-
- depends_on ("cmake")
+
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
with working_dir('spack-build', create=True):
diff --git a/var/spack/repos/builtin/packages/global/package.py b/var/spack/repos/builtin/packages/global/package.py
index c144d6660b..f832834a28 100644
--- a/var/spack/repos/builtin/packages/global/package.py
+++ b/var/spack/repos/builtin/packages/global/package.py
@@ -34,7 +34,7 @@ class Global(Package):
version('6.5', 'dfec818b4f53d91721e247cf7b218078')
- depends_on('exuberant-ctags')
+ depends_on('exuberant-ctags', type=nolink)
depends_on('ncurses')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/gmp/package.py b/var/spack/repos/builtin/packages/gmp/package.py
index 3933788425..e2c2892f18 100644
--- a/var/spack/repos/builtin/packages/gmp/package.py
+++ b/var/spack/repos/builtin/packages/gmp/package.py
@@ -35,7 +35,7 @@ class Gmp(Package):
version('6.0.0a', 'b7ff2d88cae7f8085bd5006096eed470')
version('6.0.0' , '6ef5869ae735db9995619135bd856b84')
- depends_on("m4")
+ depends_on("m4", type='build')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py
index 0951b86d57..fe26cb3bf2 100644
--- a/var/spack/repos/builtin/packages/gmsh/package.py
+++ b/var/spack/repos/builtin/packages/gmsh/package.py
@@ -53,7 +53,7 @@ class Gmsh(Package):
depends_on('blas')
depends_on('lapack')
- depends_on('cmake@2.8:')
+ depends_on('cmake@2.8:', type='build')
depends_on('gmp')
depends_on('mpi', when='+mpi')
# Assumes OpenGL with GLU is already provided by the system:
diff --git a/var/spack/repos/builtin/packages/gnu-prolog/package.py b/var/spack/repos/builtin/packages/gnu-prolog/package.py
new file mode 100644
index 0000000000..f497ed3001
--- /dev/null
+++ b/var/spack/repos/builtin/packages/gnu-prolog/package.py
@@ -0,0 +1,41 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+class GnuProlog(Package):
+ """A free Prolog compiler with constraint solving over finite domains."""
+ homepage = "http://www.gprolog.org/"
+ url = "http://www.gprolog.org/gprolog-1.4.4.tar.gz"
+
+ version('1.4.4', '37009da471e5217ff637ad1c516448c8')
+
+ parallel = False
+
+ def install(self, spec, prefix):
+ with working_dir('src'):
+ configure('--with-install-dir=%s' % prefix,
+ '--without-links-dir')
+ make()
+ make('install')
diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py
index 13b83517d1..ff2c2f6781 100644
--- a/var/spack/repos/builtin/packages/go/package.py
+++ b/var/spack/repos/builtin/packages/go/package.py
@@ -24,7 +24,7 @@ class Go(Package):
# to-do, make non-c self-hosting compilers feasible without backflips
# should be a dep on external go compiler
- depends_on('go-bootstrap')
+ depends_on('go-bootstrap', type='build')
depends_on('git')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/googletest/package.py b/var/spack/repos/builtin/packages/googletest/package.py
index 9444253c8c..1dc74fbcf4 100644
--- a/var/spack/repos/builtin/packages/googletest/package.py
+++ b/var/spack/repos/builtin/packages/googletest/package.py
@@ -31,7 +31,7 @@ class Googletest(Package):
version('1.7.0', '5eaf03ed925a47b37c8e1d559eb19bc4')
- depends_on("cmake")
+ depends_on("cmake", type='build')
def install(self, spec, prefix):
which('cmake')('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/graphlib/package.py b/var/spack/repos/builtin/packages/graphlib/package.py
index f70f32cc8a..087a322acc 100644
--- a/var/spack/repos/builtin/packages/graphlib/package.py
+++ b/var/spack/repos/builtin/packages/graphlib/package.py
@@ -31,6 +31,8 @@ class Graphlib(Package):
version('2.0.0', '43c6df84f1d38ba5a5dce0ae19371a70')
+ depends_on('cmake', type='build')
+
def install(self, spec, prefix):
cmake(".", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py
index 2f99015ba2..e5898a6e59 100644
--- a/var/spack/repos/builtin/packages/graphviz/package.py
+++ b/var/spack/repos/builtin/packages/graphviz/package.py
@@ -44,7 +44,7 @@ class Graphviz(Package):
depends_on("swig")
depends_on("python")
depends_on("ghostscript")
- depends_on("pkg-config")
+ depends_on("pkg-config", type='build')
def install(self, spec, prefix):
options = ['--prefix=%s' % prefix]
diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py
index 1a50a42488..55eacc8d38 100644
--- a/var/spack/repos/builtin/packages/gromacs/package.py
+++ b/var/spack/repos/builtin/packages/gromacs/package.py
@@ -50,6 +50,7 @@ class Gromacs(Package):
depends_on('mpi', when='+mpi')
depends_on('fftw')
+ depends_on('cmake', type='build')
# TODO : add GPU support
diff --git a/var/spack/repos/builtin/packages/gts/package.py b/var/spack/repos/builtin/packages/gts/package.py
new file mode 100644
index 0000000000..2b3d4dd4f8
--- /dev/null
+++ b/var/spack/repos/builtin/packages/gts/package.py
@@ -0,0 +1,53 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Gts(Package):
+ """GTS stands for the GNU Triangulated Surface Library.
+
+ It is an Open Source Free Software Library intended to provide a set of
+ useful functions to deal with 3D surfaces meshed with interconnected
+ triangles. The source code is available free of charge under the Free
+ Software LGPL license.
+
+ The code is written entirely in C with an object-oriented approach
+ based mostly on the design of GTK+. Careful attention is paid to
+ performance related issues as the initial goal of GTS is to provide a
+ simple and efficient library to scientists dealing with 3D computational
+ surface meshes.
+ """
+
+ homepage = "http://gts.sourceforge.net/index.html"
+ url = "http://gts.sourceforge.net/tarballs/gts-snapshot-121130.tar.gz"
+
+ version('121130', '023ebb6b13b8707534182a3ef0d12908')
+
+ depends_on('glib')
+
+ def install(self, spec, prefix):
+ configure('--prefix={0}'.format(prefix))
+ make()
+ make('install')
diff --git a/var/spack/repos/builtin/packages/hdf5-blosc/package.py b/var/spack/repos/builtin/packages/hdf5-blosc/package.py
index 50f380083c..28b65711b0 100644
--- a/var/spack/repos/builtin/packages/hdf5-blosc/package.py
+++ b/var/spack/repos/builtin/packages/hdf5-blosc/package.py
@@ -53,7 +53,7 @@ class Hdf5Blosc(Package):
depends_on("c-blosc")
depends_on("hdf5")
- depends_on("libtool")
+ depends_on("libtool", type='build')
parallel = False
diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py
index 51a5823aa5..d169940c86 100644
--- a/var/spack/repos/builtin/packages/hdf5/package.py
+++ b/var/spack/repos/builtin/packages/hdf5/package.py
@@ -40,7 +40,7 @@ class Hdf5(Package):
version('1.10.0-patch1', '9180ff0ef8dc2ef3f61bd37a7404f295')
version('1.10.0', 'bdc935337ee8282579cd6bc4270ad199')
- version('1.8.16', 'b8ed9a36ae142317f88b0c7ef4b9c618', preferred=True)
+ version('1.8.16', 'b8ed9a36ae142317f88b0c7ef4b9c618')
version('1.8.15', '03cccb5b33dbe975fdcd8ae9dc021f24')
version('1.8.13', 'c03426e9e77d7766944654280b467289')
diff --git a/var/spack/repos/builtin/packages/hmmer/package.py b/var/spack/repos/builtin/packages/hmmer/package.py
new file mode 100644
index 0000000000..6a236e9fc9
--- /dev/null
+++ b/var/spack/repos/builtin/packages/hmmer/package.py
@@ -0,0 +1,76 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Hmmer(Package):
+ """HMMER is used for searching sequence databases for sequence homologs,
+ and for making sequence alignments. It implements methods using
+ probabilistic models called profile hidden Markov models (profile HMMs).
+ """
+ homepage = 'http://www.hmmer.org'
+ url = 'http://eddylab.org/software/hmmer3/3.1b2/hmmer-3.1b2.tar.gz'
+
+ version('3.1b2', 'c8c141018bc0ccd7fc37b33f2b945d5f')
+ version('3.0', '4cf685f3bc524ba5b5cdaaa070a83588')
+ version('2.4i', 'dab234c87e026ac1de942450750acd20')
+ version('2.3.2', '5f073340c0cf761288f961a73821228a')
+ version('2.3.1', 'c724413e5761c630892506698a4716e2')
+
+ variant('mpi', default=True, description='Compile with MPI')
+ variant('gsl', default=False, description='Compile with GSL')
+
+ depends_on('mpi', when='+mpi')
+ depends_on('gsl', when='+gsl')
+
+ def url_for_version(self, version):
+ base_url = 'http://eddylab.org/software'
+
+ if version >= Version('3.0'):
+ return '{0}/hmmer3/{1}/hmmer-{1}.tar.gz'.format(base_url, version)
+ else:
+ return '{0}/hmmer/{1}/hmmer-{1}.tar.gz'.format(base_url, version)
+
+ def install(self, spec, prefix):
+ configure_args = [
+ '--prefix={0}'.format(prefix)
+ ]
+
+ if '+gsl' in self.spec:
+ configure_args.extend([
+ '--with-gsl',
+ 'LIBS=-lgsl -lgslcblas'
+ ])
+
+ if '+mpi' in self.spec:
+ configure_args.append('--enable-mpi')
+
+ configure(*configure_args)
+ make()
+
+ if self.run_tests:
+ make('check')
+
+ make('install')
diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py
index 90d5107e3b..060cd0b713 100644
--- a/var/spack/repos/builtin/packages/hoomd-blue/package.py
+++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py
@@ -45,12 +45,12 @@ class HoomdBlue(Package):
variant('doc', default=True, description='Generate documentation')
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
depends_on('boost+python')
- depends_on('cmake')
+ depends_on('cmake', type='build')
depends_on('mpi', when='+mpi')
depends_on('cuda', when='+cuda')
- depends_on('doxygen', when='+doc')
+ depends_on('doxygen', when='+doc', type='build')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py
index f87dae9f4e..65fef57559 100644
--- a/var/spack/repos/builtin/packages/hypre/package.py
+++ b/var/spack/repos/builtin/packages/hypre/package.py
@@ -23,7 +23,9 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
-import os, sys
+import os
+import sys
+
class Hypre(Package):
"""Hypre is a library of high performance preconditioners that
@@ -37,7 +39,7 @@ class Hypre(Package):
version('2.10.0b', '768be38793a35bb5d055905b271f5b8e')
# hypre does not know how to build shared libraries on Darwin
- variant('shared', default=sys.platform!='darwin', description="Build shared library version (disables static library)")
+ variant('shared', default=(sys.platform != 'darwin'), description="Build shared library version (disables static library)")
# SuperluDist have conflicting headers with those in Hypre
variant('internal-superlu', default=True, description="Use internal Superlu routines")
@@ -46,21 +48,26 @@ class Hypre(Package):
depends_on("lapack")
def install(self, spec, prefix):
- blas_dir = spec['blas'].prefix
- lapack_dir = spec['lapack'].prefix
- mpi_dir = spec['mpi'].prefix
-
- os.environ['CC'] = os.path.join(mpi_dir, 'bin', 'mpicc')
- os.environ['CXX'] = os.path.join(mpi_dir, 'bin', 'mpicxx')
- os.environ['F77'] = os.path.join(mpi_dir, 'bin', 'mpif77')
-
+ os.environ['CC'] = spec['mpi'].mpicc
+ os.environ['CXX'] = spec['mpi'].mpicxx
+ os.environ['F77'] = spec['mpi'].mpif77
+ # Since +shared does not build on macOS and also Atlas does not have
+ # a single static lib to build against, link against shared libs with
+ # a hope that --whole-archive linker option (or alike) was used
+ # to command the linker to include whole static libs' content into the
+ # shared lib
+ # Note: --with-(lapack|blas)_libs= needs space separated list of names
configure_args = [
- "--prefix=%s" % prefix,
- "--with-lapack-libs=lapack",
- "--with-lapack-lib-dirs=%s/lib" % lapack_dir,
- "--with-blas-libs=blas",
- "--with-blas-lib-dirs=%s/lib" % blas_dir]
+ '--prefix=%s' % prefix,
+ '--with-lapack-libs=%s' % to_lib_name(
+ spec['lapack'].lapack_shared_lib),
+ '--with-lapack-lib-dirs=%s/lib' % spec['lapack'].prefix,
+ '--with-blas-libs=%s' % to_lib_name(
+ spec['blas'].blas_shared_lib),
+ '--with-blas-lib-dirs=%s/lib' % spec['blas'].prefix
+ ]
+
if '+shared' in self.spec:
configure_args.append("--enable-shared")
@@ -76,4 +83,12 @@ class Hypre(Package):
configure(*configure_args)
make()
+ if self.run_tests:
+ make("check")
+ make("test")
+ Executable(join_path('test', 'ij'))()
+ sstruct = Executable(join_path('test', 'struct'))
+ sstruct()
+ sstruct('-in', 'test/sstruct.in.default', '-solver', '40',
+ '-rhsone')
make("install")
diff --git a/var/spack/repos/builtin/packages/ibmisc/package.py b/var/spack/repos/builtin/packages/ibmisc/package.py
index 8e6cf429a7..ed1e6c6cbf 100644
--- a/var/spack/repos/builtin/packages/ibmisc/package.py
+++ b/var/spack/repos/builtin/packages/ibmisc/package.py
@@ -26,13 +26,13 @@ class Ibmisc(CMakePackage):
depends_on('netcdf-cxx4', when='+netcdf')
depends_on('udunits2', when='+udunits2')
depends_on('googletest', when='+googletest')
- depends_on('py-cython', when='+python')
- depends_on('py-numpy', when='+python')
+ depends_on('py-cython', when='+python', type=nolink)
+ depends_on('py-numpy', when='+python', type=nolink)
depends_on('boost', when='+boost')
# Build dependencies
- depends_on('cmake')
- depends_on('doxygen')
+ depends_on('cmake', type='build')
+ depends_on('doxygen', type='build')
def configure_args(self):
spec = self.spec
diff --git a/var/spack/repos/builtin/packages/ilmbase/package.py b/var/spack/repos/builtin/packages/ilmbase/package.py
new file mode 100644
index 0000000000..873c830623
--- /dev/null
+++ b/var/spack/repos/builtin/packages/ilmbase/package.py
@@ -0,0 +1,42 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Ilmbase(Package):
+ """OpenEXR ILM Base libraries (high dynamic-range image file format)"""
+
+ homepage = "http://www.openexr.com/"
+ url = "http://download.savannah.nongnu.org/releases/openexr/ilmbase-2.2.0.tar.gz"
+
+ version('2.2.0', 'b540db502c5fa42078249f43d18a4652')
+ version('2.1.0', 'af1115f4d759c574ce84efcde9845d29')
+ version('2.0.1', '74c0d0d2873960bd0dc1993f8e03f0ae')
+ version('1.0.2', '26c133ee8ca48e1196fbfb3ffe292ab4')
+ version('0.9.0', '4df45f8116cb7a013b286caf6da30a2e')
+
+ def install(self, spec, prefix):
+ configure('--prefix={0}'.format(prefix))
+ make('install')
diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py
index 47c5ca0c09..3bd21df89e 100644
--- a/var/spack/repos/builtin/packages/ipopt/package.py
+++ b/var/spack/repos/builtin/packages/ipopt/package.py
@@ -38,7 +38,7 @@ class Ipopt(Package):
depends_on("blas")
depends_on("lapack")
- depends_on("pkg-config")
+ depends_on("pkg-config", type='build')
depends_on("mumps+double~mpi")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/jasper/fix_alpha_channel_assert_fail.patch b/var/spack/repos/builtin/packages/jasper/fix_alpha_channel_assert_fail.patch
new file mode 100644
index 0000000000..cbf79ff971
--- /dev/null
+++ b/var/spack/repos/builtin/packages/jasper/fix_alpha_channel_assert_fail.patch
@@ -0,0 +1,25 @@
+diff --git a/src/libjasper/jpc/jpc_dec.c b/src/libjasper/jpc/jpc_dec.c
+index fa72a0e..1f4845f 100644
+--- a/src/libjasper/jpc/jpc_dec.c
++++ b/src/libjasper/jpc/jpc_dec.c
+@@ -1069,12 +1069,18 @@ static int jpc_dec_tiledecode(jpc_dec_t *dec, jpc_dec_tile_t *tile)
+ /* Apply an inverse intercomponent transform if necessary. */
+ switch (tile->cp->mctid) {
+ case JPC_MCT_RCT:
+- assert(dec->numcomps == 3);
++ if (dec->numcomps != 3 && dec->numcomps != 4) {
++ jas_eprintf("bad number of components (%d)\n", dec->numcomps);
++ return -1;
++ }
+ jpc_irct(tile->tcomps[0].data, tile->tcomps[1].data,
+ tile->tcomps[2].data);
+ break;
+ case JPC_MCT_ICT:
+- assert(dec->numcomps == 3);
++ if (dec->numcomps != 3 && dec->numcomps != 4) {
++ jas_eprintf("bad number of components (%d)\n", dec->numcomps);
++ return -1;
++ }
+ jpc_iict(tile->tcomps[0].data, tile->tcomps[1].data,
+ tile->tcomps[2].data);
+ break;
diff --git a/var/spack/repos/builtin/packages/jasper/package.py b/var/spack/repos/builtin/packages/jasper/package.py
new file mode 100644
index 0000000000..f450c7d155
--- /dev/null
+++ b/var/spack/repos/builtin/packages/jasper/package.py
@@ -0,0 +1,63 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Jasper(Package):
+ """Library for manipulating JPEG-2000 images"""
+
+ homepage = "https://www.ece.uvic.ca/~frodo/jasper/"
+ url = "https://www.ece.uvic.ca/~frodo/jasper/software/jasper-1.900.1.zip"
+
+ version('1.900.1', 'a342b2b4495b3e1394e161eb5d85d754')
+
+ variant('shared', default=True,
+ description='Builds shared versions of the libraries')
+ variant('debug', default=False,
+ description='Builds debug versions of the libraries')
+
+ depends_on('libjpeg-turbo')
+
+ # Fixes a bug (still in upstream as of v.1.900.1) where an assertion fails
+ # when certain JPEG-2000 files with an alpha channel are processed
+ # see: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=469786
+ patch('fix_alpha_channel_assert_fail.patch')
+
+ def install(self, spec, prefix):
+ configure_options = [
+ '--prefix={0}'.format(prefix),
+ '--mandir={0}'.format(spec.prefix.man),
+ ]
+
+ if '+shared' in spec:
+ configure_options.append('--enable-shared')
+
+ if '+debug' not in spec:
+ configure_options.append('--disable-debug')
+
+ configure(*configure_options)
+
+ make()
+ make('install')
diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py
index 99d138dcff..536ce69236 100644
--- a/var/spack/repos/builtin/packages/julia/package.py
+++ b/var/spack/repos/builtin/packages/julia/package.py
@@ -44,16 +44,16 @@ class Julia(Package):
patch('openblas.patch', when='@0.4:0.4.5')
# Build-time dependencies:
- # depends_on("awk")
- # depends_on("m4")
- # depends_on("pkg-config")
+ # depends_on("awk", type='build')
+ # depends_on("m4", type='build')
+ # depends_on("pkg-config", type='build')
# Combined build-time and run-time dependencies:
- depends_on("binutils")
- depends_on("cmake @2.8:")
- depends_on("git")
- depends_on("openssl")
- depends_on("python @2.7:2.999")
+ depends_on("binutils", type=nolink)
+ depends_on("cmake @2.8:", type=nolink)
+ depends_on("git", type=nolink)
+ depends_on("openssl", type=nolink)
+ depends_on("python @2.7:2.999", type=nolink)
# I think that Julia requires the dependencies above, but it
# builds fine (on my system) without these. We should enable them
@@ -93,8 +93,8 @@ class Julia(Package):
# USE_SYSTEM_LIBGIT2=0
# Run-time dependencies for Julia packages:
- depends_on("hdf5")
- depends_on("mpi")
+ depends_on("hdf5", type='run')
+ depends_on("mpi", type='run')
def install(self, spec, prefix):
# Explicitly setting CC, CXX, or FC breaks building libuv, one
diff --git a/var/spack/repos/builtin/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py
index f256810005..8aa6d72727 100644
--- a/var/spack/repos/builtin/packages/launchmon/package.py
+++ b/var/spack/repos/builtin/packages/launchmon/package.py
@@ -33,9 +33,9 @@ class Launchmon(Package):
version('1.0.2', '8d6ba77a0ec2eff2fde2c5cc8fa7ff7a')
- depends_on('autoconf')
- depends_on('automake')
- depends_on('libtool')
+ depends_on('autoconf', type='build')
+ depends_on('automake', type='build')
+ depends_on('libtool', type='build')
def install(self, spec, prefix):
configure(
diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py
index 5e4e420842..938f4f6f3b 100644
--- a/var/spack/repos/builtin/packages/libgd/package.py
+++ b/var/spack/repos/builtin/packages/libgd/package.py
@@ -40,6 +40,7 @@ class Libgd(Package):
version('2.1.1', 'e91a1a99903e460e7ba00a794e72cc1e')
depends_on('libpng')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
index 8615b2ed83..d1239ba0d9 100644
--- a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
+++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py
@@ -35,8 +35,8 @@ class LibjpegTurbo(Package):
version('1.3.1', '2c3a68129dac443a72815ff5bb374b05')
# Can use either of these.
- depends_on("yasm")
- depends_on("nasm")
+ depends_on("yasm", type='build')
+ depends_on("nasm", type='build')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/libtool/package.py b/var/spack/repos/builtin/packages/libtool/package.py
index 0e410a5061..a0070d72d0 100644
--- a/var/spack/repos/builtin/packages/libtool/package.py
+++ b/var/spack/repos/builtin/packages/libtool/package.py
@@ -35,7 +35,7 @@ class Libtool(Package):
version('2.4.6', 'addf44b646ddb4e3919805aa88fa7c5e')
version('2.4.2', 'd2f3b7d4627e69e13514a40e72a24d50')
- depends_on('m4')
+ depends_on('m4', type='build')
def _make_executable(self, name):
return Executable(join_path(self.prefix.bin, name))
diff --git a/var/spack/repos/builtin/packages/libuv/package.py b/var/spack/repos/builtin/packages/libuv/package.py
index 63565c7aea..0d29270b38 100644
--- a/var/spack/repos/builtin/packages/libuv/package.py
+++ b/var/spack/repos/builtin/packages/libuv/package.py
@@ -31,9 +31,9 @@ class Libuv(Package):
version('1.9.0', '14737f9c76123a19a290dabb7d1cd04c')
- depends_on('automake')
- depends_on('autoconf')
- depends_on('libtool')
+ depends_on('automake', type='build')
+ depends_on('autoconf', type='build')
+ depends_on('libtool', type='build')
def install(self, spec, prefix):
bash = which("bash")
diff --git a/var/spack/repos/builtin/packages/libxcb/package.py b/var/spack/repos/builtin/packages/libxcb/package.py
index 746d4567e2..586eb970d8 100644
--- a/var/spack/repos/builtin/packages/libxcb/package.py
+++ b/var/spack/repos/builtin/packages/libxcb/package.py
@@ -36,9 +36,9 @@ class Libxcb(Package):
version('1.11', '1698dd837d7e6e94d029dbe8b3a82deb')
version('1.11.1', '118623c15a96b08622603a71d8789bf3')
- depends_on("python")
+ depends_on("python", type='build')
depends_on("xcb-proto")
- depends_on("pkg-config")
+ depends_on("pkg-config", type='build')
depends_on("libpthread-stubs")
depends_on('libxau')
diff --git a/var/spack/repos/builtin/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py
index 073c2d1b9e..127fe1204d 100644
--- a/var/spack/repos/builtin/packages/llvm-lld/package.py
+++ b/var/spack/repos/builtin/packages/llvm-lld/package.py
@@ -34,6 +34,8 @@ class LlvmLld(Package):
version('3.4', '3b6a17e58c8416c869c14dd37682f78e')
+ depends_on('cmake', type='build')
+
def install(self, spec, prefix):
env['CXXFLAGS'] = self.compier.cxx11_flag
diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py
index 7a6ea7401c..e79c123a7e 100644
--- a/var/spack/repos/builtin/packages/llvm/package.py
+++ b/var/spack/repos/builtin/packages/llvm/package.py
@@ -51,7 +51,7 @@ class Llvm(Package):
variant('all_targets', default=True, description="Build all supported targets, default targets <current arch>,NVPTX,AMDGPU,CppBackend")
# Build dependency
- depends_on('cmake @2.8.12.2:')
+ depends_on('cmake@2.8.12.2:', type='build')
# Universal dependency
depends_on('python@2.7:2.8') # Seems not to support python 3.X.Y
diff --git a/var/spack/repos/builtin/packages/lmod/package.py b/var/spack/repos/builtin/packages/lmod/package.py
index 7d75866d52..efa235f646 100644
--- a/var/spack/repos/builtin/packages/lmod/package.py
+++ b/var/spack/repos/builtin/packages/lmod/package.py
@@ -42,8 +42,8 @@ class Lmod(Package):
version('6.0.1', '91abf52fe5033bd419ffe2842ebe7af9')
depends_on('lua@5.2:')
- depends_on('lua-luaposix')
- depends_on('lua-luafilesystem')
+ depends_on('lua-luaposix', type=nolink)
+ depends_on('lua-luafilesystem', type=nolink)
parallel = False
diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py
index 48c1c6a919..ca0a481a83 100644
--- a/var/spack/repos/builtin/packages/lua/package.py
+++ b/var/spack/repos/builtin/packages/lua/package.py
@@ -86,7 +86,7 @@ class Lua(Package):
def setup_dependent_environment(self, spack_env, run_env, extension_spec):
lua_paths = []
- for d in extension_spec.traverse():
+ for d in extension_spec.traverse(deptypes=nolink, deptype_query='run'):
if d.package.extends(self.spec):
lua_paths.append(os.path.join(d.prefix, self.lua_lib_dir))
lua_paths.append(os.path.join(d.prefix, self.lua_share_dir))
diff --git a/var/spack/repos/builtin/packages/mbedtls/package.py b/var/spack/repos/builtin/packages/mbedtls/package.py
index ae34d25691..13c0ce768f 100644
--- a/var/spack/repos/builtin/packages/mbedtls/package.py
+++ b/var/spack/repos/builtin/packages/mbedtls/package.py
@@ -37,7 +37,7 @@ class Mbedtls(Package):
version('2.1.3' , '7eb4cf1dfa68578a2c8dbd0b6fa752dd')
version('1.3.16', '4144d7320c691f721aeb9e67a1bc38e0')
- depends_on('cmake')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/memaxes/package.py b/var/spack/repos/builtin/packages/memaxes/package.py
index 135384e2f7..31672abaec 100644
--- a/var/spack/repos/builtin/packages/memaxes/package.py
+++ b/var/spack/repos/builtin/packages/memaxes/package.py
@@ -32,7 +32,7 @@ class Memaxes(Package):
version('0.5', '5874f3fda9fd2d313c0ff9684f915ab5',
url='https://github.com/llnl/MemAxes/archive/v0.5.tar.gz')
- depends_on("cmake@2.8.9:")
+ depends_on('cmake@2.8.9:', type='build')
depends_on("qt@5:")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py
index bd9c9eec4a..3bad17b5cb 100644
--- a/var/spack/repos/builtin/packages/mesa/package.py
+++ b/var/spack/repos/builtin/packages/mesa/package.py
@@ -44,8 +44,8 @@ class Mesa(Package):
# mesa 10.x
# depends_on("py-mako")
- # depends_on("flex")
- # depends_on("bison")
+ # depends_on("flex", type='build')
+ # depends_on("bison", type='build')
# depends_on("dri2proto")
# depends_on("libxcb")
# depends_on("libxshmfence")
diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py
index c4f2afaff2..2180f2cce2 100644
--- a/var/spack/repos/builtin/packages/metis/package.py
+++ b/var/spack/repos/builtin/packages/metis/package.py
@@ -50,7 +50,7 @@ class Metis(Package):
variant('idx64', default=False, description='Use int64_t as default index type')
variant('real64', default=False, description='Use double precision floating point types')
- depends_on('cmake@2.8:', when='@5:') # build-time dependency
+ depends_on('cmake@2.8:', when='@5:', type='build')
patch('install_gklib_defs_rename.patch', when='@5:')
diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py
index 1b4456380b..e7a1d96388 100644
--- a/var/spack/repos/builtin/packages/mfem/package.py
+++ b/var/spack/repos/builtin/packages/mfem/package.py
@@ -62,7 +62,7 @@ class Mfem(Package):
depends_on('blas', when='+suite-sparse')
depends_on('lapack', when='+suite-sparse')
depends_on('metis@5:', when='+suite-sparse ^suite-sparse@4.5:')
- depends_on('cmake', when='^metis@5:')
+ depends_on('cmake', when='^metis@5:', type='build')
def check_variants(self, spec):
if '+mpi' in spec and ('+hypre' not in spec or '+metis' not in spec):
diff --git a/var/spack/repos/builtin/packages/mkl/package.py b/var/spack/repos/builtin/packages/mkl/package.py
index 454e78d29c..6ea64f5313 100644
--- a/var/spack/repos/builtin/packages/mkl/package.py
+++ b/var/spack/repos/builtin/packages/mkl/package.py
@@ -9,7 +9,13 @@ class Mkl(IntelInstaller):
Note: You will have to add the download file to a
mirror so that Spack can find it. For instructions on how to set up a
- mirror, see http://software.llnl.gov/spack/mirrors.html"""
+ mirror, see http://software.llnl.gov/spack/mirrors.html.
+
+ To set the threading layer at run time set MKL_THREADING_LAYER
+ variable to one of the following values: INTEL, SEQUENTIAL, PGI.
+ To set interface layer at run time, use set the MKL_INTERFACE_LAYER
+ variable to LP64 or ILP64.
+ """
homepage = "https://software.intel.com/en-us/intel-mkl"
@@ -18,6 +24,11 @@ class Mkl(IntelInstaller):
version('11.3.3.210', 'f72546df27f5ebb0941b5d21fd804e34',
url="file://%s/l_mkl_11.3.3.210.tgz" % os.getcwd())
+ # virtual dependency
+ provides('blas')
+ provides('lapack')
+ # TODO: MKL also provides implementation of Scalapack.
+
def install(self, spec, prefix):
self.intel_prefix = os.path.join(prefix, "pkg")
@@ -26,3 +37,28 @@ class Mkl(IntelInstaller):
mkl_dir = os.path.join(self.intel_prefix, "mkl")
for f in os.listdir(mkl_dir):
os.symlink(os.path.join(mkl_dir, f), os.path.join(self.prefix, f))
+
+ def setup_dependent_package(self, module, dspec):
+ # For now use Single Dynamic Library:
+ # To set the threading layer at run time, use the
+ # mkl_set_threading_layer function or set MKL_THREADING_LAYER
+ # variable to one of the following values: INTEL, SEQUENTIAL, PGI.
+ # To set interface layer at run time, use the mkl_set_interface_layer
+ # function or set the MKL_INTERFACE_LAYER variable to LP64 or ILP64.
+
+ # Otherwise one would need to specify several libraries
+ # (e.g. mkl_intel_lp64;mkl_sequential;mkl_core), which reflect
+ # different interface and threading layers.
+
+ name = 'libmkl_rt.%s' % dso_suffix
+ libdir = find_library_path(name, self.prefix.lib64, self.prefix.lib)
+
+ self.spec.blas_shared_lib = join_path(libdir, name)
+ self.spec.lapack_shared_lib = self.spec.blas_shared_lib
+
+ def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
+ # set up MKLROOT for everyone using MKL package
+ spack_env.set('MKLROOT', self.prefix)
+
+ def setup_environment(self, spack_env, env):
+ env.set('MKLROOT', self.prefix)
diff --git a/var/spack/repos/builtin/packages/mpibash/package.py b/var/spack/repos/builtin/packages/mpibash/package.py
index b328b98ecf..e659663d90 100644
--- a/var/spack/repos/builtin/packages/mpibash/package.py
+++ b/var/spack/repos/builtin/packages/mpibash/package.py
@@ -36,7 +36,7 @@ class Mpibash(Package):
patch('mpibash-4.3.patch', level=1, when='@4.3')
# above patch modifies configure.ac
- depends_on('autoconf')
+ depends_on('autoconf', type='build')
# uses MPI_Exscan which is in MPI-1.2 and later
depends_on('mpi@1.2:')
diff --git a/var/spack/repos/builtin/packages/msgpack-c/package.py b/var/spack/repos/builtin/packages/msgpack-c/package.py
index 925dceabed..d42ac255d0 100644
--- a/var/spack/repos/builtin/packages/msgpack-c/package.py
+++ b/var/spack/repos/builtin/packages/msgpack-c/package.py
@@ -31,6 +31,8 @@ class MsgpackC(Package):
version('1.4.1', 'e2fd3a7419b9bc49e5017fdbefab87e0')
+ depends_on('cmake', type='build')
+
def install(self, spec, prefix):
cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/mumps/package.py b/var/spack/repos/builtin/packages/mumps/package.py
index 92c45c9b95..b85a6d2b94 100644
--- a/var/spack/repos/builtin/packages/mumps/package.py
+++ b/var/spack/repos/builtin/packages/mumps/package.py
@@ -23,7 +23,10 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
-import os, sys, glob
+import os
+import sys
+import glob
+
class Mumps(Package):
"""MUMPS: a MUltifrontal Massively Parallel sparse direct Solver"""
@@ -44,13 +47,11 @@ class Mumps(Package):
variant('idx64', default=False, description='Use int64_t/integer*8 as default index type')
variant('shared', default=True, description='Build shared libraries')
-
depends_on('scotch + esmumps', when='~ptscotch+scotch')
depends_on('scotch + esmumps + mpi', when='+ptscotch')
depends_on('metis@5:', when='+metis')
depends_on('parmetis', when="+parmetis")
depends_on('blas')
- depends_on('lapack')
depends_on('scalapack', when='+mpi')
depends_on('mpi', when='+mpi')
@@ -60,42 +61,52 @@ class Mumps(Package):
# end before install
# def patch(self):
def write_makefile_inc(self):
- if ('+parmetis' in self.spec or '+ptscotch' in self.spec) and '+mpi' not in self.spec:
- raise RuntimeError('You cannot use the variants parmetis or ptscotch without mpi')
+ if ('+parmetis' in self.spec or '+ptscotch' in self.spec) and '+mpi' not in self.spec: # NOQA: ignore=E501
+ raise RuntimeError('You cannot use the variants parmetis or ptscotch without mpi') # NOQA: ignore=E501
- makefile_conf = ["LIBBLAS = -L%s -lblas" % self.spec['blas'].prefix.lib]
+ makefile_conf = ["LIBBLAS = %s" % to_link_flags(
+ self.spec['blas'].blas_shared_lib)
+ ]
orderings = ['-Dpord']
if '+ptscotch' in self.spec or '+scotch' in self.spec:
join_lib = ' -l%s' % ('pt' if '+ptscotch' in self.spec else '')
- makefile_conf.extend(
- ["ISCOTCH = -I%s" % self.spec['scotch'].prefix.include,
- "LSCOTCH = -L%s %s%s" % (self.spec['scotch'].prefix.lib,
- join_lib,
- join_lib.join(['esmumps', 'scotch', 'scotcherr']))])
+ makefile_conf.extend([
+ "ISCOTCH = -I%s" % self.spec['scotch'].prefix.include,
+ "LSCOTCH = -L%s %s%s" % (self.spec['scotch'].prefix.lib,
+ join_lib,
+ join_lib.join(['esmumps',
+ 'scotch',
+ 'scotcherr']))
+ ])
+
orderings.append('-Dscotch')
if '+ptscotch' in self.spec:
orderings.append('-Dptscotch')
if '+parmetis' in self.spec and '+metis' in self.spec:
- libname = 'parmetis' if '+parmetis' in self.spec else 'metis'
- makefile_conf.extend(
- ["IMETIS = -I%s" % self.spec['parmetis'].prefix.include,
- "LMETIS = -L%s -l%s -L%s -l%s" % (self.spec['parmetis'].prefix.lib, 'parmetis',self.spec['metis'].prefix.lib, 'metis')])
+ makefile_conf.extend([
+ "IMETIS = -I%s" % self.spec['parmetis'].prefix.include,
+ "LMETIS = -L%s -l%s -L%s -l%s" % (
+ self.spec['parmetis'].prefix.lib, 'parmetis',
+ self.spec['metis'].prefix.lib, 'metis')
+ ])
orderings.append('-Dparmetis')
elif '+metis' in self.spec:
- makefile_conf.extend(
- ["IMETIS = -I%s" % self.spec['metis'].prefix.include,
- "LMETIS = -L%s -l%s" % (self.spec['metis'].prefix.lib, 'metis')])
+ makefile_conf.extend([
+ "IMETIS = -I%s" % self.spec['metis'].prefix.include,
+ "LMETIS = -L%s -l%s" % (self.spec['metis'].prefix.lib, 'metis')
+ ])
orderings.append('-Dmetis')
makefile_conf.append("ORDERINGSF = %s" % (' '.join(orderings)))
# when building shared libs need -fPIC, otherwise
- # /usr/bin/ld: graph.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
+ # /usr/bin/ld: graph.o: relocation R_X86_64_32 against `.rodata.str1.1'
+ # can not be used when making a shared object; recompile with -fPIC
fpic = '-fPIC' if '+shared' in self.spec else ''
# TODO: test this part, it needs a full blas, scalapack and
# partitionning environment with 64bit integers
@@ -104,7 +115,7 @@ class Mumps(Package):
# the fortran compilation flags most probably are
# working only for intel and gnu compilers this is
# perhaps something the compiler should provide
- ['OPTF = %s -O -DALLOW_NON_INIT %s' % (fpic,'-fdefault-integer-8' if self.compiler.name == "gcc" else '-i8'),
+ ['OPTF = %s -O -DALLOW_NON_INIT %s' % (fpic, '-fdefault-integer-8' if self.compiler.name == "gcc" else '-i8'), # NOQA: ignore=E501
'OPTL = %s -O ' % fpic,
'OPTC = %s -O -DINTSIZE64' % fpic])
else:
@@ -113,7 +124,6 @@ class Mumps(Package):
'OPTL = %s -O ' % fpic,
'OPTC = %s -O ' % fpic])
-
if '+mpi' in self.spec:
makefile_conf.extend(
["CC = %s" % join_path(self.spec['mpi'].prefix.bin, 'mpicc'),
@@ -134,16 +144,17 @@ class Mumps(Package):
if '+shared' in self.spec:
if sys.platform == 'darwin':
- # Building dylibs with mpif90 causes segfaults on 10.8 and 10.10. Use gfortran. (Homebrew)
+ # Building dylibs with mpif90 causes segfaults on 10.8 and
+ # 10.10. Use gfortran. (Homebrew)
makefile_conf.extend([
'LIBEXT=.dylib',
- 'AR=%s -dynamiclib -Wl,-install_name -Wl,%s/$(notdir $@) -undefined dynamic_lookup -o ' % (os.environ['FC'],prefix.lib),
+ 'AR=%s -dynamiclib -Wl,-install_name -Wl,%s/$(notdir $@) -undefined dynamic_lookup -o ' % (os.environ['FC'], prefix.lib), # NOQA: ignore=E501
'RANLIB=echo'
])
else:
makefile_conf.extend([
'LIBEXT=.so',
- 'AR=$(FL) -shared -Wl,-soname -Wl,%s/$(notdir $@) -o' % prefix.lib,
+ 'AR=$(FL) -shared -Wl,-soname -Wl,%s/$(notdir $@) -o' % prefix.lib, # NOQA: ignore=E501
'RANLIB=echo'
])
else:
@@ -153,9 +164,8 @@ class Mumps(Package):
'RANLIB = ranlib'
])
-
- makefile_inc_template = join_path(os.path.dirname(self.module.__file__),
- 'Makefile.inc')
+ makefile_inc_template = join_path(
+ os.path.dirname(self.module.__file__), 'Makefile.inc')
with open(makefile_inc_template, "r") as fh:
makefile_conf.extend(fh.read().split('\n'))
@@ -164,8 +174,6 @@ class Mumps(Package):
makefile_inc = '\n'.join(makefile_conf)
fh.write(makefile_inc)
-
-
def install(self, spec, prefix):
make_libs = []
@@ -189,15 +197,15 @@ class Mumps(Package):
install_tree('lib', prefix.lib)
install_tree('include', prefix.include)
- if '~mpi' in spec:
+ if '~mpi' in spec:
lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
lib_suffix = lib_dsuffix if '+shared' in spec else '.a'
install('libseq/libmpiseq%s' % lib_suffix, prefix.lib)
- for f in glob.glob(join_path('libseq','*.h')):
+ for f in glob.glob(join_path('libseq', '*.h')):
install(f, prefix.include)
- # FIXME: extend the tests to mpirun -np 2 (or alike) when build with MPI
- # FIXME: use something like numdiff to compare blessed output with the current
+ # FIXME: extend the tests to mpirun -np 2 when build with MPI
+ # FIXME: use something like numdiff to compare output files
with working_dir('examples'):
if '+float' in spec:
os.system('./ssimpletest < input_simpletest_real')
diff --git a/var/spack/repos/builtin/packages/muster/package.py b/var/spack/repos/builtin/packages/muster/package.py
index 993f147245..64b7324415 100644
--- a/var/spack/repos/builtin/packages/muster/package.py
+++ b/var/spack/repos/builtin/packages/muster/package.py
@@ -39,6 +39,7 @@ class Muster(Package):
depends_on("boost")
depends_on("mpi")
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake(".", *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py
index f8af76429b..0fb181a7b2 100644
--- a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py
+++ b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py
@@ -34,7 +34,7 @@ class NetcdfCxx4(Package):
version('4.2.1', 'd019853802092cf686254aaba165fc81')
depends_on('netcdf')
- depends_on("autoconf")
+ depends_on("autoconf", type='build')
def install(self, spec, prefix):
# Rebuild to prevent problems of inconsistency in git repo
diff --git a/var/spack/repos/builtin/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py
index c2256d5e9f..ad4ee59640 100644
--- a/var/spack/repos/builtin/packages/netcdf/package.py
+++ b/var/spack/repos/builtin/packages/netcdf/package.py
@@ -33,13 +33,14 @@ class Netcdf(Package):
homepage = "http://www.unidata.ucar.edu/software/netcdf"
url = "ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.3.3.tar.gz"
+ version('4.4.1', '7843e35b661c99e1d49e60791d5072d8')
version('4.4.0', 'cffda0cbd97fdb3a06e9274f7aef438e')
version('4.3.3', '5fbd0e108a54bd82cb5702a73f56d2ae')
variant('mpi', default=True, description='Enables MPI parallelism')
variant('hdf4', default=False, description='Enable HDF4 support')
- depends_on("m4")
+ depends_on("m4", type='build')
depends_on("hdf", when='+hdf4')
# Required for DAP support
@@ -47,8 +48,10 @@ class Netcdf(Package):
# Required for NetCDF-4 support
depends_on("zlib")
- depends_on("hdf5+mpi", when='+mpi')
- depends_on("hdf5~mpi", when='~mpi')
+ depends_on('hdf5@:1.8+mpi', when='@:4.4.0+mpi')
+ depends_on('hdf5+mpi', when='@4.4.1:+mpi')
+ depends_on('hdf5@:1.8~mpi', when='@:4.4.0~mpi')
+ depends_on('hdf5~mpi', when='@4.4.1:~mpi')
def install(self, spec, prefix):
# Environment variables
diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py
index 47857eb713..70015baf1c 100644
--- a/var/spack/repos/builtin/packages/netlib-lapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py
@@ -52,7 +52,7 @@ class NetlibLapack(Package):
provides('blas', when='~external-blas')
provides('lapack')
- depends_on('cmake')
+ depends_on('cmake', type='build')
depends_on('blas', when='+external-blas')
diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
index f7fe26a42d..f7733249cf 100644
--- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
@@ -25,8 +25,10 @@
from spack import *
import sys
+
class NetlibScalapack(Package):
- """ScaLAPACK is a library of high-performance linear algebra routines for parallel distributed memory machines"""
+ """ScaLAPACK is a library of high-performance linear algebra routines for
+ parallel distributed memory machines"""
homepage = "http://www.netlib.org/scalapack/"
url = "http://www.netlib.org/scalapack/scalapack-2.0.2.tgz"
@@ -42,16 +44,28 @@ class NetlibScalapack(Package):
provides('scalapack')
- depends_on('cmake')
depends_on('mpi')
depends_on('lapack')
+ depends_on('cmake', when='@2.0.0:', type='build')
def install(self, spec, prefix):
options = [
- "-DBUILD_SHARED_LIBS:BOOL=%s" % ('ON' if '+shared' in spec else 'OFF'),
- "-DBUILD_STATIC_LIBS:BOOL=%s" % ('OFF' if '+shared' in spec else 'ON'),
- "-DUSE_OPTIMIZED_LAPACK_BLAS:BOOL=ON", # forces scalapack to use find_package(LAPACK)
- ]
+ "-DBUILD_SHARED_LIBS:BOOL=%s" % ('ON' if '+shared' in spec else
+ 'OFF'),
+ "-DBUILD_STATIC_LIBS:BOOL=%s" % ('OFF' if '+shared' in spec else
+ 'ON'),
+ # forces scalapack to use find_package(LAPACK):
+ "-DUSE_OPTIMIZED_LAPACK_BLAS:BOOL=ON",
+ ]
+
+ # Make sure we use Spack's Lapack:
+ options.extend([
+ '-DLAPACK_FOUND=true',
+ '-DLAPACK_INCLUDE_DIRS=%s' % spec['lapack'].prefix.include,
+ '-DLAPACK_LIBRARIES=%s' % (
+ spec['lapack'].lapack_shared_lib if '+shared' in spec else
+ spec['lapack'].lapack_static_lib),
+ ])
if '+fpic' in spec:
options.extend([
@@ -66,16 +80,15 @@ class NetlibScalapack(Package):
make()
make("install")
- # The shared libraries are not installed correctly on Darwin; correct this
+ # The shared libraries are not installed correctly on Darwin:
if (sys.platform == 'darwin') and ('+shared' in spec):
fix_darwin_install_name(prefix.lib)
-
def setup_dependent_package(self, module, dependent_spec):
spec = self.spec
- lib_dsuffix = '.dylib' if sys.platform == 'darwin' else '.so'
- lib_suffix = lib_dsuffix if '+shared' in spec else '.a'
+ lib_suffix = dso_suffix if '+shared' in spec else 'a'
spec.fc_link = '-L%s -lscalapack' % spec.prefix.lib
spec.cc_link = spec.fc_link
- spec.libraries = [join_path(spec.prefix.lib, 'libscalapack%s' % lib_suffix)]
+ spec.libraries = [join_path(spec.prefix.lib,
+ 'libscalapack.%s' % lib_suffix)]
diff --git a/var/spack/repos/builtin/packages/numdiff/package.py b/var/spack/repos/builtin/packages/numdiff/package.py
index e15d60cb0b..97164165e0 100644
--- a/var/spack/repos/builtin/packages/numdiff/package.py
+++ b/var/spack/repos/builtin/packages/numdiff/package.py
@@ -35,7 +35,7 @@ class Numdiff(Package):
version('5.8.1', 'a295eb391f6cb1578209fc6b4f9d994e')
- depends_on('gettext', sys.platform=='darwin')
+ depends_on('gettext', when=sys.platform=='darwin', type='build')
def install(self, spec, prefix):
options = ['--prefix=%s' % prefix]
diff --git a/var/spack/repos/builtin/packages/oce/package.py b/var/spack/repos/builtin/packages/oce/package.py
index 06b6b7cbb0..108c8f8a41 100644
--- a/var/spack/repos/builtin/packages/oce/package.py
+++ b/var/spack/repos/builtin/packages/oce/package.py
@@ -42,7 +42,7 @@ class Oce(Package):
variant('tbb', default=True, description='Build with Intel Threading Building Blocks')
- depends_on('cmake@2.8:')
+ depends_on('cmake@2.8:', type='build')
depends_on('tbb', when='+tbb')
# There is a bug in OCE which appears with Clang (version?) or GCC 6.0
diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py
index 6535f528ee..aa521899e5 100644
--- a/var/spack/repos/builtin/packages/octave/package.py
+++ b/var/spack/repos/builtin/packages/octave/package.py
@@ -68,9 +68,9 @@ class Octave(Package):
depends_on('blas')
depends_on('lapack')
# Octave does not configure with sed from darwin:
- depends_on('sed', sys.platform == 'darwin')
+ depends_on('sed', when=sys.platform == 'darwin', type='build')
depends_on('pcre')
- depends_on('pkg-config')
+ depends_on('pkg-config', type='build')
# Strongly recommended dependencies
depends_on('readline', when='+readline')
diff --git a/var/spack/repos/builtin/packages/ompt-openmp/package.py b/var/spack/repos/builtin/packages/ompt-openmp/package.py
index e74dcf6c23..800c04ae0e 100644
--- a/var/spack/repos/builtin/packages/ompt-openmp/package.py
+++ b/var/spack/repos/builtin/packages/ompt-openmp/package.py
@@ -31,7 +31,7 @@ class OmptOpenmp(Package):
version('0.1', '2334e6a84b52da41b27afd9831ed5370')
- # depends_on("foo")
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
with working_dir("runtime/build", create=True):
diff --git a/var/spack/repos/builtin/packages/openexr/package.py b/var/spack/repos/builtin/packages/openexr/package.py
new file mode 100644
index 0000000000..3619bd063c
--- /dev/null
+++ b/var/spack/repos/builtin/packages/openexr/package.py
@@ -0,0 +1,54 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Openexr(Package):
+ """OpenEXR Graphics Tools (high dynamic-range image file format)"""
+
+ homepage = "http://www.openexr.com/"
+ url = "https://savannah.nongnu.org/download/openexr/openexr-2.2.0.tar.gz"
+
+ version('2.2.0', 'b64e931c82aa3790329c21418373db4e')
+ version('2.1.0', '33735d37d2ee01c6d8fbd0df94fb8b43')
+ version('2.0.1', '4387e6050d2faa65dd5215618ff2ddce')
+ version('1.7.0', '27113284f7d26a58f853c346e0851d7a')
+ version('1.6.1', '11951f164f9c872b183df75e66de145a')
+ version('1.5.0', '55342d2256ab3ae99da16f16b2e12ce9')
+ version('1.4.0a', 'd0a4b9a930c766fa51561b05fb204afe')
+ version('1.3.2', '1522fe69135016c52eb88fc7d8514409')
+
+ variant('debug', default=False,
+ description='Builds a debug version of the libraries')
+
+ depends_on('pkg-config', type='build')
+ depends_on('ilmbase')
+
+ def install(self, spec, prefix):
+ configure_options = ['--prefix={0}'.format(prefix)]
+ if '+debug' not in spec:
+ configure_options.append('--disable-debug')
+ configure(*configure_options)
+ make('install')
diff --git a/var/spack/repos/builtin/packages/openjpeg/package.py b/var/spack/repos/builtin/packages/openjpeg/package.py
index 1d00edb06d..1bc5b04f6f 100644
--- a/var/spack/repos/builtin/packages/openjpeg/package.py
+++ b/var/spack/repos/builtin/packages/openjpeg/package.py
@@ -43,7 +43,7 @@ class Openjpeg(Package):
version('1.5.2', '545f98923430369a6b046ef3632ef95c')
version('1.5.1', 'd774e4b5a0db5f0f171c4fc0aabfa14e')
- depends_on('cmake')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
cmake('.', *std_cmake_args)
diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py
index 15c8eefe96..3fcf942f05 100644
--- a/var/spack/repos/builtin/packages/openmpi/package.py
+++ b/var/spack/repos/builtin/packages/openmpi/package.py
@@ -63,6 +63,7 @@ class Openmpi(Package):
list_url = "http://www.open-mpi.org/software/ompi/"
list_depth = 3
+ version('2.0.0', 'cdacc800cb4ce690c1f1273cb6366674')
version('1.10.3', 'e2fe4513200e2aaa1500b762342c674b')
version('1.10.2', 'b2f43d9635d2d52826e5ef9feb97fd4c')
version('1.10.1', 'f0fcd77ed345b7eafb431968124ba16e')
@@ -101,6 +102,7 @@ class Openmpi(Package):
provides('mpi@:2.2', when='@1.6.5')
provides('mpi@:3.0', when='@1.7.5:')
+ provides('mpi@:3.1', when='@2.0.0:')
depends_on('hwloc')
depends_on('sqlite', when='+sqlite3')
@@ -169,7 +171,8 @@ class Openmpi(Package):
'--with-psm2' if '+psm2' in spec else '--without-psm2',
'--with-mxm' if '+mxm' in spec else '--without-mxm',
# Other options
- '--enable-mpi-thread-multiple' if '+thread_multiple' in spec else '--disable-mpi-thread-multiple', # NOQA: ignore=E501
+ ('--enable-mpi-thread-multiple' if '+thread_multiple' in spec
+ else '--disable-mpi-thread-multiple'),
'--with-pmi' if '+pmi' in spec else '--without-pmi',
'--with-sqlite3' if '+sqlite3' in spec else '--without-sqlite3',
'--enable-vt' if '+vt' in spec else '--disable-vt'
diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py
index c501ea063c..4e2694a53c 100644
--- a/var/spack/repos/builtin/packages/openspeedshop/package.py
+++ b/var/spack/repos/builtin/packages/openspeedshop/package.py
@@ -80,7 +80,7 @@ class Openspeedshop(Package):
variant('mpich2', default=False, description="Build mpi experiment collector for mpich2 MPI when this variant is enabled.")
variant('mpich', default=False, description="Build mpi experiment collector for mpich MPI when this variant is enabled.")
- depends_on("cmake@3.0.2")
+ depends_on("cmake@3.0.2", type='build')
# Dependencies for openspeedshop that are common to all the variants of the OpenSpeedShop build
depends_on("bison")
depends_on("flex")
diff --git a/var/spack/repos/builtin/packages/p4est/package.py b/var/spack/repos/builtin/packages/p4est/package.py
index d0db4f7f20..4bbf0c1311 100644
--- a/var/spack/repos/builtin/packages/p4est/package.py
+++ b/var/spack/repos/builtin/packages/p4est/package.py
@@ -34,9 +34,9 @@ class P4est(Package):
variant('tests', default=True, description='Run small tests')
# build dependencies
- depends_on('automake')
- depends_on('autoconf')
- depends_on('libtool@2.4.2:')
+ depends_on('automake', type='build')
+ depends_on('autoconf', type='build')
+ depends_on('libtool@2.4.2:', type='build')
# other dependencies
depends_on('lua') # Needed for the submodule sc
diff --git a/var/spack/repos/builtin/packages/paradiseo/package.py b/var/spack/repos/builtin/packages/paradiseo/package.py
index d6324b63e6..97d36d94a4 100644
--- a/var/spack/repos/builtin/packages/paradiseo/package.py
+++ b/var/spack/repos/builtin/packages/paradiseo/package.py
@@ -48,13 +48,13 @@ class Paradiseo(Package):
variant('gnuplot', default=False, description='Enable GnuPlot support')
# Required dependencies
- depends_on ("cmake")
+ depends_on ("cmake", type='build')
# Optional dependencies
depends_on ("mpi", when="+mpi")
- depends_on ("doxygen", when='+doc')
+ depends_on ("doxygen", when='+doc', type='build')
depends_on ("gnuplot", when='+gnuplot')
- depends_on ("eigen", when='+edo')
+ depends_on ("eigen", when='+edo', type='build')
depends_on ("boost~mpi", when='+edo~mpi')
depends_on ("boost+mpi", when='+edo+mpi')
diff --git a/var/spack/repos/builtin/packages/parallel-netcdf/package.py b/var/spack/repos/builtin/packages/parallel-netcdf/package.py
index 59c44c8a4a..deee46df8f 100644
--- a/var/spack/repos/builtin/packages/parallel-netcdf/package.py
+++ b/var/spack/repos/builtin/packages/parallel-netcdf/package.py
@@ -39,7 +39,7 @@ class ParallelNetcdf(Package):
variant('fortran', default=True, description='Build the Fortran Interface')
variant('fpic', default=True, description='Produce position-independent code (for use with shared libraries)')
- depends_on("m4")
+ depends_on("m4", type='build')
depends_on("mpi")
# See: https://trac.mcs.anl.gov/projects/parallel-netcdf/browser/trunk/INSTALL
diff --git a/var/spack/repos/builtin/packages/parallel/package.py b/var/spack/repos/builtin/packages/parallel/package.py
new file mode 100644
index 0000000000..2306dace55
--- /dev/null
+++ b/var/spack/repos/builtin/packages/parallel/package.py
@@ -0,0 +1,45 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Parallel(Package):
+ """
+ GNU parallel is a shell tool for executing jobs in parallel using
+ one or more computers. A job can be a single command or a small
+ script that has to be run for each of the lines in the input.
+ """
+
+ homepage = "http://www.gnu.org/software/parallel/"
+ url = "http://ftp.gnu.org/gnu/parallel/parallel-20160422.tar.bz2"
+
+ version('20160422', '24621f684130472694333709bd4454cb')
+ version('20160322', '4e81e0d36902ab4c4e969ee6f35e6e57')
+
+ def install(self, spec, prefix):
+ configure('--prefix=%s' % prefix)
+
+ make()
+ make("install")
diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py
index 711cbc98c9..75f5272006 100644
--- a/var/spack/repos/builtin/packages/paraview/package.py
+++ b/var/spack/repos/builtin/packages/paraview/package.py
@@ -43,12 +43,13 @@ class Paraview(Package):
variant('opengl2', default=False, description='Enable OpenGL2 backend')
depends_on('python@2:2.7', when='+python')
- depends_on('py-numpy', when='+python')
- depends_on('py-matplotlib', when='+python')
+ depends_on('py-numpy', when='+python', type='run')
+ depends_on('py-matplotlib', when='+python', type='run')
depends_on('tcl', when='+tcl')
depends_on('mpi', when='+mpi')
depends_on('qt@:4', when='+qt')
+ depends_on('cmake', type='build')
depends_on('bzip2')
depends_on('freetype')
#depends_on('hdf5+mpi', when='+mpi')
diff --git a/var/spack/repos/builtin/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py
index 9b36f273e4..b2ceadc128 100644
--- a/var/spack/repos/builtin/packages/parmetis/package.py
+++ b/var/spack/repos/builtin/packages/parmetis/package.py
@@ -42,7 +42,7 @@ class Parmetis(Package):
variant('debug', default=False, description='Builds the library in debug mode')
variant('gdb', default=False, description='Enables gdb support')
- depends_on('cmake@2.8:') # build dependency
+ depends_on('cmake@2.8:', type='build') # build dependency
depends_on('mpi')
depends_on('metis@5:')
diff --git a/var/spack/repos/builtin/packages/pidx/package.py b/var/spack/repos/builtin/packages/pidx/package.py
index d38dcd7b96..e7b18ce7a8 100644
--- a/var/spack/repos/builtin/packages/pidx/package.py
+++ b/var/spack/repos/builtin/packages/pidx/package.py
@@ -36,6 +36,7 @@ class Pidx(Package):
version('1.0', git='https://github.com/sci-visus/PIDX.git',
commit='6afa1cf71d1c41263296dc049c8fabaf73c296da')
+ depends_on('cmake', type='build')
depends_on("mpi")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py
index fc77ba7412..192dd86e0e 100644
--- a/var/spack/repos/builtin/packages/psi4/package.py
+++ b/var/spack/repos/builtin/packages/psi4/package.py
@@ -41,8 +41,8 @@ class Psi4(Package):
depends_on('lapack')
depends_on('boost+chrono+filesystem+python+regex+serialization+system+timer+thread')
depends_on('python')
- depends_on('cmake')
- depends_on('py-numpy')
+ depends_on('cmake', type='build')
+ depends_on('py-numpy', type=nolink)
# Optional dependencies
# TODO: add packages for these
diff --git a/var/spack/repos/builtin/packages/py-astroid/package.py b/var/spack/repos/builtin/packages/py-astroid/package.py
index 8ba6696b0c..e1ea71fb67 100644
--- a/var/spack/repos/builtin/packages/py-astroid/package.py
+++ b/var/spack/repos/builtin/packages/py-astroid/package.py
@@ -22,7 +22,7 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
-from spack import depends_on, extends, version
+from spack import depends_on, extends, version, nolink
from spack import Package
@@ -37,9 +37,9 @@ class PyAstroid(Package):
version('1.4.1', 'ed70bfed5e4b25be4292e7fe72da2c02')
extends('python')
- depends_on('py-logilab-common')
- depends_on('py-setuptools')
- depends_on('py-six')
+ depends_on('py-logilab-common', type=nolink)
+ depends_on('py-setuptools', type='build')
+ depends_on('py-six', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-astropy/package.py b/var/spack/repos/builtin/packages/py-astropy/package.py
index a9962777dc..25dce87e49 100644
--- a/var/spack/repos/builtin/packages/py-astropy/package.py
+++ b/var/spack/repos/builtin/packages/py-astropy/package.py
@@ -38,18 +38,18 @@ class PyAstropy(Package):
# Required dependencies
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
# Optional dependencies
- depends_on('py-h5py')
- depends_on('py-beautifulsoup4')
- depends_on('py-pyyaml')
- depends_on('py-scipy')
+ depends_on('py-h5py', type=nolink)
+ depends_on('py-beautifulsoup4', type=nolink)
+ depends_on('py-pyyaml', type=nolink)
+ depends_on('py-scipy', type=nolink)
depends_on('libxml2')
- depends_on('py-matplotlib')
- depends_on('py-pytz')
- depends_on('py-scikit-image')
- depends_on('py-pandas')
+ depends_on('py-matplotlib', type=nolink)
+ depends_on('py-pytz', type=nolink)
+ depends_on('py-scikit-image', type=nolink)
+ depends_on('py-pandas', type=nolink)
# System dependencies
depends_on('cfitsio')
diff --git a/var/spack/repos/builtin/packages/py-autopep8/package.py b/var/spack/repos/builtin/packages/py-autopep8/package.py
index f2fd3cd683..507664949b 100644
--- a/var/spack/repos/builtin/packages/py-autopep8/package.py
+++ b/var/spack/repos/builtin/packages/py-autopep8/package.py
@@ -8,8 +8,8 @@ class PyAutopep8(Package):
version('1.2.2', 'def3d023fc9dfd1b7113602e965ad8e1')
extends('python')
- depends_on('py-setuptools')
- depends_on('py-pep8')
+ depends_on('py-setuptools', type='build')
+ depends_on('py-pep8', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py
index 13f604bacd..9c7f6454df 100644
--- a/var/spack/repos/builtin/packages/py-basemap/package.py
+++ b/var/spack/repos/builtin/packages/py-basemap/package.py
@@ -35,10 +35,10 @@ class PyBasemap(Package):
version('1.0.7', '48c0557ced9e2c6e440b28b3caff2de8')
extends('python')
- depends_on('py-setuptools')
- depends_on('py-numpy')
- depends_on('py-matplotlib+gui')
- depends_on('pil')
+ depends_on('py-setuptools', type='build')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-matplotlib+gui', type=nolink)
+ depends_on('pil', type=nolink)
depends_on("geos")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-biopython/package.py b/var/spack/repos/builtin/packages/py-biopython/package.py
index 26f42e060b..bcc889756e 100644
--- a/var/spack/repos/builtin/packages/py-biopython/package.py
+++ b/var/spack/repos/builtin/packages/py-biopython/package.py
@@ -32,8 +32,8 @@ class PyBiopython(Package):
version('1.65', '143e7861ade85c0a8b5e2bbdd1da1f67')
extends('python')
- depends_on('py-mx')
- depends_on('py-numpy')
+ depends_on('py-mx', type=nolink)
+ depends_on('py-numpy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-blessings/package.py b/var/spack/repos/builtin/packages/py-blessings/package.py
index 05a1f5bcbb..8d7a2343d1 100644
--- a/var/spack/repos/builtin/packages/py-blessings/package.py
+++ b/var/spack/repos/builtin/packages/py-blessings/package.py
@@ -31,7 +31,7 @@ class PyBlessings(Package):
version('1.6', '4f552a8ebcd4982693c92571beb99394')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
extends("python")
diff --git a/var/spack/repos/builtin/packages/py-bottleneck/package.py b/var/spack/repos/builtin/packages/py-bottleneck/package.py
index 1a186b219c..2483fab85f 100644
--- a/var/spack/repos/builtin/packages/py-bottleneck/package.py
+++ b/var/spack/repos/builtin/packages/py-bottleneck/package.py
@@ -32,7 +32,7 @@ class PyBottleneck(Package):
version('1.0.0', '380fa6f275bd24f27e7cf0e0d752f5d2')
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py
index 58d0a81990..e54d50fa50 100644
--- a/var/spack/repos/builtin/packages/py-cffi/package.py
+++ b/var/spack/repos/builtin/packages/py-cffi/package.py
@@ -33,8 +33,8 @@ class PyCffi(Package):
version('1.1.2', 'ca6e6c45b45caa87aee9adc7c796eaea')
extends('python')
- depends_on('py-setuptools')
- depends_on('py-pycparser')
+ depends_on('py-setuptools', type='build')
+ depends_on('py-pycparser', type=nolink)
depends_on('libffi')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-coverage/package.py b/var/spack/repos/builtin/packages/py-coverage/package.py
index 92a5bd0088..b7eaf58cd6 100644
--- a/var/spack/repos/builtin/packages/py-coverage/package.py
+++ b/var/spack/repos/builtin/packages/py-coverage/package.py
@@ -32,7 +32,7 @@ class PyCoverage(Package):
version('4.0a6', '1bb4058062646148965bef0796b61efc')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
extends('python')
diff --git a/var/spack/repos/builtin/packages/py-csvkit/package.py b/var/spack/repos/builtin/packages/py-csvkit/package.py
index 7fe2f953f7..2deaa2f74e 100644
--- a/var/spack/repos/builtin/packages/py-csvkit/package.py
+++ b/var/spack/repos/builtin/packages/py-csvkit/package.py
@@ -35,12 +35,12 @@ class PyCsvkit(Package):
extends('python')
- depends_on('py-dateutil')
- depends_on('py-dbf')
- depends_on('py-xlrd')
- depends_on('py-SQLAlchemy')
- depends_on('py-six')
- depends_on('py-openpyxl')
+ depends_on('py-dateutil', type=nolink)
+ depends_on('py-dbf', type=nolink)
+ depends_on('py-xlrd', type=nolink)
+ depends_on('py-SQLAlchemy', type=nolink)
+ depends_on('py-six', type=nolink)
+ depends_on('py-openpyxl', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-dask/package.py b/var/spack/repos/builtin/packages/py-dask/package.py
index 831f86e81c..b7dbab3d97 100644
--- a/var/spack/repos/builtin/packages/py-dask/package.py
+++ b/var/spack/repos/builtin/packages/py-dask/package.py
@@ -33,7 +33,7 @@ class PyDask(Package):
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-dateutil/package.py b/var/spack/repos/builtin/packages/py-dateutil/package.py
index eb8eb09e75..dfd1e143d9 100644
--- a/var/spack/repos/builtin/packages/py-dateutil/package.py
+++ b/var/spack/repos/builtin/packages/py-dateutil/package.py
@@ -34,8 +34,8 @@ class PyDateutil(Package):
version('2.5.2', 'eafe168e8f404bf384514f5116eedbb6')
extends('python')
- depends_on('py-setuptools')
- depends_on('py-six')
+ depends_on('py-setuptools', type='build')
+ depends_on('py-six', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-decorator/package.py b/var/spack/repos/builtin/packages/py-decorator/package.py
index 90a95cd0cb..bd78f262f4 100644
--- a/var/spack/repos/builtin/packages/py-decorator/package.py
+++ b/var/spack/repos/builtin/packages/py-decorator/package.py
@@ -33,7 +33,7 @@ class PyDecorator(Package):
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-emcee/package.py b/var/spack/repos/builtin/packages/py-emcee/package.py
index d57ef4bd76..397f737cb1 100644
--- a/var/spack/repos/builtin/packages/py-emcee/package.py
+++ b/var/spack/repos/builtin/packages/py-emcee/package.py
@@ -35,7 +35,7 @@ class PyEmcee(Package):
version('2.1.0', 'c6b6fad05c824d40671d4a4fc58dfff7')
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-flake8/package.py b/var/spack/repos/builtin/packages/py-flake8/package.py
index b261467d84..2fabe03d66 100644
--- a/var/spack/repos/builtin/packages/py-flake8/package.py
+++ b/var/spack/repos/builtin/packages/py-flake8/package.py
@@ -34,7 +34,7 @@ class PyFlake8(Package):
version('2.5.4', 'a4585b3569b95c3f66acb8294a7f06ef')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-funcsigs/package.py b/var/spack/repos/builtin/packages/py-funcsigs/package.py
index 9d987b284e..11ba639b85 100644
--- a/var/spack/repos/builtin/packages/py-funcsigs/package.py
+++ b/var/spack/repos/builtin/packages/py-funcsigs/package.py
@@ -34,7 +34,7 @@ class PyFuncsigs(Package):
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-genshi/package.py b/var/spack/repos/builtin/packages/py-genshi/package.py
index cba479a88f..ea8d26c796 100644
--- a/var/spack/repos/builtin/packages/py-genshi/package.py
+++ b/var/spack/repos/builtin/packages/py-genshi/package.py
@@ -36,7 +36,7 @@ class PyGenshi(Package):
version('0.6', '604e8b23b4697655d36a69c2d8ef7187')
extends("python")
- depends_on("py-setuptools")
+ depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-gnuplot/package.py b/var/spack/repos/builtin/packages/py-gnuplot/package.py
index 3381c4a5ac..b08b03d1f1 100644
--- a/var/spack/repos/builtin/packages/py-gnuplot/package.py
+++ b/var/spack/repos/builtin/packages/py-gnuplot/package.py
@@ -32,7 +32,7 @@ class PyGnuplot(Package):
version('1.8', 'abd6f571e7aec68ae7db90a5217cd5b1')
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-h5py/package.py b/var/spack/repos/builtin/packages/py-h5py/package.py
index 67461babe7..f96cb9b4cd 100644
--- a/var/spack/repos/builtin/packages/py-h5py/package.py
+++ b/var/spack/repos/builtin/packages/py-h5py/package.py
@@ -41,17 +41,18 @@ class PyH5py(Package):
extends('python')
# Build dependencies
- depends_on('py-cython@0.19:')
- depends_on('pkg-config')
+ depends_on('py-cython@0.19:', type='build')
+ depends_on('pkg-config', type='build')
depends_on('hdf5@1.8.4:')
depends_on('hdf5+mpi', when='+mpi')
depends_on('mpi', when='+mpi')
+ depends_on('py-mpi4py', when='+mpi')
# Build and runtime dependencies
- depends_on('py-numpy@1.6.1:')
+ depends_on('py-numpy@1.6.1:', type=nolink)
# Runtime dependencies
- depends_on('py-six')
+ depends_on('py-six', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'configure',
diff --git a/var/spack/repos/builtin/packages/py-iminuit/package.py b/var/spack/repos/builtin/packages/py-iminuit/package.py
index 47751a702d..d7446c06d4 100644
--- a/var/spack/repos/builtin/packages/py-iminuit/package.py
+++ b/var/spack/repos/builtin/packages/py-iminuit/package.py
@@ -35,12 +35,12 @@ class PyIminuit(Package):
# Required dependencies
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
# Optional dependencies
- depends_on('py-numpy')
- depends_on('py-matplotlib')
- depends_on('py-cython')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-matplotlib', type=nolink)
+ depends_on('py-cython', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py
index 7a94f90b38..b583609953 100644
--- a/var/spack/repos/builtin/packages/py-ipython/package.py
+++ b/var/spack/repos/builtin/packages/py-ipython/package.py
@@ -33,8 +33,8 @@ class PyIpython(Package):
version('3.1.0', 'a749d90c16068687b0ec45a27e72ef8f')
extends('python')
- depends_on('py-pygments')
- depends_on('py-setuptools')
+ depends_on('py-pygments', type=nolink)
+ depends_on('py-setuptools', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-jinja2/package.py b/var/spack/repos/builtin/packages/py-jinja2/package.py
index 48312d9baf..57f26e3b90 100644
--- a/var/spack/repos/builtin/packages/py-jinja2/package.py
+++ b/var/spack/repos/builtin/packages/py-jinja2/package.py
@@ -22,7 +22,7 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
-from spack import depends_on, extends, version
+from spack import depends_on, extends, version, nolink
from spack import Package
@@ -43,8 +43,8 @@ class PyJinja2(Package):
version('2.7', 'ec70433f325051dcedacbb2465028a35')
extends("python")
- depends_on("py-setuptools")
- depends_on("py-markupsafe")
+ depends_on("py-setuptools", type='build')
+ depends_on("py-markupsafe", type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-lockfile/package.py b/var/spack/repos/builtin/packages/py-lockfile/package.py
index 998b41abc6..38cc81b895 100644
--- a/var/spack/repos/builtin/packages/py-lockfile/package.py
+++ b/var/spack/repos/builtin/packages/py-lockfile/package.py
@@ -41,7 +41,7 @@ class PyLockfile(Package):
version('0.10.2', '1aa6175a6d57f082cd12e7ac6102ab15')
extends("python")
- depends_on("py-setuptools")
+ depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-logilab-common/package.py b/var/spack/repos/builtin/packages/py-logilab-common/package.py
index 8675c48e9a..6dab4a40e4 100644
--- a/var/spack/repos/builtin/packages/py-logilab-common/package.py
+++ b/var/spack/repos/builtin/packages/py-logilab-common/package.py
@@ -22,7 +22,7 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
-from spack import depends_on, extends, version
+from spack import depends_on, extends, version, nolink
from spack import Package
@@ -34,8 +34,8 @@ class PyLogilabCommon(Package):
version('1.2.0', 'f7b51351b7bfe052746fa04c03253c0b')
extends("python")
- depends_on("py-setuptools")
- depends_on("py-six")
+ depends_on("py-setuptools", type='build')
+ depends_on("py-six", type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-mako/package.py b/var/spack/repos/builtin/packages/py-mako/package.py
index a03ef4defb..56741ec11f 100644
--- a/var/spack/repos/builtin/packages/py-mako/package.py
+++ b/var/spack/repos/builtin/packages/py-mako/package.py
@@ -33,7 +33,7 @@ class PyMako(Package):
version('1.0.1', '9f0aafd177b039ef67b90ea350497a54')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
extends('python')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-markupsafe/package.py b/var/spack/repos/builtin/packages/py-markupsafe/package.py
index 58c9f70066..ee396de7be 100644
--- a/var/spack/repos/builtin/packages/py-markupsafe/package.py
+++ b/var/spack/repos/builtin/packages/py-markupsafe/package.py
@@ -44,7 +44,7 @@ class PyMarkupsafe(Package):
version('0.19', '64b05361adb92c11839fc470e308c593')
extends("python")
- depends_on("py-setuptools")
+ depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-matplotlib/package.py b/var/spack/repos/builtin/packages/py-matplotlib/package.py
index 14f9716ae6..b5eb8a53c4 100644
--- a/var/spack/repos/builtin/packages/py-matplotlib/package.py
+++ b/var/spack/repos/builtin/packages/py-matplotlib/package.py
@@ -38,19 +38,20 @@ class PyMatplotlib(Package):
extends('python', ignore=r'bin/nosetests.*$|bin/pbr$')
- depends_on('py-pyside', when='+gui')
- depends_on('py-ipython', when='+ipython')
- depends_on('py-pyparsing')
- depends_on('py-six')
- depends_on('py-dateutil')
- depends_on('py-pytz')
- depends_on('py-nose')
- depends_on('py-numpy')
- depends_on('py-mock')
- depends_on('py-pbr')
- depends_on('py-funcsigs')
+ depends_on('py-setuptools', type='build')
+ depends_on('py-pyside', when='+gui', type=nolink)
+ depends_on('py-ipython', when='+ipython', type=nolink)
+ depends_on('py-pyparsing', type=nolink)
+ depends_on('py-six', type=nolink)
+ depends_on('py-dateutil', type=nolink)
+ depends_on('py-pytz', type=nolink)
+ depends_on('py-nose', type=nolink)
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-mock', type=nolink)
+ depends_on('py-pbr', type=nolink)
+ depends_on('py-funcsigs', type=nolink)
- depends_on('pkg-config')
+ depends_on('pkg-config', type='build')
depends_on('freetype')
depends_on('qt', when='+gui')
depends_on('bzip2')
diff --git a/var/spack/repos/builtin/packages/py-mistune/package.py b/var/spack/repos/builtin/packages/py-mistune/package.py
index 9bcbb5a927..399c10005e 100644
--- a/var/spack/repos/builtin/packages/py-mistune/package.py
+++ b/var/spack/repos/builtin/packages/py-mistune/package.py
@@ -40,7 +40,7 @@ class PyMistune(Package):
version('0.5', '997736554f1f95eea78c66ae339b5722')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-mock/package.py b/var/spack/repos/builtin/packages/py-mock/package.py
index 0587131b88..f4c178de67 100644
--- a/var/spack/repos/builtin/packages/py-mock/package.py
+++ b/var/spack/repos/builtin/packages/py-mock/package.py
@@ -35,8 +35,8 @@ class PyMock(Package):
version('1.3.0', '73ee8a4afb3ff4da1b4afa287f39fdeb')
extends('python')
- depends_on('py-pbr')
- depends_on('py-setuptools@17.1:')
+ depends_on('py-pbr', type=nolink)
+ depends_on('py-setuptools@17.1:', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py
index 2764b8b3c6..a749e16779 100644
--- a/var/spack/repos/builtin/packages/py-mpi4py/package.py
+++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py
@@ -33,7 +33,7 @@ class PyMpi4py(Package):
version('1.3.1', 'dbe9d22bdc8ed965c23a7ceb6f32fc3c')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
depends_on('mpi')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-mysqldb1/package.py b/var/spack/repos/builtin/packages/py-mysqldb1/package.py
index 9918ba3e64..46b44f34dd 100644
--- a/var/spack/repos/builtin/packages/py-mysqldb1/package.py
+++ b/var/spack/repos/builtin/packages/py-mysqldb1/package.py
@@ -32,7 +32,7 @@ class PyMysqldb1(Package):
version('1.2.5', '332c8f4955b6bc0c79ea15170bf7321b')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-nestle/package.py b/var/spack/repos/builtin/packages/py-nestle/package.py
index 16506e3eca..81f9fe4d09 100644
--- a/var/spack/repos/builtin/packages/py-nestle/package.py
+++ b/var/spack/repos/builtin/packages/py-nestle/package.py
@@ -35,10 +35,10 @@ class PyNestle(Package):
# Required dependencies
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
# Optional dependencies
- depends_on('py-scipy')
+ depends_on('py-scipy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-netcdf/package.py b/var/spack/repos/builtin/packages/py-netcdf/package.py
index e3f857a0ce..9a354cb1c1 100644
--- a/var/spack/repos/builtin/packages/py-netcdf/package.py
+++ b/var/spack/repos/builtin/packages/py-netcdf/package.py
@@ -32,8 +32,8 @@ class PyNetcdf(Package):
version('1.2.3.1', '4fc4320d4f2a77b894ebf8da1c9895af')
extends('python')
- depends_on('py-numpy')
- depends_on('py-cython')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-cython', type=nolink)
depends_on('netcdf')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-networkx/package.py b/var/spack/repos/builtin/packages/py-networkx/package.py
index 6bdb24e36e..d545717628 100644
--- a/var/spack/repos/builtin/packages/py-networkx/package.py
+++ b/var/spack/repos/builtin/packages/py-networkx/package.py
@@ -33,7 +33,7 @@ class PyNetworkx(Package):
extends('python')
- depends_on('py-decorator')
+ depends_on('py-decorator', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py
index abb2d500a2..d15a1784d1 100644
--- a/var/spack/repos/builtin/packages/py-nose/package.py
+++ b/var/spack/repos/builtin/packages/py-nose/package.py
@@ -37,7 +37,7 @@ class PyNose(Package):
version('1.3.7', '4d3ad0ff07b61373d2cefc89c5d0b20b')
extends('python', ignore=r'bin/nosetests.*$')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-numexpr/package.py b/var/spack/repos/builtin/packages/py-numexpr/package.py
index d8bacd179f..fd8d7dc0c6 100644
--- a/var/spack/repos/builtin/packages/py-numexpr/package.py
+++ b/var/spack/repos/builtin/packages/py-numexpr/package.py
@@ -34,7 +34,7 @@ class PyNumexpr(Package):
version('2.5', '84f66cced45ba3e30dcf77a937763aaa')
extends('python')
- depends_on('py-numpy')
+ depends_on('py-numpy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py
index e9672b7bb0..2febdac658 100644
--- a/var/spack/repos/builtin/packages/py-numpy/package.py
+++ b/var/spack/repos/builtin/packages/py-numpy/package.py
@@ -24,6 +24,7 @@
##############################################################################
from spack import *
+
class PyNumpy(Package):
"""NumPy is the fundamental package for scientific computing with Python.
It contains among other things: a powerful N-dimensional array object,
@@ -38,12 +39,12 @@ class PyNumpy(Package):
version('1.9.2', 'a1ed53432dbcd256398898d35bc8e645')
version('1.9.1', '78842b73560ec378142665e712ae4ad9')
-
variant('blas', default=True)
variant('lapack', default=True)
extends('python')
- depends_on('py-nose')
+ depends_on('py-nose', type='build')
+ depends_on('py-setuptools', type='build')
depends_on('blas', when='+blas')
depends_on('lapack', when='+lapack')
@@ -63,6 +64,6 @@ class PyNumpy(Package):
f.write('[DEFAULT]\n')
f.write('libraries=%s\n' % ','.join(libraries))
f.write('library_dirs=%s\n' % ':'.join(library_dirs))
+ f.write('rpath=%s\n' % ':'.join(library_dirs))
python('setup.py', 'install', '--prefix=%s' % prefix)
-
diff --git a/var/spack/repos/builtin/packages/py-openpyxl/package.py b/var/spack/repos/builtin/packages/py-openpyxl/package.py
index 30cb52348f..624da58ff3 100644
--- a/var/spack/repos/builtin/packages/py-openpyxl/package.py
+++ b/var/spack/repos/builtin/packages/py-openpyxl/package.py
@@ -34,8 +34,8 @@ class PyOpenpyxl(Package):
extends('python')
- depends_on('py-jdcal')
- depends_on('py-setuptools')
+ depends_on('py-jdcal', type=nolink)
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pandas/package.py b/var/spack/repos/builtin/packages/py-pandas/package.py
index 7f54fc5d76..8bd4227faf 100644
--- a/var/spack/repos/builtin/packages/py-pandas/package.py
+++ b/var/spack/repos/builtin/packages/py-pandas/package.py
@@ -35,12 +35,12 @@ class PyPandas(Package):
version('0.18.0', 'f143762cd7a59815e348adf4308d2cf6')
extends('python')
- depends_on('py-dateutil')
- depends_on('py-numpy')
- depends_on('py-setuptools')
- depends_on('py-pytz')
- depends_on('py-numexpr')
- depends_on('py-bottleneck')
+ depends_on('py-dateutil', type=nolink)
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-setuptools', type='build')
+ depends_on('py-pytz', type=nolink)
+ depends_on('py-numexpr', type=nolink)
+ depends_on('py-bottleneck', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pbr/package.py b/var/spack/repos/builtin/packages/py-pbr/package.py
index 336ea37144..8502b0b364 100644
--- a/var/spack/repos/builtin/packages/py-pbr/package.py
+++ b/var/spack/repos/builtin/packages/py-pbr/package.py
@@ -34,7 +34,7 @@ class PyPbr(Package):
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pep8/package.py b/var/spack/repos/builtin/packages/py-pep8/package.py
index 987783b392..ffcc2b318c 100644
--- a/var/spack/repos/builtin/packages/py-pep8/package.py
+++ b/var/spack/repos/builtin/packages/py-pep8/package.py
@@ -8,7 +8,7 @@ class PyPep8(Package):
version('1.7.0', '31070a3a6391928893cbf5fa523eb8d9')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-periodictable/package.py b/var/spack/repos/builtin/packages/py-periodictable/package.py
index 7d8a635979..608f4e16c1 100644
--- a/var/spack/repos/builtin/packages/py-periodictable/package.py
+++ b/var/spack/repos/builtin/packages/py-periodictable/package.py
@@ -33,8 +33,8 @@ class PyPeriodictable(Package):
version('1.4.1', '7246b63cc0b6b1be6e86b6616f9e866e')
- depends_on('py-numpy')
- depends_on('py-pyparsing')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-pyparsing', type=nolink)
extends('python')
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-phonopy/package.py b/var/spack/repos/builtin/packages/py-phonopy/package.py
index 68774c90c2..a3a4b7a9f7 100644
--- a/var/spack/repos/builtin/packages/py-phonopy/package.py
+++ b/var/spack/repos/builtin/packages/py-phonopy/package.py
@@ -33,10 +33,10 @@ class PyPhonopy(Package):
version('1.10.0', '973ed1bcea46e21b9bf747aab9061ff6')
extends('python')
- depends_on('py-numpy')
- depends_on('py-scipy')
- depends_on('py-matplotlib')
- depends_on('py-pyyaml')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-scipy', type=nolink)
+ depends_on('py-matplotlib', type=nolink)
+ depends_on('py-pyyaml', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--home=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pillow/package.py b/var/spack/repos/builtin/packages/py-pillow/package.py
index 25cf412b31..13a09f63cf 100644
--- a/var/spack/repos/builtin/packages/py-pillow/package.py
+++ b/var/spack/repos/builtin/packages/py-pillow/package.py
@@ -62,8 +62,8 @@ class PyPillow(Package):
# Required dependencies
extends('python')
- depends_on('binutils')
- depends_on('py-setuptools')
+ depends_on('binutils', type='build')
+ depends_on('py-setuptools', type='build')
# Recommended dependencies
depends_on('jpeg', when='+jpeg')
diff --git a/var/spack/repos/builtin/packages/py-prettytable/package.py b/var/spack/repos/builtin/packages/py-prettytable/package.py
index e3edc7b706..cf814733d4 100644
--- a/var/spack/repos/builtin/packages/py-prettytable/package.py
+++ b/var/spack/repos/builtin/packages/py-prettytable/package.py
@@ -38,7 +38,7 @@ class PyPrettytable(Package):
version('0.7.2', 'a6b80afeef286ce66733d54a0296b13b')
extends("python")
- depends_on("py-setuptools")
+ depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-protobuf/package.py b/var/spack/repos/builtin/packages/py-protobuf/package.py
index da3a65c22e..dd2b5651de 100644
--- a/var/spack/repos/builtin/packages/py-protobuf/package.py
+++ b/var/spack/repos/builtin/packages/py-protobuf/package.py
@@ -44,7 +44,7 @@ class PyProtobuf(Package):
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-py2neo/package.py b/var/spack/repos/builtin/packages/py-py2neo/package.py
index 9c6e219264..02f37d8b78 100644
--- a/var/spack/repos/builtin/packages/py-py2neo/package.py
+++ b/var/spack/repos/builtin/packages/py-py2neo/package.py
@@ -38,7 +38,7 @@ class PyPy2neo(Package):
version('2.0.5', '143b1f9c0aa22faf170c1b9f84c7343b')
version('2.0.4', 'b3f7efd3344dc3f66db4eda11e5899f7')
- depends_on("py-setuptools")
+ depends_on("py-setuptools", type='build')
extends("python")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-pycparser/package.py b/var/spack/repos/builtin/packages/py-pycparser/package.py
index c33769c526..9afba50077 100644
--- a/var/spack/repos/builtin/packages/py-pycparser/package.py
+++ b/var/spack/repos/builtin/packages/py-pycparser/package.py
@@ -33,7 +33,7 @@ class PyPycparser(Package):
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pydatalog/package.py b/var/spack/repos/builtin/packages/py-pydatalog/package.py
new file mode 100644
index 0000000000..da157d3679
--- /dev/null
+++ b/var/spack/repos/builtin/packages/py-pydatalog/package.py
@@ -0,0 +1,38 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class PyPydatalog(Package):
+ """pyDatalog adds logic programming to Python."""
+ homepage = 'https://pypi.python.org/pypi/pyDatalog/'
+ url = 'https://pypi.python.org/packages/09/0b/2670eb9c0027aacfb5b5024ca75e5fee2f1261180ab8797108ffc941158a/pyDatalog-0.17.1.zip'
+
+ version('0.17.1', '6b2682301200068d208d6f2d01723939')
+
+ extends('python')
+
+ def install(self, spec, prefix):
+ python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pygments/package.py b/var/spack/repos/builtin/packages/py-pygments/package.py
index fedf3d068d..0ca15dd10d 100644
--- a/var/spack/repos/builtin/packages/py-pygments/package.py
+++ b/var/spack/repos/builtin/packages/py-pygments/package.py
@@ -33,7 +33,7 @@ class PyPygments(Package):
version('2.0.2', '238587a1370d62405edabd0794b3ec4a')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pylint/package.py b/var/spack/repos/builtin/packages/py-pylint/package.py
index 66118e8228..7107b2987f 100644
--- a/var/spack/repos/builtin/packages/py-pylint/package.py
+++ b/var/spack/repos/builtin/packages/py-pylint/package.py
@@ -34,8 +34,8 @@ class PyPylint(Package):
version('1.4.3', '5924c1c7ca5ca23647812f5971d0ea44')
extends('python')
- depends_on('py-nose')
- depends_on('py-setuptools')
+ depends_on('py-nose', type='build')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-pyqt/package.py b/var/spack/repos/builtin/packages/py-pyqt/package.py
index b090e25682..05fb7aa22c 100644
--- a/var/spack/repos/builtin/packages/py-pyqt/package.py
+++ b/var/spack/repos/builtin/packages/py-pyqt/package.py
@@ -34,7 +34,7 @@ class PyPyqt(Package):
version('4.11.3', '997c3e443165a89a559e0d96b061bf70')
extends('python')
- depends_on('py-sip')
+ depends_on('py-sip', type=nolink)
# TODO: allow qt5 when conditional deps are supported.
# TODO: Fix version matching so that @4 works like @:4
diff --git a/var/spack/repos/builtin/packages/py-pyside/package.py b/var/spack/repos/builtin/packages/py-pyside/package.py
index affee6c55a..cd174ce658 100644
--- a/var/spack/repos/builtin/packages/py-pyside/package.py
+++ b/var/spack/repos/builtin/packages/py-pyside/package.py
@@ -32,11 +32,10 @@ class PyPyside(Package):
version('1.2.2', 'c45bc400c8a86d6b35f34c29e379e44d')
- # TODO: make build dependency
- # depends_on("cmake")
+ depends_on('cmake', type='build')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
depends_on('qt@:4')
def patch(self):
diff --git a/var/spack/repos/builtin/packages/py-pytables/package.py b/var/spack/repos/builtin/packages/py-pytables/package.py
index 47592fb3d1..58ed067b21 100644
--- a/var/spack/repos/builtin/packages/py-pytables/package.py
+++ b/var/spack/repos/builtin/packages/py-pytables/package.py
@@ -34,9 +34,9 @@ class PyPytables(Package):
extends('python')
depends_on('hdf5')
- depends_on('py-numpy')
- depends_on('py-numexpr')
- depends_on('py-cython')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-numexpr', type=nolink)
+ depends_on('py-cython', type=nolink)
def install(self, spec, prefix):
env["HDF5_DIR"] = spec['hdf5'].prefix
diff --git a/var/spack/repos/builtin/packages/py-python-daemon/package.py b/var/spack/repos/builtin/packages/py-python-daemon/package.py
index ae6393986d..c2c7c4de4f 100644
--- a/var/spack/repos/builtin/packages/py-python-daemon/package.py
+++ b/var/spack/repos/builtin/packages/py-python-daemon/package.py
@@ -42,8 +42,8 @@ class PyPythonDaemon(Package):
version('2.0.5', '73e7f49f525c51fa4a995aea4d80de41')
extends("python")
- depends_on("py-setuptools")
- depends_on("py-lockfile")
+ depends_on("py-setuptools", type='build')
+ depends_on("py-lockfile", type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-restview/package.py b/var/spack/repos/builtin/packages/py-restview/package.py
index 91b1db993e..047214c58e 100644
--- a/var/spack/repos/builtin/packages/py-restview/package.py
+++ b/var/spack/repos/builtin/packages/py-restview/package.py
@@ -34,8 +34,8 @@ class PyRestview(Package):
version('2.6.1', 'ac8b70e15b8f1732d1733d674813666b')
extends('python')
- depends_on('py-docutils')
- depends_on('py-pygments')
+ depends_on('py-docutils', type=nolink)
+ depends_on('py-pygments', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-rpy2/package.py b/var/spack/repos/builtin/packages/py-rpy2/package.py
index 03fd2b4a06..8f4771f0eb 100644
--- a/var/spack/repos/builtin/packages/py-rpy2/package.py
+++ b/var/spack/repos/builtin/packages/py-rpy2/package.py
@@ -33,7 +33,7 @@ class PyRpy2(Package):
version('2.5.6', 'a36e758b633ce6aec6a5f450bfee980f')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
depends_on('R')
diff --git a/var/spack/repos/builtin/packages/py-scikit-image/package.py b/var/spack/repos/builtin/packages/py-scikit-image/package.py
index 4c8fd0942a..26c286e4be 100644
--- a/var/spack/repos/builtin/packages/py-scikit-image/package.py
+++ b/var/spack/repos/builtin/packages/py-scikit-image/package.py
@@ -36,12 +36,12 @@ class PyScikitImage(Package):
extends('python', ignore=r'bin/.*\.py$')
- depends_on('py-dask')
- depends_on('pil')
- depends_on('py-networkx')
- depends_on('py-six')
- depends_on('py-scipy')
- depends_on('py-matplotlib')
+ depends_on('py-dask', type=nolink)
+ depends_on('pil', type=nolink)
+ depends_on('py-networkx', type=nolink)
+ depends_on('py-six', type=nolink)
+ depends_on('py-scipy', type=nolink)
+ depends_on('py-matplotlib', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py
index 7bb5853b19..1a6112bcf3 100644
--- a/var/spack/repos/builtin/packages/py-scikit-learn/package.py
+++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py
@@ -35,9 +35,9 @@ class PyScikitLearn(Package):
extends('python')
- depends_on('py-setuptools')
- depends_on('py-numpy')
- depends_on('py-scipy')
+ depends_on('py-setuptools', type='build')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-scipy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py
index f7c372b345..ea3731cf1b 100644
--- a/var/spack/repos/builtin/packages/py-scipy/package.py
+++ b/var/spack/repos/builtin/packages/py-scipy/package.py
@@ -34,8 +34,8 @@ class PyScipy(Package):
version('0.15.0', '639112f077f0aeb6d80718dc5019dc7a')
extends('python')
- depends_on('py-nose')
- depends_on('py-numpy+blas+lapack')
+ depends_on('py-nose', type='build')
+ depends_on('py-numpy+blas+lapack', type=nolink)
def install(self, spec, prefix):
if 'atlas' in spec:
diff --git a/var/spack/repos/builtin/packages/py-shiboken/package.py b/var/spack/repos/builtin/packages/py-shiboken/package.py
index a2240c68a4..27188e1417 100644
--- a/var/spack/repos/builtin/packages/py-shiboken/package.py
+++ b/var/spack/repos/builtin/packages/py-shiboken/package.py
@@ -32,11 +32,10 @@ class PyShiboken(Package):
version('1.2.2', '345cfebda221f525842e079a6141e555')
- # TODO: make build dependency
- # depends_on("cmake")
+ depends_on('cmake', type='build')
extends('python')
- depends_on("py-setuptools")
+ depends_on("py-setuptools", type='build')
depends_on("libxml2")
depends_on("qt@:4.8")
diff --git a/var/spack/repos/builtin/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py
index 3efb3d4317..eb4846d5af 100644
--- a/var/spack/repos/builtin/packages/py-six/package.py
+++ b/var/spack/repos/builtin/packages/py-six/package.py
@@ -33,7 +33,7 @@ class PySix(Package):
version('1.10.0', '34eed507548117b2ab523ab14b2f8b55')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-sncosmo/package.py b/var/spack/repos/builtin/packages/py-sncosmo/package.py
index 82ae2a2e69..feb3856e8b 100644
--- a/var/spack/repos/builtin/packages/py-sncosmo/package.py
+++ b/var/spack/repos/builtin/packages/py-sncosmo/package.py
@@ -37,15 +37,15 @@ class PySncosmo(Package):
# Required dependencies
# py-sncosmo binaries are duplicates of those from py-astropy
extends('python', ignore=r'bin/.*')
- depends_on('py-numpy')
- depends_on('py-scipy')
- depends_on('py-astropy')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-scipy', type=nolink)
+ depends_on('py-astropy', type=nolink)
# Recommended dependencies
- depends_on('py-matplotlib')
- depends_on('py-iminuit')
- depends_on('py-emcee')
- depends_on('py-nestle')
+ depends_on('py-matplotlib', type=nolink)
+ depends_on('py-iminuit', type=nolink)
+ depends_on('py-emcee', type=nolink)
+ depends_on('py-nestle', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-storm/package.py b/var/spack/repos/builtin/packages/py-storm/package.py
index 53af720c50..0e972480f3 100644
--- a/var/spack/repos/builtin/packages/py-storm/package.py
+++ b/var/spack/repos/builtin/packages/py-storm/package.py
@@ -34,7 +34,7 @@ class PyStorm(Package):
version('0.20', '8628503141f0f06c0749d607ac09b9c7')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-tappy/package.py b/var/spack/repos/builtin/packages/py-tappy/package.py
index a1026a9b4b..b10244acdd 100644
--- a/var/spack/repos/builtin/packages/py-tappy/package.py
+++ b/var/spack/repos/builtin/packages/py-tappy/package.py
@@ -33,7 +33,7 @@ class PyTappy(Package):
version('1.6', 'c8bdb93ad66e05f939905172a301bedf')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-tuiview/package.py b/var/spack/repos/builtin/packages/py-tuiview/package.py
index 200a33a676..56056ebad1 100644
--- a/var/spack/repos/builtin/packages/py-tuiview/package.py
+++ b/var/spack/repos/builtin/packages/py-tuiview/package.py
@@ -35,8 +35,8 @@ class PyTuiview(Package):
version('1.1.7', '4b3b38a820cc239c8ab4a181ac5d4c30')
extends("python")
- depends_on("py-pyqt")
- depends_on("py-numpy")
+ depends_on("py-pyqt", type=nolink)
+ depends_on("py-numpy", type=nolink)
depends_on("gdal")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/py-twisted/package.py b/var/spack/repos/builtin/packages/py-twisted/package.py
index 27db4adff4..2ce83cd24c 100644
--- a/var/spack/repos/builtin/packages/py-twisted/package.py
+++ b/var/spack/repos/builtin/packages/py-twisted/package.py
@@ -32,7 +32,7 @@ class PyTwisted(Package):
version('15.4.0', '5337ffb6aeeff3790981a2cd56db9655')
version('15.3.0', 'b58e83da2f00b3352afad74d0c5c4599')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
extends('python')
diff --git a/var/spack/repos/builtin/packages/py-unittest2/package.py b/var/spack/repos/builtin/packages/py-unittest2/package.py
index f669a500ec..174ab0ca5f 100644
--- a/var/spack/repos/builtin/packages/py-unittest2/package.py
+++ b/var/spack/repos/builtin/packages/py-unittest2/package.py
@@ -35,7 +35,7 @@ class PyUnittest2(Package):
version('1.1.0', 'f72dae5d44f091df36b6b513305ea000')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py
index ca857395fb..95e6dcbff0 100644
--- a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py
+++ b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py
@@ -36,7 +36,7 @@ class PyUnittest2py3k(Package):
version('0.5.1', '8824ff92044310d9365f90d892bf0f09')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-urwid/package.py b/var/spack/repos/builtin/packages/py-urwid/package.py
index 0accc72df8..48ba84e7bc 100644
--- a/var/spack/repos/builtin/packages/py-urwid/package.py
+++ b/var/spack/repos/builtin/packages/py-urwid/package.py
@@ -31,7 +31,7 @@ class PyUrwid(Package):
version('1.3.0', 'a989acd54f4ff1a554add464803a9175')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
extends("python")
diff --git a/var/spack/repos/builtin/packages/py-virtualenv/package.py b/var/spack/repos/builtin/packages/py-virtualenv/package.py
index d42cb96eb7..d6b33ae175 100644
--- a/var/spack/repos/builtin/packages/py-virtualenv/package.py
+++ b/var/spack/repos/builtin/packages/py-virtualenv/package.py
@@ -35,7 +35,7 @@ class PyVirtualenv(Package):
version('15.0.1', '28d76a0d9cbd5dc42046dd14e76a6ecc')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-wcsaxes/package.py b/var/spack/repos/builtin/packages/py-wcsaxes/package.py
index b0adbe3658..9588b879fa 100644
--- a/var/spack/repos/builtin/packages/py-wcsaxes/package.py
+++ b/var/spack/repos/builtin/packages/py-wcsaxes/package.py
@@ -35,9 +35,9 @@ class PyWcsaxes(Package):
version('0.8', 'de1c60fdae4c330bf5ddb9f1ab5ab920')
extends('python', ignore=r'bin/pbr')
- depends_on('py-numpy')
- depends_on('py-matplotlib')
- depends_on('py-astropy')
+ depends_on('py-numpy', type=nolink)
+ depends_on('py-matplotlib', type=nolink)
+ depends_on('py-astropy', type=nolink)
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix={0}'.format(prefix))
diff --git a/var/spack/repos/builtin/packages/py-wheel/package.py b/var/spack/repos/builtin/packages/py-wheel/package.py
index 68b6f3d679..9e383a9a19 100644
--- a/var/spack/repos/builtin/packages/py-wheel/package.py
+++ b/var/spack/repos/builtin/packages/py-wheel/package.py
@@ -33,7 +33,7 @@ class PyWheel(Package):
version('0.26.0', '4cfc6e7e3dc7377d0164914623922a10')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/py-yapf/package.py b/var/spack/repos/builtin/packages/py-yapf/package.py
index 60f740c98d..f7fe4037a1 100644
--- a/var/spack/repos/builtin/packages/py-yapf/package.py
+++ b/var/spack/repos/builtin/packages/py-yapf/package.py
@@ -33,7 +33,7 @@ class PyYapf(Package):
version('0.2.1', '348ccf86cf2057872e4451b204fb914c')
extends('python')
- depends_on('py-setuptools')
+ depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py
index d019133585..bbb1e9c13a 100644
--- a/var/spack/repos/builtin/packages/python/package.py
+++ b/var/spack/repos/builtin/packages/python/package.py
@@ -38,16 +38,30 @@ class Python(Package):
homepage = "http://www.python.org"
url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz"
+ version('3.5.2', '3fe8434643a78630c61c6464fe2e7e72')
version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe')
version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36')
- version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b', preferred=True)
+ version('3.4.3', '4281ff86778db65892c05151d5de738d')
+ version('3.3.6', 'cdb3cd08f96f074b3f3994ccb51063e9')
+ version('3.2.6', '23815d82ae706e9b781ca65865353d39')
+ version('3.1.5', '02196d3fc7bc76bdda68aa36b0dd16ab')
+ version('2.7.12', '88d61f82e3616a4be952828b3694109d', preferred=True)
+ version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b')
version('2.7.10', 'd7547558fd673bd9d38e2108c6b42521')
version('2.7.9', '5eebcaa0030dc4061156d3429657fb83')
version('2.7.8', 'd4bca0159acb0b44a781292b5231936f')
extendable = True
- variant('ucs4', default=False, description='Enable UCS4 unicode strings')
+ variant('tk', default=False, description='Provide support for Tkinter')
+ variant('ucs4', default=False, description='Enable UCS4 (wide) unicode strings')
+ # From https://docs.python.org/2/c-api/unicode.html: Python's default
+ # builds use a 16-bit type for Py_UNICODE and store Unicode values
+ # internally as UCS2. It is also possible to build a UCS4 version of Python
+ # (most recent Linux distributions come with UCS4 builds of Python). These
+ # builds then use a 32-bit type for Py_UNICODE and store Unicode data
+ # internally as UCS4. Note that UCS2 and UCS4 Python builds are not binary
+ # compatible.
depends_on("openssl")
depends_on("bzip2")
@@ -55,6 +69,8 @@ class Python(Package):
depends_on("ncurses")
depends_on("sqlite")
depends_on("zlib")
+ depends_on("tk", when="+tk")
+ depends_on("tcl", when="+tk")
def install(self, spec, prefix):
# Need this to allow python build to find the Python installation.
@@ -64,28 +80,42 @@ class Python(Package):
# Rest of install is pretty standard except setup.py needs to
# be able to read the CPPFLAGS and LDFLAGS as it scans for the
# library and headers to build
- cppflags = ' -I'.join([
+ include_dirs = [
spec['openssl'].prefix.include, spec['bzip2'].prefix.include,
spec['readline'].prefix.include, spec['ncurses'].prefix.include,
spec['sqlite'].prefix.include, spec['zlib'].prefix.include
- ])
+ ]
- ldflags = ' -L'.join([
+ library_dirs = [
spec['openssl'].prefix.lib, spec['bzip2'].prefix.lib,
spec['readline'].prefix.lib, spec['ncurses'].prefix.lib,
spec['sqlite'].prefix.lib, spec['zlib'].prefix.lib
- ])
+ ]
+
+ if '+tk' in spec:
+ include_dirs.extend([
+ spec['tk'].prefix.include, spec['tcl'].prefix.include
+ ])
+ library_dirs.extend([
+ spec['tk'].prefix.lib, spec['tcl'].prefix.lib
+ ])
config_args = [
"--prefix={0}".format(prefix),
"--with-threads",
"--enable-shared",
- "CPPFLAGS=-I{0}".format(cppflags),
- "LDFLAGS=-L{0}".format(ldflags)
+ "CPPFLAGS=-I{0}".format(" -I".join(include_dirs)),
+ "LDFLAGS=-L{0}".format(" -L".join(library_dirs))
]
if '+ucs4' in spec:
- config_args.append('--enable-unicode=ucs4')
+ if spec.satisfies('@:2.7'):
+ config_args.append('--enable-unicode=ucs4')
+ elif spec.satisfies('@3.0:3.2'):
+ config_args.append('--with-wide-unicode')
+ elif spec.satisfies('@3.3:'):
+ # https://docs.python.org/3.3/whatsnew/3.3.html
+ raise ValueError('+ucs4 variant not compatible with Python 3.3 and beyond') # NOQA: ignore=E501
if spec.satisfies('@3:'):
config_args.append('--without-ensurepip')
@@ -97,6 +127,25 @@ class Python(Package):
self.filter_compilers(spec, prefix)
+ # TODO: Once better testing support is integrated, add the following tests
+ # https://wiki.python.org/moin/TkInter
+ #
+ # if '+tk' in spec:
+ # env['TK_LIBRARY'] = join_path(spec['tk'].prefix.lib,
+ # 'tk{0}'.format(spec['tk'].version.up_to(2)))
+ # env['TCL_LIBRARY'] = join_path(spec['tcl'].prefix.lib,
+ # 'tcl{0}'.format(spec['tcl'].version.up_to(2)))
+ #
+ # $ python
+ # >>> import _tkinter
+ #
+ # if spec.satisfies('@3:')
+ # >>> import tkinter
+ # >>> tkinter._test()
+ # else:
+ # >>> import Tkinter
+ # >>> Tkinter._test()
+
def filter_compilers(self, spec, prefix):
"""Run after install to tell the configuration files and Makefiles
to use the compilers that Spack built the package with.
@@ -146,7 +195,7 @@ class Python(Package):
extension and any other python extensions it depends on."""
python_paths = []
- for d in extension_spec.traverse():
+ for d in extension_spec.traverse(deptype=nolink, deptype_query='run'):
if d.package.extends(self.spec):
python_paths.append(join_path(d.prefix,
self.site_packages_dir))
diff --git a/var/spack/repos/builtin/packages/qhull/package.py b/var/spack/repos/builtin/packages/qhull/package.py
index 280c9cc12c..f7cbcc2736 100644
--- a/var/spack/repos/builtin/packages/qhull/package.py
+++ b/var/spack/repos/builtin/packages/qhull/package.py
@@ -45,7 +45,7 @@ class Qhull(Package):
# https://github.com/qhull/qhull/pull/5
patch('qhull-iterator.patch', when='@1.0')
- depends_on('cmake')
+ depends_on('cmake', type='build')
def install(self, spec, prefix):
with working_dir('spack-build', create=True):
diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py
index 0c91a5ce87..f33e5c2d0e 100644
--- a/var/spack/repos/builtin/packages/qt/package.py
+++ b/var/spack/repos/builtin/packages/qt/package.py
@@ -60,8 +60,8 @@ class Qt(Package):
# Webkit
# depends_on("gperf")
- # depends_on("flex")
- # depends_on("bison")
+ # depends_on("flex", type='build')
+ # depends_on("bison", type='build')
# depends_on("ruby")
# depends_on("icu4c")
diff --git a/var/spack/repos/builtin/packages/ravel/package.py b/var/spack/repos/builtin/packages/ravel/package.py
index 763ec1b9a2..96692ac7c1 100644
--- a/var/spack/repos/builtin/packages/ravel/package.py
+++ b/var/spack/repos/builtin/packages/ravel/package.py
@@ -33,8 +33,7 @@ class Ravel(Package):
version('1.0.0', 'b25fece58331c2adfcce76c5036485c2')
- # TODO: make this a build dependency
- depends_on('cmake@2.8.9:')
+ depends_on('cmake@2.8.9:', type='build')
depends_on('muster@1.0.1:')
depends_on('otf')
diff --git a/var/spack/repos/builtin/packages/rose/package.py b/var/spack/repos/builtin/packages/rose/package.py
index b8a65e8574..bcd317eb8f 100644
--- a/var/spack/repos/builtin/packages/rose/package.py
+++ b/var/spack/repos/builtin/packages/rose/package.py
@@ -40,9 +40,9 @@ class Rose(Package):
patch('add_spack_compiler_recognition.patch')
- depends_on("autoconf@2.69")
- depends_on("automake@1.14")
- depends_on("libtool@2.4")
+ depends_on("autoconf@2.69", type='build')
+ depends_on("automake@1.14", type='build')
+ depends_on("libtool@2.4", type='build')
depends_on("boost@1.54.0")
depends_on("jdk@8u25-linux-x64")
diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py
index 2f6e42c439..c2bad20c2f 100644
--- a/var/spack/repos/builtin/packages/scotch/package.py
+++ b/var/spack/repos/builtin/packages/scotch/package.py
@@ -45,8 +45,8 @@ class Scotch(Package):
variant('shared', default=True, description='Build a shared version of the library')
variant('metis', default=True, description='Build metis and parmetis wrapper libraries')
- depends_on('flex')
- depends_on('bison')
+ depends_on('flex', type='build')
+ depends_on('bison', type='build')
depends_on('mpi', when='+mpi')
depends_on('zlib', when='+compression')
diff --git a/var/spack/repos/builtin/packages/screen/package.py b/var/spack/repos/builtin/packages/screen/package.py
new file mode 100644
index 0000000000..17335603e6
--- /dev/null
+++ b/var/spack/repos/builtin/packages/screen/package.py
@@ -0,0 +1,59 @@
+##############################################################################
+# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+#
+# This file is part of Spack.
+# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
+# LLNL-CODE-647188
+#
+# For details, see https://github.com/llnl/spack
+# Please also see the LICENSE file for our notice and the LGPL.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License (as
+# published by the Free Software Foundation) version 2.1, February 1999.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
+# conditions of the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##############################################################################
+from spack import *
+
+
+class Screen(Package):
+ """
+ Screen is a full-screen window manager that multiplexes a physical
+ terminal between several processes, typically interactive shells.
+ """
+
+ homepage = "https://www.gnu.org/software/screen/"
+ url = "http://ftp.gnu.org/gnu/screen/screen-4.3.1.tar.gz"
+
+ version('4.3.1', '5bb3b0ff2674e29378c31ad3411170ad')
+ version('4.3.0', 'f76d28eadc4caaf6cdff00685ae6ad46')
+ version('4.2.1', '419a0594e2b25039239af8b90eda7d92')
+ version('4.2.0', 'e5199156a8ac863bbf92495a7638b612')
+ version('4.0.3', '8506fd205028a96c741e4037de6e3c42')
+ version('4.0.2', 'ed68ea9b43d9fba0972cb017a24940a1')
+ version('3.9.15', '0dff6fdc3fbbceabf25a43710fbfe75f')
+ version('3.9.11', '19572f92404995e7b2dea8117204dd67')
+ version('3.9.10', 'bbe271715d1dee038b3cd72d6d2f05fb')
+ version('3.9.9', '9a8b1d6c7438c64b884c4f7d7662afdc')
+ version('3.9.8', '8ddfebe32c2d45410ce89ea9779bb1cf')
+ version('3.9.4', '7de72cd18f7adcdf993ecc6764d0478a')
+ version('3.7.6', '9a353b828d79c3c143109265cae663a7')
+ version('3.7.4', 'c5ab40b068968075e41e25607dfce543')
+ version('3.7.2', '2d6db5de7fb0cf849cc5a6f94203f029')
+ version('3.7.1', '27cdd29318446561ef7c966041cbd2c9')
+
+ depends_on('ncurses')
+
+ def install(self, spec, prefix):
+ configure('--prefix=%s' % prefix)
+ make()
+ make("install")
diff --git a/var/spack/repos/builtin/packages/serf/package.py b/var/spack/repos/builtin/packages/serf/package.py
index ff6fd2da9b..ebca74a3ab 100644
--- a/var/spack/repos/builtin/packages/serf/package.py
+++ b/var/spack/repos/builtin/packages/serf/package.py
@@ -36,7 +36,7 @@ class Serf(Package):
depends_on('apr')
depends_on('apr-util')
- depends_on('scons')
+ depends_on('scons', type='build')
depends_on('expat')
depends_on('openssl')
depends_on('zlib')
diff --git a/var/spack/repos/builtin/packages/spot/package.py b/var/spack/repos/builtin/packages/spot/package.py
index 59535dcc4c..21bb6f03a7 100644
--- a/var/spack/repos/builtin/packages/spot/package.py
+++ b/var/spack/repos/builtin/packages/spot/package.py
@@ -32,7 +32,7 @@ class Spot(Package):
version('1.99.3', 'd53adcb2d0fe7c69f45d4e595a58254e')
- #depends_on("gcc@4.8:")
+ #depends_on("gcc@4.8:", type='build')
depends_on("python@3.2:")
def install(self, spec, prefix):
diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py
index 80d27e149f..a03713397b 100644
--- a/var/spack/repos/builtin/packages/stat/package.py
+++ b/var/spack/repos/builtin/packages/stat/package.py
@@ -39,7 +39,7 @@ class Stat(Package):
depends_on('libdwarf')
depends_on('dyninst')
depends_on('graphlib')
- depends_on('graphviz')
+ depends_on('graphviz', type=alldeps)
depends_on('launchmon')
depends_on('mrnet')
diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py
index 2cc89b843f..a71bfd8bd4 100644
--- a/var/spack/repos/builtin/packages/suite-sparse/package.py
+++ b/var/spack/repos/builtin/packages/suite-sparse/package.py
@@ -32,21 +32,20 @@ class SuiteSparse(Package):
homepage = 'http://faculty.cse.tamu.edu/davis/suitesparse.html'
url = 'http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.1.tar.gz'
- version('4.5.1', 'f0ea9aad8d2d1ffec66a5b6bfeff5319')
version('4.5.3', '8ec57324585df3c6483ad7f556afccbd')
+ version('4.5.1', 'f0ea9aad8d2d1ffec66a5b6bfeff5319')
- # FIXME: (see below)
- # variant('tbb', default=True, description='Build with Intel TBB')
+ variant('tbb', default=True, description='Build with Intel TBB')
depends_on('blas')
depends_on('lapack')
depends_on('metis@5.1.0', when='@4.5.1:')
- # FIXME:
# in @4.5.1. TBB support in SPQR seems to be broken as TBB-related linkng
# flags does not seem to be used, which leads to linking errors on Linux.
- # Try re-enabling in future versions.
- # depends_on('tbb', when='+tbb')
+ depends_on('tbb', when='@4.5.3:+tbb')
+
+ patch('tbb_453.patch', when='@4.5.3')
def install(self, spec, prefix):
# The build system of SuiteSparse is quite old-fashioned.
@@ -73,20 +72,24 @@ class SuiteSparse(Package):
])
# Intel TBB in SuiteSparseQR
- if '+tbb' in spec:
+ if 'tbb' in spec:
make_args.extend([
'SPQR_CONFIG=-DHAVE_TBB',
'TBB=-L%s -ltbb' % spec['tbb'].prefix.lib,
])
- # BLAS arguments require path to libraries
- # FIXME: (blas/lapack always provide libblas and liblapack as aliases)
+ # Make sure Spack's Blas/Lapack is used. Otherwise System's
+ # Blas/Lapack might be picked up.
+ blas = to_link_flags(spec['blas'].blas_shared_lib)
+ lapack = to_link_flags(spec['lapack'].lapack_shared_lib)
if '@4.5.1' in spec:
# adding -lstdc++ is clearly an ugly way to do this, but it follows
# with the TCOV path of SparseSuite 4.5.1's Suitesparse_config.mk
- make_args.extend([
- 'BLAS=-lblas -lstdc++',
- 'LAPACK=-llapack'
- ])
+ blas += ' -lstdc++'
+
+ make_args.extend([
+ 'BLAS=%s' % blas,
+ 'LAPACK=%s' % lapack
+ ])
make('install', *make_args)
diff --git a/var/spack/repos/builtin/packages/suite-sparse/tbb_453.patch b/var/spack/repos/builtin/packages/suite-sparse/tbb_453.patch
new file mode 100644
index 0000000000..70241ed017
--- /dev/null
+++ b/var/spack/repos/builtin/packages/suite-sparse/tbb_453.patch
@@ -0,0 +1,13 @@
+diff --git a/SPQR/Lib/Makefile b/SPQR/Lib/Makefile
+index eaade58..d0de852 100644
+--- a/SPQR/Lib/Makefile
++++ b/SPQR/Lib/Makefile
+@@ -13,7 +13,7 @@ ccode: all
+ include ../../SuiteSparse_config/SuiteSparse_config.mk
+
+ # SPQR depends on CHOLMOD, AMD, COLAMD, LAPACK, the BLAS and SuiteSparse_config
+-LDLIBS += -lamd -lcolamd -lcholmod -lsuitesparseconfig $(LAPACK) $(BLAS)
++LDLIBS += -lamd -lcolamd -lcholmod -lsuitesparseconfig $(TBB) $(LAPACK) $(BLAS)
+
+ # compile and install in SuiteSparse/lib
+ library:
diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py
index c55198a850..e52b90eb8a 100644
--- a/var/spack/repos/builtin/packages/sundials/package.py
+++ b/var/spack/repos/builtin/packages/sundials/package.py
@@ -42,6 +42,7 @@ class Sundials(Package):
variant('openmp', default=False, description='Enable OpenMP support')
variant('pthread', default=True, description='Enable POSIX threads support')
+ depends_on('cmake', type='build')
depends_on('mpi', when='+mpi')
depends_on('blas', when='+lapack')
depends_on('lapack', when='+lapack')
diff --git a/var/spack/repos/builtin/packages/swiftsim/package.py b/var/spack/repos/builtin/packages/swiftsim/package.py
index 42e8fb466a..620d658a10 100644
--- a/var/spack/repos/builtin/packages/swiftsim/package.py
+++ b/var/spack/repos/builtin/packages/swiftsim/package.py
@@ -43,10 +43,10 @@ class Swiftsim(Package):
variant('mpi', default=True, description='Enable distributed memory parallelism')
# Build dependencies
- depends_on('autoconf')
- depends_on('automake')
- depends_on('libtool')
- depends_on('m4')
+ depends_on('autoconf', type='build')
+ depends_on('automake', type='build')
+ depends_on('libtool', type='build')
+ depends_on('m4', type='build')
# link-time / run-time dependencies
depends_on('mpi', when='+mpi')
depends_on('metis')
@@ -71,6 +71,7 @@ class Swiftsim(Package):
# Configure and install
options = ['--prefix=%s' % prefix,
'--enable-mpi' if '+mpi' in spec else '--disable-mpi',
+ '--with-metis={0}'.format(spec['metis'].prefix),
'--enable-optimization']
configure(*options)
make()
diff --git a/var/spack/repos/builtin/packages/task/package.py b/var/spack/repos/builtin/packages/task/package.py
index dc52c4f9f6..8c3b412f48 100644
--- a/var/spack/repos/builtin/packages/task/package.py
+++ b/var/spack/repos/builtin/packages/task/package.py
@@ -31,6 +31,7 @@ class Task(Package):
version('2.4.4', '517450c4a23a5842df3e9905b38801b3')
+ depends_on('cmake', type='build')
depends_on("gnutls")
depends_on("libuuid")
# depends_on("gcc@4.8:")
diff --git a/var/spack/repos/builtin/packages/taskd/package.py b/var/spack/repos/builtin/packages/taskd/package.py
index 8a022b4fe9..1d7f9ed49e 100644
--- a/var/spack/repos/builtin/packages/taskd/package.py
+++ b/var/spack/repos/builtin/packages/taskd/package.py
@@ -32,6 +32,7 @@ class Taskd(Package):
version('1.1.0', 'ac855828c16f199bdbc45fbc227388d0')
+ depends_on('cmake', type='build')
depends_on("libuuid")
depends_on("gnutls")
diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py
index a4d8b515bb..ef922314d8 100644
--- a/var/spack/repos/builtin/packages/tcl/package.py
+++ b/var/spack/repos/builtin/packages/tcl/package.py
@@ -24,6 +24,7 @@
##############################################################################
from spack import *
+
class Tcl(Package):
"""Tcl (Tool Command Language) is a very powerful but easy to
learn dynamic programming language, suitable for a very wide
@@ -34,9 +35,6 @@ class Tcl(Package):
extensible."""
homepage = "http://www.tcl.tk"
- def url_for_version(self, version):
- return 'http://prdownloads.sourceforge.net/tcl/tcl%s-src.tar.gz' % version
-
version('8.6.5', '0e6426a4ca9401825fbc6ecf3d89a326')
version('8.6.4', 'd7cbb91f1ded1919370a30edd1534304')
version('8.6.3', 'db382feca91754b7f93da16dc4cdad1f')
@@ -44,8 +42,18 @@ class Tcl(Package):
depends_on('zlib')
+ def url_for_version(self, version):
+ base_url = 'http://prdownloads.sourceforge.net/tcl'
+ return '{0}/tcl{1}-src.tar.gz'.format(base_url, version)
+
+ def setup_environment(self, spack_env, env):
+ # When using Tkinter from within spack provided python+tk, python
+ # will not be able to find Tcl/Tk unless TCL_LIBRARY is set.
+ env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format(
+ self.spec.version.up_to(2))))
+
def install(self, spec, prefix):
with working_dir('unix'):
- configure("--prefix=%s" % prefix)
+ configure("--prefix={0}".format(prefix))
make()
make("install")
diff --git a/var/spack/repos/builtin/packages/tetgen/package.py b/var/spack/repos/builtin/packages/tetgen/package.py
index c301a5b4e5..97aa68be65 100644
--- a/var/spack/repos/builtin/packages/tetgen/package.py
+++ b/var/spack/repos/builtin/packages/tetgen/package.py
@@ -38,9 +38,7 @@ class Tetgen(Package):
version('1.4.3', 'd6a4bcdde2ac804f7ec66c29dcb63c18')
version('1.5.0', '3b9fd9cdec121e52527b0308f7aad5c1', url='http://www.tetgen.org/1.5/src/tetgen1.5.0.tar.gz')
- # TODO: Make this a build dependency once build dependencies are supported
- # (see: https://github.com/LLNL/spack/pull/378).
- depends_on('cmake@2.8.7:', when='@1.5.0:')
+ depends_on('cmake@2.8.7:', when='@1.5.0:', type='build')
def install(self, spec, prefix):
make('tetgen', 'tetlib')
diff --git a/var/spack/repos/builtin/packages/the_platinum_searcher/package.py b/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
index 9c9a66cdef..0d2c2918c4 100644
--- a/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
+++ b/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
@@ -12,7 +12,7 @@ class ThePlatinumSearcher(Package):
version('head', go=package)
- extends("go")
+ extends("go", deptypes='build')
def install(self, spec, prefix):
env = os.environ
diff --git a/var/spack/repos/builtin/packages/the_silver_searcher/package.py b/var/spack/repos/builtin/packages/the_silver_searcher/package.py
index e289b6d783..c98e964efa 100644
--- a/var/spack/repos/builtin/packages/the_silver_searcher/package.py
+++ b/var/spack/repos/builtin/packages/the_silver_searcher/package.py
@@ -24,16 +24,18 @@
##############################################################################
from spack import *
+
class TheSilverSearcher(Package):
"""Fast recursive grep alternative"""
homepage = "http://geoff.greer.fm/ag/"
- url = "http://geoff.greer.fm/ag/releases/the_silver_searcher-0.30.0.tar.gz"
+ url = "http://geoff.greer.fm/ag/releases/the_silver_searcher-0.32.0.tar.gz"
+ version('0.32.0', '3fdfd5836924246073d5344257a06823')
version('0.30.0', '95e2e7859fab1156c835aff7413481db')
depends_on('pcre')
depends_on('xz')
- depends_on('pkg-config')
+ depends_on('pkg-config', type='build')
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
diff --git a/var/spack/repos/builtin/packages/thrift/package.py b/var/spack/repos/builtin/packages/thrift/package.py
index 6d834c6321..025ee2b885 100644
--- a/var/spack/repos/builtin/packages/thrift/package.py
+++ b/var/spack/repos/builtin/packages/thrift/package.py
@@ -41,12 +41,12 @@ class Thrift(Package):
variant('python', default=True, description="Build support for python")
depends_on('jdk')
- depends_on('autoconf')
- depends_on('automake')
- depends_on('libtool')
+ depends_on('autoconf', type='build')
+ depends_on('automake', type='build')
+ depends_on('libtool', type='build')
depends_on('boost@1.53:')
- depends_on('bison')
- depends_on('flex')
+ depends_on('bison', type='build')
+ depends_on('flex', type='build')
depends_on('openssl')
# Variant dependencies
diff --git a/var/spack/repos/builtin/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py
index 330e1c77f5..894d3af6cc 100644
--- a/var/spack/repos/builtin/packages/tk/package.py
+++ b/var/spack/repos/builtin/packages/tk/package.py
@@ -24,6 +24,7 @@
##############################################################################
from spack import *
+
class Tk(Package):
"""Tk is a graphical user interface toolkit that takes developing
desktop applications to a higher level than conventional
@@ -33,16 +34,24 @@ class Tk(Package):
and more."""
homepage = "http://www.tcl.tk"
- def url_for_version(self, version):
- return "http://prdownloads.sourceforge.net/tcl/tk%s-src.tar.gz" % version
-
+ version('8.6.5', '11dbbd425c3e0201f20d6a51482ce6c4')
version('8.6.3', '85ca4dbf4dcc19777fd456f6ee5d0221')
depends_on("tcl")
+ def url_for_version(self, version):
+ base_url = "http://prdownloads.sourceforge.net/tcl"
+ return "{0}/tk{1}-src.tar.gz".format(base_url, version)
+
+ def setup_environment(self, spack_env, env):
+ # When using Tkinter from within spack provided python+tk, python
+ # will not be able to find Tcl/Tk unless TK_LIBRARY is set.
+ env.set('TK_LIBRARY', join_path(self.prefix.lib, 'tk{0}'.format(
+ self.spec.version.up_to(2))))
+
def install(self, spec, prefix):
with working_dir('unix'):
- configure("--prefix=%s" % prefix,
- "--with-tcl=%s" % spec['tcl'].prefix.lib)
+ configure("--prefix={0}".format(prefix),
+ "--with-tcl={0}".format(spec['tcl'].prefix.lib))
make()
make("install")
diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py
index 3a53ac5c01..77589bb8f9 100644
--- a/var/spack/repos/builtin/packages/trilinos/package.py
+++ b/var/spack/repos/builtin/packages/trilinos/package.py
@@ -68,6 +68,8 @@ class Trilinos(Package):
variant('debug', default=False, description='Builds a debug version of the libraries')
variant('boost', default=True, description='Compile with Boost')
+ depends_on('cmake', type='build')
+
# Everything should be compiled with -fpic
depends_on('blas')
depends_on('lapack')
@@ -116,6 +118,7 @@ class Trilinos(Package):
options.extend(std_cmake_args)
mpi_bin = spec['mpi'].prefix.bin
+ # Note: -DXYZ_LIBRARY_NAMES= needs semicolon separated list of names
options.extend([
'-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON',
'-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=ON',
@@ -129,10 +132,12 @@ class Trilinos(Package):
'-DTPL_ENABLE_MPI:BOOL=ON',
'-DMPI_BASE_DIR:PATH=%s' % spec['mpi'].prefix,
'-DTPL_ENABLE_BLAS=ON',
- '-DBLAS_LIBRARY_NAMES=blas', # FIXME: don't hardcode names
+ '-DBLAS_LIBRARY_NAMES=%s' % to_lib_name(
+ spec['blas'].blas_shared_lib),
'-DBLAS_LIBRARY_DIRS=%s' % spec['blas'].prefix.lib,
'-DTPL_ENABLE_LAPACK=ON',
- '-DLAPACK_LIBRARY_NAMES=lapack',
+ '-DLAPACK_LIBRARY_NAMES=%s' % to_lib_name(
+ spec['lapack'].lapack_shared_lib),
'-DLAPACK_LIBRARY_DIRS=%s' % spec['lapack'].prefix,
'-DTrilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=ON',
'-DTrilinos_ENABLE_CXX11:BOOL=ON',
diff --git a/var/spack/repos/builtin/packages/vim/package.py b/var/spack/repos/builtin/packages/vim/package.py
index f66c20894b..e0dfb64879 100644
--- a/var/spack/repos/builtin/packages/vim/package.py
+++ b/var/spack/repos/builtin/packages/vim/package.py
@@ -60,7 +60,7 @@ class Vim(Package):
depends_on('ruby', when='+ruby')
variant('cscope', default=False, description="build with cscope support")
- depends_on('cscope', when='+cscope')
+ depends_on('cscope', when='+cscope', type='run')
variant('gui', default=False, description="build with gui (gvim)")
# virtual dependency?
diff --git a/var/spack/repos/builtin/packages/vtk/package.py b/var/spack/repos/builtin/packages/vtk/package.py
index d2296dbc26..5c196b5ea8 100644
--- a/var/spack/repos/builtin/packages/vtk/package.py
+++ b/var/spack/repos/builtin/packages/vtk/package.py
@@ -37,6 +37,7 @@ class Vtk(Package):
version('6.1.0', '25e4dfb3bad778722dcaec80cd5dab7d')
+ depends_on('cmake', type='build')
depends_on("qt")
# VTK7 defaults to OpenGL2 rendering backend