From 847703c13d0fd69be0b06d355308c47f4a060e66 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 25 Oct 2019 21:49:27 -0700 Subject: [PATCH] tutorial: move tutorial to standalone site (#13450) * docs: add a spack environment for building the docs * docs: remove tutorial and link to spack-tutorial.readthedocs.io The tutorial now has its own standalone website, versioned by instances of the tutorial. Link to that instead of versioning it directly with Spack. --- lib/spack/docs/.gitignore | 2 + lib/spack/docs/build_systems/intelpackage.rst | 10 +- lib/spack/docs/conf.py | 2 +- lib/spack/docs/index.rst | 2 +- lib/spack/docs/spack.yaml | 19 + lib/spack/docs/tutorial.rst | 75 - lib/spack/docs/tutorial/examples/0.package.py | 39 - lib/spack/docs/tutorial/examples/1.package.py | 24 - lib/spack/docs/tutorial/examples/2.package.py | 25 - lib/spack/docs/tutorial/examples/3.package.py | 25 - lib/spack/docs/tutorial/examples/4.package.py | 27 - lib/spack/docs/tutorial/examples/5.package.py | 42 - .../tutorial/examples/Autotools/0.package.py | 27 - .../tutorial/examples/Autotools/1.package.py | 32 - .../docs/tutorial/examples/Cmake/0.package.py | 41 - .../docs/tutorial/examples/Cmake/1.package.py | 23 - .../docs/tutorial/examples/Cmake/2.package.py | 33 - .../tutorial/examples/Makefile/0.package.py | 26 - .../tutorial/examples/Makefile/1.package.py | 27 - .../tutorial/examples/Makefile/2.package.py | 25 - .../tutorial/examples/Makefile/3.package.py | 36 - .../tutorial/examples/PyPackage/0.package.py | 41 - .../tutorial/examples/PyPackage/1.package.py | 32 - .../tutorial/sc16-tutorial-slide-preview.png | Bin 71641 -> 0 bytes .../docs/tutorial_advanced_packaging.rst | 515 ----- lib/spack/docs/tutorial_basics.rst | 1736 ----------------- lib/spack/docs/tutorial_buildsystems.rst | 807 -------- lib/spack/docs/tutorial_configuration.rst | 951 --------- lib/spack/docs/tutorial_environments.rst | 815 -------- lib/spack/docs/tutorial_modules.rst | 1575 --------------- lib/spack/docs/tutorial_packaging.rst | 559 ------ 31 files changed, 28 insertions(+), 7565 deletions(-) create mode 100644 lib/spack/docs/spack.yaml delete mode 100644 lib/spack/docs/tutorial.rst delete mode 100644 lib/spack/docs/tutorial/examples/0.package.py delete mode 100644 lib/spack/docs/tutorial/examples/1.package.py delete mode 100644 lib/spack/docs/tutorial/examples/2.package.py delete mode 100644 lib/spack/docs/tutorial/examples/3.package.py delete mode 100644 lib/spack/docs/tutorial/examples/4.package.py delete mode 100644 lib/spack/docs/tutorial/examples/5.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Autotools/0.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Autotools/1.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Cmake/0.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Cmake/1.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Cmake/2.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Makefile/0.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Makefile/1.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Makefile/2.package.py delete mode 100644 lib/spack/docs/tutorial/examples/Makefile/3.package.py delete mode 100644 lib/spack/docs/tutorial/examples/PyPackage/0.package.py delete mode 100644 lib/spack/docs/tutorial/examples/PyPackage/1.package.py delete mode 100644 lib/spack/docs/tutorial/sc16-tutorial-slide-preview.png delete mode 100644 lib/spack/docs/tutorial_advanced_packaging.rst delete mode 100644 lib/spack/docs/tutorial_basics.rst delete mode 100644 lib/spack/docs/tutorial_buildsystems.rst delete mode 100644 lib/spack/docs/tutorial_configuration.rst delete mode 100644 lib/spack/docs/tutorial_environments.rst delete mode 100644 lib/spack/docs/tutorial_modules.rst delete mode 100644 lib/spack/docs/tutorial_packaging.rst diff --git a/lib/spack/docs/.gitignore b/lib/spack/docs/.gitignore index 0b6258af509..1624dfeaeab 100644 --- a/lib/spack/docs/.gitignore +++ b/lib/spack/docs/.gitignore @@ -3,3 +3,5 @@ command_index.rst spack*.rst llnl*.rst _build +.spack-env +spack.lock diff --git a/lib/spack/docs/build_systems/intelpackage.rst b/lib/spack/docs/build_systems/intelpackage.rst index 30c567373e0..f7d975899e9 100644 --- a/lib/spack/docs/build_systems/intelpackage.rst +++ b/lib/spack/docs/build_systems/intelpackage.rst @@ -120,7 +120,7 @@ version numbers seen with most other Spack packages. For example, we have: ... Preferred version: professional.2018.3 http:... - + Safe versions: professional.2018.3 http:... ... @@ -728,7 +728,7 @@ For packages that contain a compiler, follow `the previous section .. code-block:: console - $ spack install intel-mpi@2018.3.199 + $ spack install intel-mpi@2018.3.199 $ spack install intel-mpi@2018.3.199 %intel@18 4. To prepare the new packages for use with client packages, @@ -802,7 +802,7 @@ by one of the following means: Configure the order of compilers in the appropriate ``packages.yaml`` file, under either an ``all:`` or client-package-specific entry, in a ``compiler:`` list. Consult the Spack documentation for - :ref:`Configuring Package Preferences ` + `Configuring Package Preferences `_ and :ref:`Concretization Preferences `. @@ -851,7 +851,7 @@ client packages, edit the ``packages.yaml`` file. Customize, either in the the virtual packages and whose values are the Spack specs that satisfy the virtual package, in order of decreasing preference. To learn more about the ``providers:`` settings, see the Spack tutorial for -:ref:`Configuring Package Preferences ` +`Configuring Package Preferences `_ and the section :ref:`Concretization Preferences `. @@ -972,7 +972,7 @@ a *virtual* ``mkl`` package is declared in Spack. .. code-block:: python self.spec['blas'].headers.include_flags - + and to generate linker options (``-L -llibname ...``), use the same as above, .. code-block:: python diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index cacbbb3a412..e5305a93175 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -159,7 +159,7 @@ def setup(sphinx): # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build', '_spack_root'] +exclude_patterns = ['_build', '_spack_root', '.spack-env'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 5c93285cbbf..48af67982aa 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -55,7 +55,7 @@ or refer to the full manual below. getting_started basic_usage workflows - tutorial + Tutorial: Spack 101 known_issues .. toctree:: diff --git a/lib/spack/docs/spack.yaml b/lib/spack/docs/spack.yaml new file mode 100644 index 00000000000..bade961fce4 --- /dev/null +++ b/lib/spack/docs/spack.yaml @@ -0,0 +1,19 @@ +# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +# +# These are requirements for building the documentation. You can run +# these commands in this directory to install Sphinx and its plugins, +# then build the docs: +# +# spack install +# spack env activate . +# make +# +spack: + specs: + - py-sphinx + - py-sphinxcontrib-programoutput + - py-sphinx-rtd-theme diff --git a/lib/spack/docs/tutorial.rst b/lib/spack/docs/tutorial.rst deleted file mode 100644 index 4ece87ade00..00000000000 --- a/lib/spack/docs/tutorial.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _spack-101: - -============================= -Tutorial: Spack 101 -============================= - -This is a full-day introduction to Spack with lectures and live demos. -It was last presented at the `Practice and Experience in Advanced -Research Computing Conference (PEARC19) -`_ on July 31, 2019. - -You can use these materials to teach a course on Spack at your own site, -or you can just skip ahead and read the live demo scripts to see how -Spack is used in practice. - -.. _sc16-slides: - -.. rubric:: Slides - -.. figure:: tutorial/sc16-tutorial-slide-preview.png - :target: https://spack.io/slides/spack-pearc19-tutorial-slides.pdf - :height: 72px - :align: left - :alt: Slide Preview - -`Download Slides `_. - -**Full citation:** Levi Baber, Gregory Becker, Adam J. Stewart, and Todd -Gamblin. Managing HPC Software Complexity with Spack. Tutorial presented -at the Practice and Experience in Advanced Research Computing Conference -(PEARC19). July 31, 2019. Chicago, IL, USA. - -.. _sc16-live-demos: - -.. rubric:: Live Demos - -We provide scripts that take you step-by-step through basic Spack tasks. -They correspond to sections in the slides above. You can use one of the -following methods to run through the scripts: - - 1. We provide the `spack/tutorial - `_ container image on - Docker Hub that you can use to do the tutorial on your local - machine. You can invoke ``docker run -it spack/tutorial`` to start - using the container. - - 2. When we host the tutorial, we also provision VM instances in `AWS - `_, so that users who are unfamiliar with - Docker can simply log into a VPM to do the demo exercises. - -You should now be ready to run through our demo scripts: - - 1. :ref:`basics-tutorial` - 2. :ref:`configs-tutorial` - 3. :ref:`packaging-tutorial` - 4. :ref:`environments-tutorial` - 5. :ref:`modules-tutorial` - 6. :ref:`build-systems-tutorial` - 7. :ref:`advanced-packaging-tutorial` - -Full contents: - -.. toctree:: - tutorial_basics - tutorial_configuration - tutorial_packaging - tutorial_environments - tutorial_modules - tutorial_buildsystems - tutorial_advanced_packaging diff --git a/lib/spack/docs/tutorial/examples/0.package.py b/lib/spack/docs/tutorial/examples/0.package.py deleted file mode 100644 index 990ba7d3d87..00000000000 --- a/lib/spack/docs/tutorial/examples/0.package.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -# -# This is a template package file for Spack. We've put "FIXME" -# next to all the things you'll want to change. Once you've handled -# them, you can save this file and test your package like this: -# -# spack install mpileaks -# -# You can edit this file again by typing: -# -# spack edit mpileaks -# -# See the Spack documentation for more information on packaging. -# If you submit this package back to Spack as a pull request, -# please first remove this boilerplate and all FIXME comments. -# -from spack import * - - -class Mpileaks(Package): - """FIXME: Put a proper description of your package here.""" - - # FIXME: Add a proper url for your package's homepage here. - homepage = "http://www.example.com" - url = "https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', sha256='2e34cc4505556d1c1f085758e26f2f8eea0972db9382f051b2dcfb1d7d9e1825') - - # FIXME: Add dependencies if required. - # depends_on('foo') - - def install(self, spec, prefix): - # FIXME: Unknown build system - make() - make('install') diff --git a/lib/spack/docs/tutorial/examples/1.package.py b/lib/spack/docs/tutorial/examples/1.package.py deleted file mode 100644 index f2d515fa4a4..00000000000 --- a/lib/spack/docs/tutorial/examples/1.package.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(Package): - """Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/LLNL/mpileaks" - url = "https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', sha256='2e34cc4505556d1c1f085758e26f2f8eea0972db9382f051b2dcfb1d7d9e1825') - - # FIXME: Add dependencies if required. - # depends_on('foo') - - def install(self, spec, prefix): - # FIXME: Unknown build system - make() - make('install') diff --git a/lib/spack/docs/tutorial/examples/2.package.py b/lib/spack/docs/tutorial/examples/2.package.py deleted file mode 100644 index d0f1e6d0626..00000000000 --- a/lib/spack/docs/tutorial/examples/2.package.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(Package): - """Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/LLNL/mpileaks" - url = "https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', sha256='2e34cc4505556d1c1f085758e26f2f8eea0972db9382f051b2dcfb1d7d9e1825') - - depends_on('mpi') - depends_on('adept-utils') - depends_on('callpath') - - def install(self, spec, prefix): - # FIXME: Unknown build system - make() - make('install') diff --git a/lib/spack/docs/tutorial/examples/3.package.py b/lib/spack/docs/tutorial/examples/3.package.py deleted file mode 100644 index 05fd7aa00a2..00000000000 --- a/lib/spack/docs/tutorial/examples/3.package.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(Package): - """Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/LLNL/mpileaks" - url = "https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', sha256='2e34cc4505556d1c1f085758e26f2f8eea0972db9382f051b2dcfb1d7d9e1825') - - depends_on('mpi') - depends_on('adept-utils') - depends_on('callpath') - - def install(self, spec, prefix): - configure() - make() - make('install') diff --git a/lib/spack/docs/tutorial/examples/4.package.py b/lib/spack/docs/tutorial/examples/4.package.py deleted file mode 100644 index 626e7d3fec1..00000000000 --- a/lib/spack/docs/tutorial/examples/4.package.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(Package): - """Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/LLNL/mpileaks" - url = "https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', sha256='2e34cc4505556d1c1f085758e26f2f8eea0972db9382f051b2dcfb1d7d9e1825') - - depends_on('mpi') - depends_on('adept-utils') - depends_on('callpath') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix), - '--with-adept-utils={0}'.format(spec['adept-utils'].prefix), - '--with-callpath={0}'.format(spec['callpath'].prefix)) - make() - make('install') diff --git a/lib/spack/docs/tutorial/examples/5.package.py b/lib/spack/docs/tutorial/examples/5.package.py deleted file mode 100644 index 9a1dec20792..00000000000 --- a/lib/spack/docs/tutorial/examples/5.package.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(Package): - """Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/LLNL/mpileaks" - url = "https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', sha256='2e34cc4505556d1c1f085758e26f2f8eea0972db9382f051b2dcfb1d7d9e1825') - - variant('stackstart', values=int, default=0, - description='Specify the number of stack frames to truncate') - - depends_on('mpi') - depends_on('adept-utils') - depends_on('callpath') - - def install(self, spec, prefix): - stackstart = int(spec.variants['stackstart'].value) - - args = [ - '--prefix={0}'.format(prefix), - '--with-adept-utils={0}'.format(spec['adept-utils'].prefix), - '--with-callpath={0}'.format(spec['callpath'].prefix), - ] - - if stackstart: - args.extend([ - '--with-stack-start-c={0}'.format(stackstart), - '--with-stack-start-fortran={0}'.format(stackstart) - ]) - - configure(*args) - make() - make('install') diff --git a/lib/spack/docs/tutorial/examples/Autotools/0.package.py b/lib/spack/docs/tutorial/examples/Autotools/0.package.py deleted file mode 100644 index 213965e5c63..00000000000 --- a/lib/spack/docs/tutorial/examples/Autotools/0.package.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(AutotoolsPackage): - """Tool to detect and report leaked MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/hpc/mpileaks" - url = "https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', '8838c574b39202a57d7c2d68692718aa') - - depends_on("mpi") - depends_on("adept-utils") - depends_on("callpath") - - def install(self, spec, prefix): - configure("--prefix=" + prefix, - "--with-adept-utils=" + spec['adept-utils'].prefix, - "--with-callpath=" + spec['callpath'].prefix) - make() - make("install") diff --git a/lib/spack/docs/tutorial/examples/Autotools/1.package.py b/lib/spack/docs/tutorial/examples/Autotools/1.package.py deleted file mode 100644 index 639f1305960..00000000000 --- a/lib/spack/docs/tutorial/examples/Autotools/1.package.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Mpileaks(AutotoolsPackage): - """Tool to detect and report leaked MPI objects like MPI_Requests and - MPI_Datatypes.""" - - homepage = "https://github.com/hpc/mpileaks" - url = "https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz" - - version('1.0', '8838c574b39202a57d7c2d68692718aa') - - variant("stackstart", values=int, default=0, - description="Specify the number of stack frames to truncate") - - depends_on("mpi") - depends_on("adept-utils") - depends_on("callpath") - - def configure_args(self): - stackstart = int(self.spec.variants['stackstart'].value) - args = ["--with-adept-utils=" + spec['adept-utils'].prefix, - "--with-callpath=" + spec['callpath'].prefix] - if stackstart: - args.extend(['--with-stack-start-c=%s' % stackstart, - '--with-stack-start-fortran=%s' % stackstart]) - return args diff --git a/lib/spack/docs/tutorial/examples/Cmake/0.package.py b/lib/spack/docs/tutorial/examples/Cmake/0.package.py deleted file mode 100644 index b8c96a19293..00000000000 --- a/lib/spack/docs/tutorial/examples/Cmake/0.package.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -# -# This is a template package file for Spack. We've put "FIXME" -# next to all the things you'll want to change. Once you've handled -# them, you can save this file and test your package like this: -# -# spack install callpath -# -# You can edit this file again by typing: -# -# spack edit callpath -# -# See the Spack documentation for more information on packaging. -# If you submit this package back to Spack as a pull request, -# please first remove this boilerplate and all FIXME comments. -# -from spack import * - - -class Callpath(CMakePackage): - """FIXME: Put a proper description of your package here.""" - - # FIXME: Add a proper url for your package's homepage here. - homepage = "http://www.example.com" - url = "https://github.com/llnl/callpath/archive/v1.0.1.tar.gz" - - version('1.0.3', 'c89089b3f1c1ba47b09b8508a574294a') - - # FIXME: Add dependencies if required. - # depends_on('foo') - - def cmake_args(self): - # FIXME: Add arguments other than - # FIXME: CMAKE_INSTALL_PREFIX and CMAKE_BUILD_TYPE - # FIXME: If not needed delete this function - args = [] - return args diff --git a/lib/spack/docs/tutorial/examples/Cmake/1.package.py b/lib/spack/docs/tutorial/examples/Cmake/1.package.py deleted file mode 100644 index 8a0d9d0e822..00000000000 --- a/lib/spack/docs/tutorial/examples/Cmake/1.package.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Callpath(CMakePackage): - """Library for representing callpaths consistently in - distributed-memory performance tools.""" - - homepage = "https://github.com/llnl/callpath" - url = "https://github.com/llnl/callpath/archive/v1.0.3.tar.gz" - - version('1.0.3', 'c89089b3f1c1ba47b09b8508a574294a') - - depends_on("elf", type="link") - depends_on("libdwarf") - depends_on("dyninst") - depends_on("adept-utils") - depends_on("mpi") - depends_on("cmake@2.8:", type="build") diff --git a/lib/spack/docs/tutorial/examples/Cmake/2.package.py b/lib/spack/docs/tutorial/examples/Cmake/2.package.py deleted file mode 100644 index 2b4faca90dd..00000000000 --- a/lib/spack/docs/tutorial/examples/Cmake/2.package.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Callpath(CMakePackage): - """Library for representing callpaths consistently in - distributed-memory performance tools.""" - - homepage = "https://github.com/llnl/callpath" - url = "https://github.com/llnl/callpath/archive/v1.0.3.tar.gz" - - version('1.0.3', 'c89089b3f1c1ba47b09b8508a574294a') - - depends_on("elf", type="link") - depends_on("libdwarf") - depends_on("dyninst") - depends_on("adept-utils") - depends_on("mpi") - depends_on("cmake@2.8:", type="build") - - def cmake_args(self): - args = ["-DCALLPATH_WALKER=dyninst"] - - if self.spec.satisfies("^dyninst@9.3.0:"): - std.flag = self.compiler.cxx_flag - args.append("-DCMAKE_CXX_FLAGS='{0}' -fpermissive'".format( - std_flag)) - - return args diff --git a/lib/spack/docs/tutorial/examples/Makefile/0.package.py b/lib/spack/docs/tutorial/examples/Makefile/0.package.py deleted file mode 100644 index 8ad252f5b39..00000000000 --- a/lib/spack/docs/tutorial/examples/Makefile/0.package.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Bowtie(MakefilePackage): - """FIXME: Put a proper description of your package here.""" - - # FIXME: Add a proper url for your package's homepage here. - homepage = "http://www.example.com" - url = "https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip" - - version('1.2.1.1', 'ec06265730c5f587cd58bcfef6697ddf') - - # FIXME: Add dependencies if required. - # depends_on('foo') - - def edit(self, spec, prefix): - # FIXME: Edit the Makefile if necessary - # FIXME: If not needed delete this function - # makefile = FileFilter('Makefile') - # makefile.filter('CC = .*', 'CC = cc') - return diff --git a/lib/spack/docs/tutorial/examples/Makefile/1.package.py b/lib/spack/docs/tutorial/examples/Makefile/1.package.py deleted file mode 100644 index 16988dc1b04..00000000000 --- a/lib/spack/docs/tutorial/examples/Makefile/1.package.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Bowtie(MakefilePackage): - """Bowtie is an ultrafast, memory efficient short read aligner - for short DNA sequences (reads) from next-gen sequencers.""" - - homepage = "https://sourceforge.net/projects/bowtie-bio/" - url = "https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip" - - version('1.2.1.1', 'ec06265730c5f587cd58bcfef6697ddf') - - variant("tbb", default=False, description="Use Intel thread building block") - - depends_on("tbb", when="+tbb") - - def edit(self, spec, prefix): - # FIXME: Edit the Makefile if necessary - # FIXME: If not needed delete this function - # makefile = FileFilter('Makefile') - # makefile.filter('CC = .*', 'CC = cc') - return diff --git a/lib/spack/docs/tutorial/examples/Makefile/2.package.py b/lib/spack/docs/tutorial/examples/Makefile/2.package.py deleted file mode 100644 index 0973b2028e7..00000000000 --- a/lib/spack/docs/tutorial/examples/Makefile/2.package.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Bowtie(MakefilePackage): - """Bowtie is an ultrafast, memory efficient short read aligner - for short DNA sequences (reads) from next-gen sequencers.""" - - homepage = "https://sourceforge.net/projects/bowtie-bio/" - url = "https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip" - - version('1.2.1.1', 'ec06265730c5f587cd58bcfef6697ddf') - - variant("tbb", default=False, description="Use Intel thread building block") - - depends_on("tbb", when="+tbb") - - def edit(self, spec, prefix): - makefile = FileFilter("Makefile") - makefile.filter('CC= .*', 'CC = ' + env['CC']) - makefile.filter('CXX = .*', 'CXX = ' + env['CXX']) diff --git a/lib/spack/docs/tutorial/examples/Makefile/3.package.py b/lib/spack/docs/tutorial/examples/Makefile/3.package.py deleted file mode 100644 index 6a1942e627f..00000000000 --- a/lib/spack/docs/tutorial/examples/Makefile/3.package.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class Bowtie(MakefilePackage): - """Bowtie is an ultrafast, memory efficient short read aligner - for short DNA sequences (reads) from next-gen sequencers.""" - - homepage = "https://sourceforge.net/projects/bowtie-bio/" - url = "https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip" - - version('1.2.1.1', 'ec06265730c5f587cd58bcfef6697ddf') - - variant("tbb", default=False, description="Use Intel thread building block") - - depends_on("tbb", when="+tbb") - - def edit(self, spec, prefix): - makefile = FileFilter("Makefile") - makefile.filter('CC= .*', 'CC = ' + env['CC']) - makefile.filter('CXX = .*', 'CXX = ' + env['CXX']) - - @property - def build_targets(self): - if "+tbb" in spec: - return [] - else: - return ["NO_TBB=1"] - - @property - def install_targets(self): - return ['prefix={0}'.format(self.prefix), 'install'] diff --git a/lib/spack/docs/tutorial/examples/PyPackage/0.package.py b/lib/spack/docs/tutorial/examples/PyPackage/0.package.py deleted file mode 100644 index 9ad94189d92..00000000000 --- a/lib/spack/docs/tutorial/examples/PyPackage/0.package.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -# -# This is a template package file for Spack. We've put "FIXME" -# next to all the things you'll want to change. Once you've handled -# them, you can save this file and test your package like this: -# -# spack install py-pandas -# -# You can edit this file again by typing: -# -# spack edit py-pandas -# -# See the Spack documentation for more information on packaging. -# If you submit this package back to Spack as a pull request, -# please first remove this boilerplate and all FIXME comments. -# -from spack import * - - -class PyPandas(PythonPackage): - """FIXME: Put a proper description of your package here.""" - - # FIXME: Add a proper url for your package's homepage here. - homepage = "http://www.example.com" - url = "https://pypi.io/packages/source/p/pandas/pandas-0.19.0.tar.gz" - - version('0.19.0', 'bc9bb7188e510b5d44fbdd249698a2c3') - - # FIXME: Add dependencies if required. - # depends_on('py-setuptools', type='build') - # depends_on('py-foo', type=('build', 'run')) - - def build_args(self, spec, prefix): - # FIXME: Add arguments other than --prefix - # FIXME: If not needed delete this function - args = [] - return args diff --git a/lib/spack/docs/tutorial/examples/PyPackage/1.package.py b/lib/spack/docs/tutorial/examples/PyPackage/1.package.py deleted file mode 100644 index 8ac335d4a6e..00000000000 --- a/lib/spack/docs/tutorial/examples/PyPackage/1.package.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack import * - - -class PyPandas(PythonPackage): - """pandas is a Python package providing fast, flexible, and expressive - data structures designed to make working with relational or - labeled data both easy and intuitive. It aims to be the - fundamental high-level building block for doing practical, real - world data analysis in Python. Additionally, it has the broader - goal of becoming the most powerful and flexible open source data - analysis / manipulation tool available in any language. - """ - homepage = "http://pandas.pydata.org/" - url = "https://pypi.io/packages/source/p/pandas/pandas-0.19.0.tar.gz" - - version('0.19.0', 'bc9bb7188e510b5d44fbdd249698a2c3') - version('0.18.0', 'f143762cd7a59815e348adf4308d2cf6') - version('0.16.1', 'fac4f25748f9610a3e00e765474bdea8') - version('0.16.0', 'bfe311f05dc0c351f8955fbd1e296e73') - - depends_on('py-dateutil', type=('build', 'run')) - depends_on('py-numpy', type=('build', 'run')) - depends_on('py-setuptools', type='build') - depends_on('py-cython', type='build') - depends_on('py-pytz', type=('build', 'run')) - depends_on('py-numexpr', type=('build', 'run')) - depends_on('py-bottleneck', type=('build', 'run')) diff --git a/lib/spack/docs/tutorial/sc16-tutorial-slide-preview.png b/lib/spack/docs/tutorial/sc16-tutorial-slide-preview.png deleted file mode 100644 index e7f9b2e323065e8cbdc200ce344d4fd99e145dd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71641 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

Lq? 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 BBF_K- diff --git a/lib/spack/docs/tutorial_advanced_packaging.rst b/lib/spack/docs/tutorial_advanced_packaging.rst deleted file mode 100644 index 876a6e8f70a..00000000000 --- a/lib/spack/docs/tutorial_advanced_packaging.rst +++ /dev/null @@ -1,515 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _advanced-packaging-tutorial: - -============================ -Advanced Topics in Packaging -============================ - -Spack tries to automatically configure packages with information from -dependencies such that all you need to do is to list the dependencies -(i.e., with the ``depends_on`` directive) and the build system (for example -by deriving from :code:`CmakePackage`). - -However, there are many special cases. Often you need to retrieve details -about dependencies to set package-specific configuration options, or to -define package-specific environment variables used by the package's build -system. This tutorial covers how to retrieve build information from -dependencies, and how you can automatically provide important information to -dependents in your package. - ----------------------- -Setup for the tutorial ----------------------- - -.. note:: - - We do not recommend doing this section of the tutorial in a - production Spack instance. - -The tutorial uses custom package definitions with missing sections that -will be filled in during the tutorial. These package definitions are stored -in a separate package repository, which can be enabled with: - -.. code-block:: console - - $ spack repo add --scope=site var/spack/repos/tutorial - -This section of the tutorial may also require a newer version of -gcc. If you have not already installed gcc@7.2.0 and added it to your -configuration, you can do so with: - -.. code-block:: console - - $ spack install gcc@7.2.0 %gcc@5.4.0 - $ spack compiler add --scope=site `spack location -i gcc@7.2.0 %gcc@5.4.0` - -If you are using the tutorial docker image, all dependency packages -will have been installed. Otherwise, to install these packages you can use -the following commands: - -.. code-block:: console - - $ spack install openblas - $ spack install netlib-lapack - $ spack install mpich - -Now, you are ready to set your preferred ``EDITOR`` and continue with -the rest of the tutorial. - -.. note:: - - Several of these packages depend on an MPI implementation. You can use - OpenMPI if you install it from scratch, but this is slow (>10 min.). - A binary cache of MPICH may be provided, in which case you can force - the package to use it and install quickly. All tutorial examples with - packages that depend on MPICH include the spec syntax for building with it - -.. _adv_pkg_tutorial_start: - ---------------------------------------- -Modifying a package's build environment ---------------------------------------- - -Spack sets up several environment variables like ``PATH`` by default to aid in -building a package, but many packages make use of environment variables which -convey specific information about their dependencies (e.g., ``MPICC``). -This section covers how to update your Spack packages so that package-specific -environment variables are defined at build-time. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Set environment variables in dependent packages at build-time -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Dependencies can set environment variables that are required when their -dependents build. For example, when a package depends on a python extension -like py-numpy, Spack's ``python`` package will add it to ``PYTHONPATH`` -so it is available at build time; this is required because the default setup -that spack does is not sufficient for python to import modules. - -Any package can override the -:py:func:`setup_dependent_build_environment ` -method to setup the build environment for a dependent. -This method takes as an argument a :py:class:`EnvironmentModifications ` -object which includes convenience methods to update the environment. For -example, an MPI implementation can set ``MPICC`` for packages that depend on it: - -.. code-block:: python - - def setup_dependent_build_environment(self, env, dependent_spec): - env.set('MPICC', join_path(self.prefix.bin, 'mpicc')) - -In this case packages that depend on ``mpi`` will have ``MPICC`` defined in -their environment when they build. This section is focused on setting up the -build-time environment but it's worth noting that a similar method called -:py:func:`setup_dependent_run_environment ` -can be used to code modifications that will be included in Spack's automatically-generated -module files. - -We can practice by editing the ``mpich`` package to set the ``MPICC`` -environment variable in the build-time environment of dependent packages. - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack edit mpich - -Once you're finished, the method should look like this: - -.. code-block:: python - - def setup_dependent_build_environment(self, env, dependent_spec): - env.set('MPICC', join_path(self.prefix.bin, 'mpicc')) - env.set('MPICXX', join_path(self.prefix.bin, 'mpic++')) - env.set('MPIF77', join_path(self.prefix.bin, 'mpif77')) - env.set('MPIF90', join_path(self.prefix.bin, 'mpif90')) - - env.set('MPICH_CC', spack_cc) - env.set('MPICH_CXX', spack_cxx) - env.set('MPICH_F77', spack_f77) - env.set('MPICH_F90', spack_fc) - env.set('MPICH_FC', spack_fc) - -At this point we can, for instance, install ``netlib-scalapack`` with -``mpich``: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack install netlib-scalapack ^mpich - ... - ==> Created stage in /usr/local/var/spack/stage/netlib-scalapack-2.0.2-km7tsbgoyyywonyejkjoojskhc5knz3z - ==> No patches needed for netlib-scalapack - ==> Building netlib-scalapack [CMakePackage] - ==> Executing phase: 'cmake' - ==> Executing phase: 'build' - ==> Executing phase: 'install' - ==> Successfully installed netlib-scalapack - Fetch: 0.01s. Build: 3m 59.86s. Total: 3m 59.87s. - [+] /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-scalapack-2.0.2-km7tsbgoyyywonyejkjoojskhc5knz3z - - -and double check the environment logs to verify that every variable was -set to the correct value. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Set environment variables in your own package -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Packages can override the -:py:func:`setup_build_environment ` -or the -:py:func:`setup_run_environment ` -methods to modify their own build-time or run-time environment respectively. -An example of a package that overrides both methods is ``qt``: - -.. code-block:: python - - def setup_build_environment(self, env): - env.set('MAKEFLAGS', '-j{0}'.format(make_jobs)) - - def setup_run_environment(self, env): - env.set('QTDIR', self.prefix) - -When ``qt`` builds, ``MAKEFLAGS`` will be defined in the environment. Likewise, when a -module file is created for ``qt`` it will contain commands to define ``QTDIR`` appropriately. - -To contrast with ``qt``'s -:py:func:`setup_dependent_build_environment ` -function: - -.. code-block:: python - - def setup_dependent_build_environment(self, env, dependent_spec): - env.set('QTDIR', self.prefix) - -Let's see how it works by completing the ``elpa`` package: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack edit elpa - -In the end your method should look like: - -.. code-block:: python - - def setup_build_environment(self, env): - spec = self.spec - - env.set('CC', spec['mpi'].mpicc) - env.set('FC', spec['mpi'].mpifc) - env.set('CXX', spec['mpi'].mpicxx) - env.set('SCALAPACK_LDFLAGS', spec['scalapack'].libs.joined()) - - env.append_flags('LDFLAGS', spec['lapack'].libs.search_flags) - env.append_flags('LIBS', spec['lapack'].libs.link_flags) - -At this point it's possible to proceed with the installation of ``elpa ^mpich`` - ------------------------------- -Retrieving library information ------------------------------- - -Although Spack attempts to help packages locate their dependency libraries -automatically (e.g. by setting ``PKG_CONFIG_PATH`` and ``CMAKE_PREFIX_PATH``), -a package may have unique configuration options that are required to locate -libraries. When a package needs information about dependency libraries, the -general approach in Spack is to query the dependencies for the locations of -their libraries and set configuration options accordingly. By default most -Spack packages know how to automatically locate their libraries. This section -covers how to retrieve library information from dependencies and how to locate -libraries when the default logic doesn't work. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Accessing dependency libraries -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you need to access the libraries of a dependency, you can do so -via the ``libs`` property of the spec, for example in the ``arpack-ng`` -package: - -.. code-block:: python - - def install(self, spec, prefix): - lapack_libs = spec['lapack'].libs.joined(';') - blas_libs = spec['blas'].libs.joined(';') - - cmake(*[ - '-DLAPACK_LIBRARIES={0}'.format(lapack_libs), - '-DBLAS_LIBRARIES={0}'.format(blas_libs) - ], '.') - -Note that ``arpack-ng`` is querying virtual dependencies, which Spack -automatically resolves to the installed implementation (e.g. ``openblas`` -for ``blas``). - -We've started work on a package for ``armadillo``. You should open it, -read through the comment that starts with ``# TUTORIAL:`` and complete -the ``cmake_args`` section: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack edit armadillo - -If you followed the instructions in the package, when you are finished your -``cmake_args`` method should look like: - -.. code-block:: python - - def cmake_args(self): - spec = self.spec - - return [ - # ARPACK support - '-DARPACK_LIBRARY={0}'.format(spec['arpack-ng'].libs.joined(";")), - # BLAS support - '-DBLAS_LIBRARY={0}'.format(spec['blas'].libs.joined(";")), - # LAPACK support - '-DLAPACK_LIBRARY={0}'.format(spec['lapack'].libs.joined(";")), - # SuperLU support - '-DSuperLU_INCLUDE_DIR={0}'.format(spec['superlu'].prefix.include), - '-DSuperLU_LIBRARY={0}'.format(spec['superlu'].libs.joined(";")), - # HDF5 support - '-DDETECT_HDF5={0}'.format('ON' if '+hdf5' in spec else 'OFF') - ] - -As you can see, getting the list of libraries that your dependencies provide -is as easy as accessing the their ``libs`` attribute. Furthermore, the interface -remains the same whether you are querying regular or virtual dependencies. - -At this point you can complete the installation of ``armadillo`` using ``openblas`` -as a LAPACK provider (``armadillo ^openblas ^mpich``): - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack install armadillo ^openblas ^mpich - ==> pkg-config is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkg-config-0.29.2-ae2hwm7q57byfbxtymts55xppqwk7ecj - ... - ==> superlu is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/superlu-5.2.1-q2mbtw2wo4kpzis2e2n227ip2fquxrno - ==> Installing armadillo - ==> Using cached archive: /usr/local/var/spack/cache/armadillo/armadillo-8.100.1.tar.xz - ==> Staging archive: /usr/local/var/spack/stage/armadillo-8.100.1-n2eojtazxbku6g4l5izucwwgnpwz77r4/armadillo-8.100.1.tar.xz - ==> Created stage in /usr/local/var/spack/stage/armadillo-8.100.1-n2eojtazxbku6g4l5izucwwgnpwz77r4 - ==> Applied patch undef_linux.patch - ==> Building armadillo [CMakePackage] - ==> Executing phase: 'cmake' - ==> Executing phase: 'build' - ==> Executing phase: 'install' - ==> Successfully installed armadillo - Fetch: 0.01s. Build: 3.96s. Total: 3.98s. - [+] /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/armadillo-8.100.1-n2eojtazxbku6g4l5izucwwgnpwz77r4 - -Hopefully the installation went fine and the code we added expanded to the right list -of semicolon separated libraries (you are encouraged to open ``armadillo``'s -build logs to double check). - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Providing libraries to dependents -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Spack provides a default implementation for ``libs`` which often works -out of the box. A user can write a package definition without having to -implement a ``libs`` property and dependents can retrieve its libraries -as shown in the above section. However, the default implementation assumes that -libraries follow the naming scheme ``lib.so`` (or e.g. -``lib.a`` for static libraries). Packages which don't -follow this naming scheme must implement this function themselves, e.g. -``opencv``: - -.. code-block:: python - - @property - def libs(self): - shared = "+shared" in self.spec - return find_libraries( - "libopencv_*", root=self.prefix, shared=shared, recurse=True - ) - -This issue is common for packages which implement an interface (i.e. -virtual package providers in Spack). If we try to build another version of -``armadillo`` tied to ``netlib-lapack`` (``armadillo ^netlib-lapack ^mpich``) -we'll notice that this time the installation won't complete: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack install armadillo ^netlib-lapack ^mpich - ==> pkg-config is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkg-config-0.29.2-ae2hwm7q57byfbxtymts55xppqwk7ecj - ... - ==> openmpi is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f - ==> Installing arpack-ng - ==> Using cached archive: /usr/local/var/spack/cache/arpack-ng/arpack-ng-3.5.0.tar.gz - ==> Already staged arpack-ng-3.5.0-bloz7cqirpdxj33pg7uj32zs5likz2un in /usr/local/var/spack/stage/arpack-ng-3.5.0-bloz7cqirpdxj33pg7uj32zs5likz2un - ==> No patches needed for arpack-ng - ==> Building arpack-ng [Package] - ==> Executing phase: 'install' - ==> Error: RuntimeError: Unable to recursively locate netlib-lapack libraries in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-lapack-3.6.1-jjfe23wgt7nkjnp2adeklhseg3ftpx6z - RuntimeError: RuntimeError: Unable to recursively locate netlib-lapack libraries in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-lapack-3.6.1-jjfe23wgt7nkjnp2adeklhseg3ftpx6z - - /usr/local/var/spack/repos/builtin/packages/arpack-ng/package.py:105, in install: - 5 options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s/lib' % prefix) - 6 - 7 # Make sure we use Spack's blas/lapack: - >> 8 lapack_libs = spec['lapack'].libs.joined(';') - 9 blas_libs = spec['blas'].libs.joined(';') - 10 - 11 options.extend([ - - See build log for details: - /usr/local/var/spack/stage/arpack-ng-3.5.0-bloz7cqirpdxj33pg7uj32zs5likz2un/arpack-ng-3.5.0/spack-build-out.txt - -Unlike ``openblas`` which provides a library named ``libopenblas.so``, -``netlib-lapack`` provides ``liblapack.so``, so it needs to implement -customized library search logic. Let's edit it: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack edit netlib-lapack - -and follow the instructions in the ``# TUTORIAL:`` comment as before. -What we need to implement is: - -.. code-block:: python - - @property - def lapack_libs(self): - shared = True if '+shared' in self.spec else False - return find_libraries( - 'liblapack', root=self.prefix, shared=shared, recursive=True - ) - -i.e., a property that returns the correct list of libraries for the LAPACK interface. - -We use the name ``lapack_libs`` rather than ``libs`` because -``netlib-lapack`` can also provide ``blas``, and when it does it is provided -as a separate library file. Using this name ensures that when -dependents ask for ``lapack`` libraries, ``netlib-lapack`` will retrieve only -the libraries associated with the ``lapack`` interface. Now we can finally -install ``armadillo ^netlib-lapack ^mpich``: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack install armadillo ^netlib-lapack ^mpich - ... - - ==> Building armadillo [CMakePackage] - ==> Executing phase: 'cmake' - ==> Executing phase: 'build' - ==> Executing phase: 'install' - ==> Successfully installed armadillo - Fetch: 0.01s. Build: 3.75s. Total: 3.76s. - [+] /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/armadillo-8.100.1-sxmpu5an4dshnhickh6ykchyfda7jpyn - -Since each implementation of a virtual package is responsible for locating the -libraries associated with the interfaces it provides, dependents do not need -to include special-case logic for different implementations and for example -need only ask for :code:`spec['blas'].libs`. - ----------------------- -Other Packaging Topics ----------------------- - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Attach attributes to other packages -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Build tools usually also provide a set of executables that can be used -when another package is being installed. Spack gives you the opportunity -to monkey-patch dependent modules and attach attributes to them. This -helps make the packager experience as similar as possible to what would -have been the manual installation of the same package. - -An example here is the ``automake`` package, which overrides -:py:func:`setup_dependent_package `: - -.. code-block:: python - - def setup_dependent_package(self, module, dependent_spec): - # Automake is very likely to be a build dependency, - # so we add the tools it provides to the dependent module - executables = ['aclocal', 'automake'] - for name in executables: - setattr(module, name, self._make_executable(name)) - -so that every other package that depends on it can use directly ``aclocal`` -and ``automake`` with the usual function call syntax of :py:class:`Executable `: - -.. code-block:: python - - aclocal('--force') - -^^^^^^^^^^^^^^^^^^^^^^^ -Extra query parameters -^^^^^^^^^^^^^^^^^^^^^^^ - -An advanced feature of the Spec's build-interface protocol is the support -for extra parameters after the subscript key. In fact, any of the keys used in the query -can be followed by a comma-separated list of extra parameters which can be -inspected by the package receiving the request to fine-tune a response. - -Let's look at an example and try to install ``netcdf ^mpich``: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack install netcdf ^mpich - ==> libsigsegv is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> m4 is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-r5envx3kqctwwflhd4qax4ahqtt6x43a - ... - ==> Error: AttributeError: 'list' object has no attribute 'search_flags' - AttributeError: AttributeError: 'list' object has no attribute 'search_flags' - - /usr/local/var/spack/repos/builtin/packages/netcdf/package.py:207, in configure_args: - 50 # used instead. - 51 hdf5_hl = self.spec['hdf5:hl'] - 52 CPPFLAGS.append(hdf5_hl.headers.cpp_flags) - >> 53 LDFLAGS.append(hdf5_hl.libs.search_flags) - 54 - 55 if '+parallel-netcdf' in self.spec: - 56 config_args.append('--enable-pnetcdf') - - See build log for details: - /usr/local/var/spack/stage/netcdf-4.4.1.1-gk2xxhbqijnrdwicawawcll4t3c7dvoj/netcdf-4.4.1.1/spack-build-out.txt - -We can see from the error that ``netcdf`` needs to know how to link the *high-level interface* -of ``hdf5``, and thus passes the extra parameter ``hl`` after the request to retrieve it. -Clearly the implementation in the ``hdf5`` package is not complete, and we need to fix it: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack edit hdf5 - -If you followed the instructions correctly, the code added to the -``lib`` property should be similar to: - -.. code-block:: python - :emphasize-lines: 1 - - query_parameters = self.spec.last_query.extra_parameters - key = tuple(sorted(query_parameters)) - libraries = query2libraries[key] - shared = '+shared' in self.spec - return find_libraries( - libraries, root=self.prefix, shared=shared, recurse=True - ) - -where we highlighted the line retrieving the extra parameters. Now we can successfully -complete the installation of ``netcdf ^mpich``: - -.. code-block:: console - - root@advanced-packaging-tutorial:/# spack install netcdf ^mpich - ==> libsigsegv is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> m4 is already installed in /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-r5envx3kqctwwflhd4qax4ahqtt6x43a - ... - ==> Installing netcdf - ==> Using cached archive: /usr/local/var/spack/cache/netcdf/netcdf-4.4.1.1.tar.gz - ==> Already staged netcdf-4.4.1.1-gk2xxhbqijnrdwicawawcll4t3c7dvoj in /usr/local/var/spack/stage/netcdf-4.4.1.1-gk2xxhbqijnrdwicawawcll4t3c7dvoj - ==> Already patched netcdf - ==> Building netcdf [AutotoolsPackage] - ==> Executing phase: 'autoreconf' - ==> Executing phase: 'configure' - ==> Executing phase: 'build' - ==> Executing phase: 'install' - ==> Successfully installed netcdf - Fetch: 0.01s. Build: 24.61s. Total: 24.62s. - [+] /usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netcdf-4.4.1.1-gk2xxhbqijnrdwicawawcll4t3c7dvoj diff --git a/lib/spack/docs/tutorial_basics.rst b/lib/spack/docs/tutorial_basics.rst deleted file mode 100644 index 9a6a2074b3c..00000000000 --- a/lib/spack/docs/tutorial_basics.rst +++ /dev/null @@ -1,1736 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _basics-tutorial: - -========================================= -Basic Installation Tutorial -========================================= - -This tutorial will guide you through the process of installing -software using Spack. We will first cover the `spack install` command, -focusing on the power of the spec syntax and the flexibility it gives -to users. We will also cover the `spack find` command for viewing -installed packages and the `spack uninstall` command. Finally, we will -touch on how Spack manages compilers, especially as it relates to -using Spack-built compilers within Spack. We will include full output -from all of the commands demonstrated, although we will frequently -call attention to only small portions of that output (or merely to the -fact that it succeeded). The provided output is all from an AWS -instance running Ubuntu 16.04 - -.. _basics-tutorial-install: - ----------------- -Installing Spack ----------------- - -Spack works out of the box. Simply clone spack and get going. We will -clone Spack and immediately checkout the most recent release, v0.12. - -.. code-block:: console - - $ git clone https://github.com/spack/spack - git clone https://github.com/spack/spack - Cloning into 'spack'... - remote: Enumerating objects: 68, done. - remote: Counting objects: 100% (68/68), done. - remote: Compressing objects: 100% (56/56), done. - remote: Total 135389 (delta 40), reused 16 (delta 9), pack-reused 135321 - Receiving objects: 100% (135389/135389), 47.31 MiB | 1.01 MiB/s, done. - Resolving deltas: 100% (64414/64414), done. - Checking connectivity... done. - $ cd spack - $ git checkout releases/v0.12 - Branch releases/v0.12 set up to track remote branch releases/v0.12 from origin. - Switched to a new branch 'releases/v0.12' - -Next add Spack to your path. Spack has some nice command line -integration tools, so instead of simply appending to your ``PATH`` -variable, source the spack setup script. Then add Spack to your path. - -.. code-block:: console - - $ . share/spack/setup-env.sh - -You're good to go! - ------------------ -What is in Spack? ------------------ - -The ``spack list`` command shows available packages. - -.. code-block:: console - - $ spack list - ==> 2907 packages. - abinit libgpuarray py-espresso r-mlrmbo - abyss libgridxc py-espressopp r-mmwrweek - accfft libgtextutils py-et-xmlfile r-mnormt - ... - -The ``spack list`` command can also take a query string. Spack -automatically adds wildcards to both ends of the string. For example, -we can view all available python packages. - -.. code-block:: console - - $ spack list py- - ==> 479 packages. - lumpy-sv py-funcsigs py-numpydoc py-utililib - perl-file-copy-recursive py-functools32 py-olefile py-pywavelets - py-3to2 py-future py-ont-fast5-api py-pyyaml - ... - -------------------- -Installing Packages -------------------- - -Installing a package with Spack is very simple. To install a piece of -software, simply type ``spack install ``. - -.. code-block:: console - - $ spack install zlib - ==> Installing zlib - ==> Searching for binary cache of zlib - ==> Warning: No Spack mirrors are currently configured - ==> No binary for zlib found: installing from source - ==> Fetching http://zlib.net/fossils/zlib-1.2.11.tar.gz - ######################################################################## 100.0% - ==> Staging archive: /home/spack1/spack/var/spack/stage/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb/zlib-1.2.11.tar.gz - ==> Created stage in /home/spack1/spack/var/spack/stage/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> No patches needed for zlib - ==> Building zlib [Package] - ==> Executing phase: 'install' - ==> Successfully installed zlib - Fetch: 3.27s. Build: 2.18s. Total: 5.44s. - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - -Spack can install software either from source or from a binary -cache. Packages in the binary cache are signed with GPG for -security. For the tutorial we have prepared a binary cache so you -don't have to wait on slow compilation from source. To be able to -install from the binary cache, we will need to configure Spack with -the location of the binary cache and trust the GPG key that the binary -cache was signed with. - -.. code-block:: console - - $ spack mirror add tutorial /mirror - $ spack gpg trust /mirror/public.key - gpg: keybox '/home/spack1/spack/opt/spack/gpg/pubring.kbx' created - gpg: /home/spack1/spack/opt/spack/gpg/trustdb.gpg: trustdb created - gpg: key 3B7C69B2: public key "sc-tutorial (GPG created for Spack) " imported - gpg: Total number processed: 1 - gpg: imported: 1 - -You'll learn more about configuring Spack later in the tutorial, but -for now you will be able to install the rest of the packages in the -tutorial from a binary cache using the same ``spack install`` -command. By default this will install the binary cached version if it -exists and fall back on installing from source. - -Spack's spec syntax is the interface by which we can request specific -configurations of the package. The ``%`` sigil is used to specify -compilers. - -.. code-block:: console - - $ spack install zlib %clang - ==> Installing zlib - ==> Searching for binary cache of zlib - ==> Finding buildcaches in /mirror/build_cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64-gcc-7.2.0-texinfo-6.5-cuqnfgfhhmudqp5f7upmld6ax7pratzw.spec.yaml - ######################################################################## 100.0% - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64-gcc-4.7-zlib-1.2.11-bq2wtdxakpjytk2tjr7qu23i4py2fi2r.spec.yaml - ######################################################################## 100.0% - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64-gcc-5.4.0-dyninst-9.3.2-bu6s2jzievsjkwtcnrtimc5b625j5omf.spec.yaml - ######################################################################## 100.0% - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64-gcc-7.2.0-openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4.spec.yaml - ... - ==> Installing zlib from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/zlib-1.2.11/linux-ubuntu16.04-x86_64-clang-3.8.0-2ubuntu4-zlib-1.2.11-4pt75q7qq6lygf3hgnona4lyc2uwedul.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:08:01 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed zlib from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/zlib-1.2.11-4pt75q7qq6lygf3hgnona4lyc2uwedul - -Note that this installation is located separately from the previous -one. We will discuss this in more detail later, but this is part of what -allows Spack to support arbitrarily versioned software. - -You can check for particular versions before requesting them. We will -use the ``spack versions`` command to see the available versions, and then -install a different version of ``zlib``. - -.. code-block:: console - - $ spack versions zlib - ==> Safe versions (already checksummed): - 1.2.11 1.2.8 1.2.3 - ==> Remote versions (not yet checksummed): - 1.2.10 1.2.7 1.2.5.1 1.2.4.2 1.2.3.7 - ... - -The ``@`` sigil is used to specify versions, both of packages and of -compilers. - -.. code-block:: console - - $ spack install zlib@1.2.8 - ==> Installing zlib - ==> Searching for binary cache of zlib - ==> Finding buildcaches in /mirror/build_cache - ==> Installing zlib from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8/linux-ubuntu16.04-x86_64-gcc-5.4.0-zlib-1.2.8-bkyl5bhuep6fmhuxzkmhqy25qefjcvzc.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:18:30 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed zlib from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8-bkyl5bhuep6fmhuxzkmhqy25qefjcvzc - - $ spack install zlib %gcc@4.7 - ==> Installing zlib - ==> Searching for binary cache of zlib - ==> Finding buildcaches in /mirror/build_cache - ==> Installing zlib from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-4.7/zlib-1.2.11/linux-ubuntu16.04-x86_64-gcc-4.7-zlib-1.2.11-bq2wtdxakpjytk2tjr7qu23i4py2fi2r.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 04:55:30 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed zlib from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-4.7/zlib-1.2.11-bq2wtdxakpjytk2tjr7qu23i4py2fi2r - -The spec syntax also includes compiler flags. Spack accepts -``cppflags``, ``cflags``, ``cxxflags``, ``fflags``, ``ldflags``, and -``ldlibs`` parameters. The values of these fields must be quoted on -the command line if they include spaces. These values are injected -into the compile line automatically by the Spack compiler wrappers. - -.. code-block:: console - - $ spack install zlib @1.2.8 cppflags=-O3 - ==> Installing zlib - ==> Searching for binary cache of zlib - ==> Finding buildcaches in /mirror/build_cache - ==> Installing zlib from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8/linux-ubuntu16.04-x86_64-gcc-5.4.0-zlib-1.2.8-64mns5mvdacqvlashkf7v6lqrxixhmxu.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:31:54 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed zlib from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8-64mns5mvdacqvlashkf7v6lqrxixhmxu - -The ``spack find`` command is used to query installed packages. Note that -some packages appear identical with the default output. The ``-l`` flag -shows the hash of each package, and the ``-f`` flag shows any non-empty -compiler flags of those packages. - -.. code-block:: console - - $ spack find - ==> 5 installed packages. - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - zlib@1.2.11 - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - zlib@1.2.11 - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - zlib@1.2.8 zlib@1.2.8 zlib@1.2.11 - - - $ spack find -lf - ==> 5 installed packages. - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - 4pt75q7 zlib@1.2.11%clang - - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - bq2wtdx zlib@1.2.11%gcc - - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - bkyl5bh zlib@1.2.8%gcc - - 64mns5m zlib@1.2.8%gcc cppflags="-O3" - - 5nus6kn zlib@1.2.11%gcc - -Spack generates a hash for each spec. This hash is a function of the full -provenance of the package, so any change to the spec affects the -hash. Spack uses this value to compare specs and to generate unique -installation directories for every combinatorial version. As we move into -more complicated packages with software dependencies, we can see that -Spack reuses existing packages to satisfy a dependency only when the -existing package's hash matches the desired spec. - -.. code-block:: console - - $ spack install tcl - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> Installing tcl - ==> Searching for binary cache of tcl - ==> Finding buildcaches in /mirror/build_cache - ==> Installing tcl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8/linux-ubuntu16.04-x86_64-gcc-5.4.0-tcl-8.6.8-qhwyccywhx2i6s7ob2gvjrjtj3rnfuqt.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:07:15 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed tcl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8-qhwyccywhx2i6s7ob2gvjrjtj3rnfuqt - -Dependencies can be explicitly requested using the ``^`` sigil. Note that -the spec syntax is recursive. Anything we could specify about the -top-level package, we can also specify about a dependency using ``^``. - -.. code-block:: console - - $ spack install tcl ^zlib @1.2.8 %clang - ==> Installing zlib - ==> Searching for binary cache of zlib - ==> Finding buildcaches in /mirror/build_cache - ==> Installing zlib from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/zlib-1.2.8/linux-ubuntu16.04-x86_64-clang-3.8.0-2ubuntu4-zlib-1.2.8-i426yu3o6lyau5fv5ljwsajfkqxj5rl5.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:09:01 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed zlib from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/zlib-1.2.8-i426yu3o6lyau5fv5ljwsajfkqxj5rl5 - ==> Installing tcl - ==> Searching for binary cache of tcl - ==> Installing tcl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/tcl-8.6.8/linux-ubuntu16.04-x86_64-clang-3.8.0-2ubuntu4-tcl-8.6.8-6wc66etr7y6hgibp2derrdkf763exwvc.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:10:21 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed tcl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/tcl-8.6.8-6wc66etr7y6hgibp2derrdkf763exwvc - -Packages can also be referred to from the command line by their package -hash. Using the ``spack find -lf`` command earlier we saw that the hash -of our optimized installation of zlib (``cppflags="-O3"``) began with -``64mns5m``. We can now explicitly build with that package without typing -the entire spec, by using the ``/`` sigil to refer to it by hash. As with -other tools like git, you do not need to specify an *entire* hash on the -command line. You can specify just enough digits to identify a hash -uniquely. If a hash prefix is ambiguous (i.e., two or more installed -packages share the prefix) then spack will report an error. - -.. code-block:: console - - $ spack install tcl ^/64mn - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8-64mns5mvdacqvlashkf7v6lqrxixhmxu - ==> Installing tcl - ==> Searching for binary cache of tcl - ==> Finding buildcaches in /mirror/build_cache - ==> Installing tcl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8/linux-ubuntu16.04-x86_64-gcc-5.4.0-tcl-8.6.8-am4pbatrtga3etyusg2akmsvrswwxno2.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:11:53 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed tcl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8-am4pbatrtga3etyusg2akmsvrswwxno2 - -The ``spack find`` command can also take a ``-d`` flag, which can show -dependency information. Note that each package has a top-level entry, -even if it also appears as a dependency. - -.. code-block:: console - - $ spack find -ldf - ==> 9 installed packages - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - 6wc66et tcl@8.6.8%clang - i426yu3 ^zlib@1.2.8%clang - - i426yu3 zlib@1.2.8%clang - - 4pt75q7 zlib@1.2.11%clang - - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - bq2wtdx zlib@1.2.11%gcc - - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - am4pbat tcl@8.6.8%gcc - 64mns5m ^zlib@1.2.8%gcc cppflags="-O3" - - qhwyccy tcl@8.6.8%gcc - 5nus6kn ^zlib@1.2.11%gcc - - bkyl5bh zlib@1.2.8%gcc - - 64mns5m zlib@1.2.8%gcc cppflags="-O3" - - 5nus6kn zlib@1.2.11%gcc - - -Let's move on to slightly more complicated packages. ``HDF5`` is a -good example of a more complicated package, with an MPI dependency. If -we install it "out of the box," it will build with ``openmpi``. - -.. code-block:: console - - $ spack install hdf5 - ==> Installing libsigsegv - ==> Searching for binary cache of libsigsegv - ==> Finding buildcaches in /mirror/build_cache - ==> Installing libsigsegv from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11/linux-ubuntu16.04-x86_64-gcc-5.4.0-libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:08:01 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed libsigsegv from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> Installing m4 - ==> Searching for binary cache of m4 - ==> Installing m4 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18/linux-ubuntu16.04-x86_64-gcc-5.4.0-m4-1.4.18-suf5jtcfehivwfesrc5hjy72r4nukyel.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:24:11 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed m4 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-suf5jtcfehivwfesrc5hjy72r4nukyel - ==> Installing libtool - ==> Searching for binary cache of libtool - ==> Installing libtool from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/libtool-2.4.6/linux-ubuntu16.04-x86_64-gcc-5.4.0-libtool-2.4.6-o2pfwjf44353ajgr42xqtvzyvqsazkgu.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:12:47 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed libtool from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libtool-2.4.6-o2pfwjf44353ajgr42xqtvzyvqsazkgu - ==> Installing pkgconf - ==> Searching for binary cache of pkgconf - ==> Installing pkgconf from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkgconf-1.4.2/linux-ubuntu16.04-x86_64-gcc-5.4.0-pkgconf-1.4.2-fovrh7alpft646n6mhis5mml6k6e5f4v.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:00:47 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed pkgconf from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkgconf-1.4.2-fovrh7alpft646n6mhis5mml6k6e5f4v - ==> Installing util-macros - ==> Searching for binary cache of util-macros - ==> Installing util-macros from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/util-macros-1.19.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-util-macros-1.19.1-milz7fmttmptcic2qdk5cnel7ll5sybr.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:31:54 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed util-macros from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/util-macros-1.19.1-milz7fmttmptcic2qdk5cnel7ll5sybr - ==> Installing libpciaccess - ==> Searching for binary cache of libpciaccess - ==> Installing libpciaccess from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/libpciaccess-0.13.5/linux-ubuntu16.04-x86_64-gcc-5.4.0-libpciaccess-0.13.5-5urc6tcjae26fbbd2wyfohoszhgxtbmc.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:09:34 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed libpciaccess from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libpciaccess-0.13.5-5urc6tcjae26fbbd2wyfohoszhgxtbmc - ==> Installing xz - ==> Searching for binary cache of xz - ==> Installing xz from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/xz-5.2.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-xz-5.2.4-teneqii2xv5u6zl5r6qi3pwurc6pmypz.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:05:03 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed xz from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/xz-5.2.4-teneqii2xv5u6zl5r6qi3pwurc6pmypz - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> Installing libxml2 - ==> Searching for binary cache of libxml2 - ==> Installing libxml2 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/libxml2-2.9.8/linux-ubuntu16.04-x86_64-gcc-5.4.0-libxml2-2.9.8-wpexsphdmfayxqxd4up5vgwuqgu5woo7.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 04:56:04 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed libxml2 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libxml2-2.9.8-wpexsphdmfayxqxd4up5vgwuqgu5woo7 - ==> Installing ncurses - ==> Searching for binary cache of ncurses - ==> Installing ncurses from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/ncurses-6.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-ncurses-6.1-3o765ourmesfrji6yeclb4wb5w54aqbh.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:04:49 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed ncurses from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/ncurses-6.1-3o765ourmesfrji6yeclb4wb5w54aqbh - ==> Installing readline - ==> Searching for binary cache of readline - ==> Installing readline from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/readline-7.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-readline-7.0-nxhwrg7xwc6nbsm2v4ezwe63l6nfidbi.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:04:56 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed readline from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/readline-7.0-nxhwrg7xwc6nbsm2v4ezwe63l6nfidbi - ==> Installing gdbm - ==> Searching for binary cache of gdbm - ==> Installing gdbm from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/gdbm-1.14.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-gdbm-1.14.1-q4fpyuo7ouhkeq6d3oabtrppctpvxmes.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:18:34 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed gdbm from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gdbm-1.14.1-q4fpyuo7ouhkeq6d3oabtrppctpvxmes - ==> Installing perl - ==> Searching for binary cache of perl - ==> Installing perl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/perl-5.26.2/linux-ubuntu16.04-x86_64-gcc-5.4.0-perl-5.26.2-ic2kyoadgp3dxfejcbllyplj2wf524fo.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:12:45 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed perl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/perl-5.26.2-ic2kyoadgp3dxfejcbllyplj2wf524fo - ==> Installing autoconf - ==> Searching for binary cache of autoconf - ==> Installing autoconf from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/autoconf-2.69/linux-ubuntu16.04-x86_64-gcc-5.4.0-autoconf-2.69-3sx2gxeibc4oasqd4o5h6lnwpcpsgd2q.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:24:03 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed autoconf from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/autoconf-2.69-3sx2gxeibc4oasqd4o5h6lnwpcpsgd2q - ==> Installing automake - ==> Searching for binary cache of automake - ==> Installing automake from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/automake-1.16.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-automake-1.16.1-rymw7imfehycqxzj4nuy2oiw3abegooy.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:12:03 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed automake from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/automake-1.16.1-rymw7imfehycqxzj4nuy2oiw3abegooy - ==> Installing numactl - ==> Searching for binary cache of numactl - ==> Installing numactl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/numactl-2.0.11/linux-ubuntu16.04-x86_64-gcc-5.4.0-numactl-2.0.11-ft463odrombnxlc3qew4omckhlq7tqgc.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:30:34 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed numactl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/numactl-2.0.11-ft463odrombnxlc3qew4omckhlq7tqgc - ==> Installing hwloc - ==> Searching for binary cache of hwloc - ==> Installing hwloc from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hwloc-1.11.9/linux-ubuntu16.04-x86_64-gcc-5.4.0-hwloc-1.11.9-43tkw5mt6huhv37vqnybqgxtkodbsava.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:08:00 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hwloc from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hwloc-1.11.9-43tkw5mt6huhv37vqnybqgxtkodbsava - ==> Installing openmpi - ==> Searching for binary cache of openmpi - ==> Installing openmpi from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3/linux-ubuntu16.04-x86_64-gcc-5.4.0-openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:01:54 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed openmpi from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx - ==> Installing hdf5 - ==> Searching for binary cache of hdf5 - ==> Installing hdf5 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-hdf5-1.10.4-ozyvmhzdew66byarohm4p36ep7wtcuiw.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:23:04 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hdf5 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-ozyvmhzdew66byarohm4p36ep7wtcuiw - -Spack packages can also have build options, called variants. Boolean -variants can be specified using the ``+`` and ``~`` or ``-`` -sigils. There are two sigils for ``False`` to avoid conflicts with -shell parsing in different situations. Variants (boolean or otherwise) -can also be specified using the same syntax as compiler flags. Here -we can install HDF5 without MPI support. - -.. code-block:: console - - $ spack install hdf5~mpi - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> Installing hdf5 - ==> Searching for binary cache of hdf5 - ==> Finding buildcaches in /mirror/build_cache - ==> Installing hdf5 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-hdf5-1.10.4-5vcv5r67vpjzenq4apyebshclelnzuja.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:23:24 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hdf5 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-5vcv5r67vpjzenq4apyebshclelnzuja - -We might also want to install HDF5 with a different MPI -implementation. While MPI is not a package itself, packages can depend on -abstract interfaces like MPI. Spack handles these through "virtual -dependencies." A package, such as HDF5, can depend on the MPI -interface. Other packages (``openmpi``, ``mpich``, ``mvapich``, etc.) -provide the MPI interface. Any of these providers can be requested for -an MPI dependency. For example, we can build HDF5 with MPI support -provided by mpich by specifying a dependency on ``mpich``. Spack also -supports versioning of virtual dependencies. A package can depend on the -MPI interface at version 3, and provider packages specify what version of -the interface *they* provide. The partial spec ``^mpi@3`` can be safisfied -by any of several providers. - -.. code-block:: console - - $ spack install hdf5+hl+mpi ^mpich - ==> libsigsegv is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> m4 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-suf5jtcfehivwfesrc5hjy72r4nukyel - ==> pkgconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkgconf-1.4.2-fovrh7alpft646n6mhis5mml6k6e5f4v - ==> ncurses is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/ncurses-6.1-3o765ourmesfrji6yeclb4wb5w54aqbh - ==> readline is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/readline-7.0-nxhwrg7xwc6nbsm2v4ezwe63l6nfidbi - ==> gdbm is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gdbm-1.14.1-q4fpyuo7ouhkeq6d3oabtrppctpvxmes - ==> perl is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/perl-5.26.2-ic2kyoadgp3dxfejcbllyplj2wf524fo - ==> autoconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/autoconf-2.69-3sx2gxeibc4oasqd4o5h6lnwpcpsgd2q - ==> automake is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/automake-1.16.1-rymw7imfehycqxzj4nuy2oiw3abegooy - ==> libtool is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libtool-2.4.6-o2pfwjf44353ajgr42xqtvzyvqsazkgu - ==> Installing texinfo - ==> Searching for binary cache of texinfo - ==> Finding buildcaches in /mirror/build_cache - ==> Installing texinfo from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/texinfo-6.5/linux-ubuntu16.04-x86_64-gcc-5.4.0-texinfo-6.5-zs7a2pcwhq6ho2cj2x26uxfktwkpyucn.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:18:29 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed texinfo from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/texinfo-6.5-zs7a2pcwhq6ho2cj2x26uxfktwkpyucn - ==> Installing findutils - ==> Searching for binary cache of findutils - ==> Installing findutils from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/findutils-4.6.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-findutils-4.6.0-d4iajxsopzrlcjtasahxqeyjkjv5jx4v.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:07:17 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed findutils from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/findutils-4.6.0-d4iajxsopzrlcjtasahxqeyjkjv5jx4v - ==> Installing mpich - ==> Searching for binary cache of mpich - ==> Installing mpich from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpich-3.2.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-mpich-3.2.1-p3f7p2r5ntrynqibosglxvhwyztiwqs5.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:23:57 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed mpich from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpich-3.2.1-p3f7p2r5ntrynqibosglxvhwyztiwqs5 - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> Installing hdf5 - ==> Searching for binary cache of hdf5 - ==> Installing hdf5 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-hdf5-1.10.4-xxd7syhgej6onpyfyewxqcqe7ltkt7ob.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:07:32 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hdf5 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-xxd7syhgej6onpyfyewxqcqe7ltkt7ob - -We'll do a quick check in on what we have installed so far. - -.. code-block:: console - - $ spack find -ldf - ==> 32 installed packages - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - 6wc66et tcl@8.6.8%clang - i426yu3 ^zlib@1.2.8%clang - - i426yu3 zlib@1.2.8%clang - - 4pt75q7 zlib@1.2.11%clang - - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - bq2wtdx zlib@1.2.11%gcc - - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - 3sx2gxe autoconf@2.69%gcc - suf5jtc ^m4@1.4.18%gcc - fypapcp ^libsigsegv@2.11%gcc - ic2kyoa ^perl@5.26.2%gcc - q4fpyuo ^gdbm@1.14.1%gcc - nxhwrg7 ^readline@7.0%gcc - 3o765ou ^ncurses@6.1%gcc - - rymw7im automake@1.16.1%gcc - ic2kyoa ^perl@5.26.2%gcc - q4fpyuo ^gdbm@1.14.1%gcc - nxhwrg7 ^readline@7.0%gcc - 3o765ou ^ncurses@6.1%gcc - - d4iajxs findutils@4.6.0%gcc - - q4fpyuo gdbm@1.14.1%gcc - nxhwrg7 ^readline@7.0%gcc - 3o765ou ^ncurses@6.1%gcc - - 5vcv5r6 hdf5@1.10.4%gcc - 5nus6kn ^zlib@1.2.11%gcc - - ozyvmhz hdf5@1.10.4%gcc - 3njc4q5 ^openmpi@3.1.3%gcc - 43tkw5m ^hwloc@1.11.9%gcc - 5urc6tc ^libpciaccess@0.13.5%gcc - wpexsph ^libxml2@2.9.8%gcc - teneqii ^xz@5.2.4%gcc - 5nus6kn ^zlib@1.2.11%gcc - ft463od ^numactl@2.0.11%gcc - - xxd7syh hdf5@1.10.4%gcc - p3f7p2r ^mpich@3.2.1%gcc - 5nus6kn ^zlib@1.2.11%gcc - - 43tkw5m hwloc@1.11.9%gcc - 5urc6tc ^libpciaccess@0.13.5%gcc - wpexsph ^libxml2@2.9.8%gcc - teneqii ^xz@5.2.4%gcc - 5nus6kn ^zlib@1.2.11%gcc - ft463od ^numactl@2.0.11%gcc - - 5urc6tc libpciaccess@0.13.5%gcc - - fypapcp libsigsegv@2.11%gcc - - o2pfwjf libtool@2.4.6%gcc - - wpexsph libxml2@2.9.8%gcc - teneqii ^xz@5.2.4%gcc - 5nus6kn ^zlib@1.2.11%gcc - - suf5jtc m4@1.4.18%gcc - fypapcp ^libsigsegv@2.11%gcc - - p3f7p2r mpich@3.2.1%gcc - - 3o765ou ncurses@6.1%gcc - - ft463od numactl@2.0.11%gcc - - 3njc4q5 openmpi@3.1.3%gcc - 43tkw5m ^hwloc@1.11.9%gcc - 5urc6tc ^libpciaccess@0.13.5%gcc - wpexsph ^libxml2@2.9.8%gcc - teneqii ^xz@5.2.4%gcc - 5nus6kn ^zlib@1.2.11%gcc - ft463od ^numactl@2.0.11%gcc - - ic2kyoa perl@5.26.2%gcc - q4fpyuo ^gdbm@1.14.1%gcc - nxhwrg7 ^readline@7.0%gcc - 3o765ou ^ncurses@6.1%gcc - - fovrh7a pkgconf@1.4.2%gcc - - nxhwrg7 readline@7.0%gcc - 3o765ou ^ncurses@6.1%gcc - - am4pbat tcl@8.6.8%gcc - 64mns5m ^zlib@1.2.8%gcc cppflags="-O3" - - qhwyccy tcl@8.6.8%gcc - 5nus6kn ^zlib@1.2.11%gcc - - zs7a2pc texinfo@6.5%gcc - ic2kyoa ^perl@5.26.2%gcc - q4fpyuo ^gdbm@1.14.1%gcc - nxhwrg7 ^readline@7.0%gcc - 3o765ou ^ncurses@6.1%gcc - - milz7fm util-macros@1.19.1%gcc - - teneqii xz@5.2.4%gcc - - bkyl5bh zlib@1.2.8%gcc - - 64mns5m zlib@1.2.8%gcc cppflags="-O3" - - 5nus6kn zlib@1.2.11%gcc - - -Spack models the dependencies of packages as a directed acyclic graph -(DAG). The ``spack find -d`` command shows the tree representation of -that graph. We can also use the ``spack graph`` command to view the entire -DAG as a graph. - -.. code-block:: console - - $ spack graph hdf5+hl+mpi ^mpich - o hdf5 - |\ - o | zlib - / - o mpich - o findutils - |\ - | |\ - | | |\ - | | | |\ - o | | | | texinfo - | | | o | automake - | |_|/| | - |/| | | | - | | | |/ - | | | o autoconf - | |_|/| - |/| |/ - | |/| - o | | perl - o | | gdbm - o | | readline - o | | ncurses - o | | pkgconf - / / - | o libtool - |/ - o m4 - o libsigsegv - -You may also have noticed that there are some packages shown in the -``spack find -d`` output that we didn't install explicitly. These are -dependencies that were installed implicitly. A few packages installed -implicitly are not shown as dependencies in the ``spack find -d`` -output. These are build dependencies. For example, ``libpciaccess`` is a -dependency of openmpi and requires ``m4`` to build. Spack will build ``m4`` as -part of the installation of ``openmpi``, but it does not become a part of -the DAG because it is not linked in at run time. Spack handles build -dependencies differently because of their different (less strict) -consistency requirements. It is entirely possible to have two packages -using different versions of a dependency to build, which obviously cannot -be done with linked dependencies. - -``HDF5`` is more complicated than our basic example of zlib and -openssl, but it's still within the realm of software that an experienced -HPC user could reasonably expect to install given a bit of time. Now -let's look at an even more complicated package. - -.. code-block:: console - - $ spack install trilinos - ==> Installing diffutils - ==> Searching for binary cache of diffutils - ==> Finding buildcaches in /mirror/build_cache - ==> Installing diffutils from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/diffutils-3.6/linux-ubuntu16.04-x86_64-gcc-5.4.0-diffutils-3.6-2rhuivgjrna2nrxhntyde6md2khcvs34.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:30:17 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed diffutils from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/diffutils-3.6-2rhuivgjrna2nrxhntyde6md2khcvs34 - ==> Installing bzip2 - ==> Searching for binary cache of bzip2 - ==> Installing bzip2 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/bzip2-1.0.6/linux-ubuntu16.04-x86_64-gcc-5.4.0-bzip2-1.0.6-ufczdvsqt6edesm36xiucyry7myhj7e7.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:34:37 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed bzip2 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/bzip2-1.0.6-ufczdvsqt6edesm36xiucyry7myhj7e7 - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> Installing boost - ==> Searching for binary cache of boost - ==> Installing boost from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.68.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-boost-1.68.0-zbgfxapchxa4awxdwpleubfuznblxzvt.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 04:58:55 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed boost from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.68.0-zbgfxapchxa4awxdwpleubfuznblxzvt - ==> pkgconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkgconf-1.4.2-fovrh7alpft646n6mhis5mml6k6e5f4v - ==> ncurses is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/ncurses-6.1-3o765ourmesfrji6yeclb4wb5w54aqbh - ==> readline is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/readline-7.0-nxhwrg7xwc6nbsm2v4ezwe63l6nfidbi - ==> gdbm is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gdbm-1.14.1-q4fpyuo7ouhkeq6d3oabtrppctpvxmes - ==> perl is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/perl-5.26.2-ic2kyoadgp3dxfejcbllyplj2wf524fo - ==> Installing openssl - ==> Searching for binary cache of openssl - ==> Installing openssl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/openssl-1.0.2o/linux-ubuntu16.04-x86_64-gcc-5.4.0-openssl-1.0.2o-b4y3w3bsyvjla6eesv4vt6aplpfrpsha.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:24:10 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed openssl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openssl-1.0.2o-b4y3w3bsyvjla6eesv4vt6aplpfrpsha - ==> Installing cmake - ==> Searching for binary cache of cmake - ==> Installing cmake from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/cmake-3.12.3/linux-ubuntu16.04-x86_64-gcc-5.4.0-cmake-3.12.3-otafqzhh4xnlq2mpakch7dr3tjfsrjnx.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:33:15 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed cmake from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/cmake-3.12.3-otafqzhh4xnlq2mpakch7dr3tjfsrjnx - ==> Installing glm - ==> Searching for binary cache of glm - ==> Installing glm from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/glm-0.9.7.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-glm-0.9.7.1-jnw622jwcbsymzj2fsx22omjl7tmvaws.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:30:33 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed glm from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/glm-0.9.7.1-jnw622jwcbsymzj2fsx22omjl7tmvaws - ==> libsigsegv is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> m4 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-suf5jtcfehivwfesrc5hjy72r4nukyel - ==> libtool is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libtool-2.4.6-o2pfwjf44353ajgr42xqtvzyvqsazkgu - ==> util-macros is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/util-macros-1.19.1-milz7fmttmptcic2qdk5cnel7ll5sybr - ==> libpciaccess is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libpciaccess-0.13.5-5urc6tcjae26fbbd2wyfohoszhgxtbmc - ==> xz is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/xz-5.2.4-teneqii2xv5u6zl5r6qi3pwurc6pmypz - ==> libxml2 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libxml2-2.9.8-wpexsphdmfayxqxd4up5vgwuqgu5woo7 - ==> autoconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/autoconf-2.69-3sx2gxeibc4oasqd4o5h6lnwpcpsgd2q - ==> automake is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/automake-1.16.1-rymw7imfehycqxzj4nuy2oiw3abegooy - ==> numactl is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/numactl-2.0.11-ft463odrombnxlc3qew4omckhlq7tqgc - ==> hwloc is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hwloc-1.11.9-43tkw5mt6huhv37vqnybqgxtkodbsava - ==> openmpi is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx - ==> Installing hdf5 - ==> Searching for binary cache of hdf5 - ==> Installing hdf5 from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-hdf5-1.10.4-oqwnui7wtovuf2id4vjwcxfmxlzjus6y.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:09:10 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hdf5 from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-oqwnui7wtovuf2id4vjwcxfmxlzjus6y - ==> Installing openblas - ==> Searching for binary cache of openblas - ==> Installing openblas from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/openblas-0.3.3/linux-ubuntu16.04-x86_64-gcc-5.4.0-openblas-0.3.3-cyeg2yiitpuqglhvbox5gtbgsim2v5vn.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:32:04 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed openblas from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openblas-0.3.3-cyeg2yiitpuqglhvbox5gtbgsim2v5vn - ==> Installing hypre - ==> Searching for binary cache of hypre - ==> Installing hypre from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hypre-2.15.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-hypre-2.15.1-fshksdpecwiq7r6vawfswpboedhbisju.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:07:34 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hypre from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hypre-2.15.1-fshksdpecwiq7r6vawfswpboedhbisju - ==> Installing matio - ==> Searching for binary cache of matio - ==> Installing matio from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/matio-1.5.9/linux-ubuntu16.04-x86_64-gcc-5.4.0-matio-1.5.9-lmzdgssvobdljw52mtahelu2ju7osh6h.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:05:13 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed matio from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/matio-1.5.9-lmzdgssvobdljw52mtahelu2ju7osh6h - ==> Installing metis - ==> Searching for binary cache of metis - ==> Installing metis from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/metis-5.1.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-metis-5.1.0-3wnvp4ji3wwu4v4vymszrhx6naehs6jc.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:31:42 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed metis from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/metis-5.1.0-3wnvp4ji3wwu4v4vymszrhx6naehs6jc - ==> Installing netlib-scalapack - ==> Searching for binary cache of netlib-scalapack - ==> Installing netlib-scalapack from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-scalapack-2.0.2/linux-ubuntu16.04-x86_64-gcc-5.4.0-netlib-scalapack-2.0.2-wotpfwfctgfkzzn2uescucxvvbg3tm6b.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:07:22 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed netlib-scalapack from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-scalapack-2.0.2-wotpfwfctgfkzzn2uescucxvvbg3tm6b - ==> Installing mumps - ==> Searching for binary cache of mumps - ==> Installing mumps from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/mumps-5.1.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-mumps-5.1.1-acsg2dzroox2swssgc5cwgkvdy6jcm5q.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:18:32 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed mumps from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mumps-5.1.1-acsg2dzroox2swssgc5cwgkvdy6jcm5q - ==> Installing netcdf - ==> Searching for binary cache of netcdf - ==> Installing netcdf from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/netcdf-4.6.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-netcdf-4.6.1-mhm4izpogf4mrjidyskb6ewtzxdi7t6g.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:11:57 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed netcdf from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netcdf-4.6.1-mhm4izpogf4mrjidyskb6ewtzxdi7t6g - ==> Installing parmetis - ==> Searching for binary cache of parmetis - ==> Installing parmetis from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/parmetis-4.0.3/linux-ubuntu16.04-x86_64-gcc-5.4.0-parmetis-4.0.3-uv6h3sqx6quqg22hxesi2mw2un3kw6b7.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:12:04 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed parmetis from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/parmetis-4.0.3-uv6h3sqx6quqg22hxesi2mw2un3kw6b7 - ==> Installing suite-sparse - ==> Searching for binary cache of suite-sparse - ==> Installing suite-sparse from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/suite-sparse-5.3.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-suite-sparse-5.3.0-zaau4kifha2enpdcn3mjlrqym7hm7yon.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:22:54 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed suite-sparse from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/suite-sparse-5.3.0-zaau4kifha2enpdcn3mjlrqym7hm7yon - ==> Installing trilinos - ==> Searching for binary cache of trilinos - ==> Installing trilinos from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-trilinos-12.12.1-rlsruavxqvwk2tgxzxboclbo6ykjf54r.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:18:10 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed trilinos from binary cache - -Now we're starting to see the power of Spack. Trilinos in its default -configuration has 23 top level dependecies, many of which have -dependencies of their own. Installing more complex packages can take -days or weeks even for an experienced user. Although we've done a -binary installation for the tutorial, a source installation of -trilinos using Spack takes about 3 hours (depending on the system), -but only 20 seconds of programmer time. - -Spack manages constistency of the entire DAG. Every MPI dependency will -be satisfied by the same configuration of MPI, etc. If we install -``trilinos`` again specifying a dependency on our previous HDF5 built -with ``mpich``: - -.. code-block:: console - - $ spack install trilinos +hdf5 ^hdf5+hl+mpi ^mpich - ==> diffutils is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/diffutils-3.6-2rhuivgjrna2nrxhntyde6md2khcvs34 - ==> bzip2 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/bzip2-1.0.6-ufczdvsqt6edesm36xiucyry7myhj7e7 - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> boost is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.68.0-zbgfxapchxa4awxdwpleubfuznblxzvt - ==> pkgconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkgconf-1.4.2-fovrh7alpft646n6mhis5mml6k6e5f4v - ==> ncurses is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/ncurses-6.1-3o765ourmesfrji6yeclb4wb5w54aqbh - ==> readline is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/readline-7.0-nxhwrg7xwc6nbsm2v4ezwe63l6nfidbi - ==> gdbm is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gdbm-1.14.1-q4fpyuo7ouhkeq6d3oabtrppctpvxmes - ==> perl is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/perl-5.26.2-ic2kyoadgp3dxfejcbllyplj2wf524fo - ==> openssl is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openssl-1.0.2o-b4y3w3bsyvjla6eesv4vt6aplpfrpsha - ==> cmake is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/cmake-3.12.3-otafqzhh4xnlq2mpakch7dr3tjfsrjnx - ==> glm is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/glm-0.9.7.1-jnw622jwcbsymzj2fsx22omjl7tmvaws - ==> libsigsegv is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> m4 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-suf5jtcfehivwfesrc5hjy72r4nukyel - ==> autoconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/autoconf-2.69-3sx2gxeibc4oasqd4o5h6lnwpcpsgd2q - ==> automake is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/automake-1.16.1-rymw7imfehycqxzj4nuy2oiw3abegooy - ==> libtool is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libtool-2.4.6-o2pfwjf44353ajgr42xqtvzyvqsazkgu - ==> texinfo is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/texinfo-6.5-zs7a2pcwhq6ho2cj2x26uxfktwkpyucn - ==> findutils is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/findutils-4.6.0-d4iajxsopzrlcjtasahxqeyjkjv5jx4v - ==> mpich is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpich-3.2.1-p3f7p2r5ntrynqibosglxvhwyztiwqs5 - ==> hdf5 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-xxd7syhgej6onpyfyewxqcqe7ltkt7ob - ==> openblas is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openblas-0.3.3-cyeg2yiitpuqglhvbox5gtbgsim2v5vn - ==> Installing hypre - ==> Searching for binary cache of hypre - ==> Finding buildcaches in /mirror/build_cache - ==> Installing hypre from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/hypre-2.15.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-hypre-2.15.1-obewuozolon7tkdg4cfxc6ae2tzkronb.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:34:36 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed hypre from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hypre-2.15.1-obewuozolon7tkdg4cfxc6ae2tzkronb - ==> Installing matio - ==> Searching for binary cache of matio - ==> Installing matio from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/matio-1.5.9/linux-ubuntu16.04-x86_64-gcc-5.4.0-matio-1.5.9-gvyqldhifflmvcrtui3b6s64jcczsxxh.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:25:11 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed matio from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/matio-1.5.9-gvyqldhifflmvcrtui3b6s64jcczsxxh - ==> metis is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/metis-5.1.0-3wnvp4ji3wwu4v4vymszrhx6naehs6jc - ==> Installing netlib-scalapack - ==> Searching for binary cache of netlib-scalapack - ==> Installing netlib-scalapack from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-scalapack-2.0.2/linux-ubuntu16.04-x86_64-gcc-5.4.0-netlib-scalapack-2.0.2-p7iln2pcosw2ipyqoyr7ie6lpva2oj7r.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:32:20 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed netlib-scalapack from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netlib-scalapack-2.0.2-p7iln2pcosw2ipyqoyr7ie6lpva2oj7r - ==> Installing mumps - ==> Searching for binary cache of mumps - ==> Installing mumps from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/mumps-5.1.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-mumps-5.1.1-cumcj5a75cagsznpjrgretxdg6okxaur.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:33:18 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed mumps from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mumps-5.1.1-cumcj5a75cagsznpjrgretxdg6okxaur - ==> Installing netcdf - ==> Searching for binary cache of netcdf - ==> Installing netcdf from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/netcdf-4.6.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-netcdf-4.6.1-wmmx5sgwfds34v7bkkhiduar5yecrnnd.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:24:01 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed netcdf from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/netcdf-4.6.1-wmmx5sgwfds34v7bkkhiduar5yecrnnd - ==> Installing parmetis - ==> Searching for binary cache of parmetis - ==> Installing parmetis from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/parmetis-4.0.3/linux-ubuntu16.04-x86_64-gcc-5.4.0-parmetis-4.0.3-jehtatan4y2lcobj6waoqv66jj4libtz.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:07:41 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed parmetis from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/parmetis-4.0.3-jehtatan4y2lcobj6waoqv66jj4libtz - ==> suite-sparse is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/suite-sparse-5.3.0-zaau4kifha2enpdcn3mjlrqym7hm7yon - ==> Installing trilinos - ==> Searching for binary cache of trilinos - ==> Installing trilinos from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1/linux-ubuntu16.04-x86_64-gcc-5.4.0-trilinos-12.12.1-kqc52moweigxqxzwzfqajc6ocxwdwn4w.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:30:15 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed trilinos from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1-kqc52moweigxqxzwzfqajc6ocxwdwn4w - - -We see that every package in the trilinos DAG that depends on MPI now -uses ``mpich``. - -.. code-block:: console - - $ spack find -d trilinos - ==> 2 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - trilinos@12.12.1 - ^boost@1.68.0 - ^bzip2@1.0.6 - ^zlib@1.2.11 - ^glm@0.9.7.1 - ^hdf5@1.10.4 - ^openmpi@3.1.3 - ^hwloc@1.11.9 - ^libpciaccess@0.13.5 - ^libxml2@2.9.8 - ^xz@5.2.4 - ^numactl@2.0.11 - ^hypre@2.15.1 - ^openblas@0.3.3 - ^matio@1.5.9 - ^metis@5.1.0 - ^mumps@5.1.1 - ^netlib-scalapack@2.0.2 - ^netcdf@4.6.1 - ^parmetis@4.0.3 - ^suite-sparse@5.3.0 - - trilinos@12.12.1 - ^boost@1.68.0 - ^bzip2@1.0.6 - ^zlib@1.2.11 - ^glm@0.9.7.1 - ^hdf5@1.10.4 - ^mpich@3.2.1 - ^hypre@2.15.1 - ^openblas@0.3.3 - ^matio@1.5.9 - ^metis@5.1.0 - ^mumps@5.1.1 - ^netlib-scalapack@2.0.2 - ^netcdf@4.6.1 - ^parmetis@4.0.3 - ^suite-sparse@5.3.0 - - -As we discussed before, the ``spack find -d`` command shows the -dependency information as a tree. While that is often sufficient, many -complicated packages, including trilinos, have dependencies that -cannot be fully represented as a tree. Again, the ``spack graph`` -command shows the full DAG of the dependency information. - -.. code-block:: console - - $ spack graph trilinos - o trilinos - |\ - | |\ - | | |\ - | | | |\ - | | | | |\ - | | | | | |\ - | | | | | | |\ - | | | | | | | |\ - | | | | | | | | |\ - | | | | | | | | | |\ - | | | | | | | | | | |\ - | | | | | | | | | | | |\ - | | | | | | | | | | | | |\ - o | | | | | | | | | | | | | suite-sparse - |\ \ \ \ \ \ \ \ \ \ \ \ \ \ - | |_|_|/ / / / / / / / / / / - |/| | | | | | | | | | | | | - | |\ \ \ \ \ \ \ \ \ \ \ \ \ - | | |_|_|_|_|_|/ / / / / / / - | |/| | | | | | | | | | | | - | | | |_|_|_|_|_|_|_|/ / / - | | |/| | | | | | | | | | - | | | o | | | | | | | | | parmetis - | | |/| | | | | | | | | | - | |/|/| | | | | | | | | | - | | | |/ / / / / / / / / - | | | | | | o | | | | | mumps - | |_|_|_|_|/| | | | | | - |/| | | |_|/| | | | | | - | | | |/| |/ / / / / / - | | | | |/| | | | | | - | | | | o | | | | | | netlib-scalapack - | |_|_|/| | | | | | | - |/| | |/| | | | | | | - | | |/|/ / / / / / / - | o | | | | | | | | metis - | |/ / / / / / / / - | | | | | | | o | glm - | | |_|_|_|_|/ / - | |/| | | | | | - | o | | | | | | cmake - | |\ \ \ \ \ \ \ - | o | | | | | | | openssl - | |\ \ \ \ \ \ \ \ - | | | | | o | | | | netcdf - | | |_|_|/| | | | | - | |/| | |/| | | | | - | | | | | |\ \ \ \ \ - | | | | | | | |_|/ / - | | | | | | |/| | | - | | | | | | | o | | matio - | | |_|_|_|_|/| | | - | |/| | | | |/ / / - | | | | | | | o | hypre - | |_|_|_|_|_|/| | - |/| | | | |_|/ / - | | | | |/| | | - | | | | | | o | hdf5 - | | |_|_|_|/| | - | |/| | | |/ / - | | | | |/| | - | | | | o | | openmpi - | | |_|/| | | - | |/| | | | | - | | | | |\ \ \ - | | | | | o | | hwloc - | | | | |/| | | - | | | | | |\ \ \ - | | | | | | |\ \ \ - | | | | | | o | | | libxml2 - | | |_|_|_|/| | | | - | |/| | | |/| | | | - | | | | | | | | | o boost - | | |_|_|_|_|_|_|/| - | |/| | | | | | | | - | o | | | | | | | | zlib - | / / / / / / / / - | | | | | o | | | xz - | | | | | / / / - | | | | | o | | libpciaccess - | | | | |/| | | - | | | | | |\ \ \ - | | | | | o | | | util-macros - | | | | | / / / - | | | o | | | | numactl - | | | |\ \ \ \ \ - | | | | |_|_|/ / - | | | |/| | | | - | | | | |\ \ \ \ - | | | | | |_|/ / - | | | | |/| | | - | | | | | |\ \ \ - | | | | | o | | | automake - | | |_|_|/| | | | - | |/| | | | | | | - | | | | | |/ / / - | | | | | o | | autoconf - | | |_|_|/| | | - | |/| | |/ / / - | | | |/| | | - | o | | | | | perl - | o | | | | | gdbm - | o | | | | | readline - | |/ / / / / - | o | | | | ncurses - | | |_|/ / - | |/| | | - | o | | | pkgconf - | / / / - o | | | openblas - / / / - | o | libtool - |/ / - o | m4 - o | libsigsegv - / - o bzip2 - o diffutils - -You can control how the output is displayed with a number of options. - -The ASCII output from ``spack graph`` can be difficult to parse for -complicated packages. The output can be changed to the ``graphviz`` -``.dot`` format using the ``--dot`` flag. - -.. code-block:: console - - $ spack graph --dot trilinos | dot -Tpdf trilinos_graph.pdf - -.. _basics-tutorial-uninstall: - ---------------------- -Uninstalling Packages ---------------------- - -Earlier we installed many configurations each of zlib and tcl. Now we -will go through and uninstall some of those packages that we didn't -really need. - -.. code-block:: console - - $ spack find -d tcl - ==> 3 installed packages - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - tcl@8.6.8 - ^zlib@1.2.8 - - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - tcl@8.6.8 - ^zlib@1.2.8 - - tcl@8.6.8 - ^zlib@1.2.11 - - - $ spack find zlib - ==> 6 installed packages. - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - zlib@1.2.8 zlib@1.2.11 - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - zlib@1.2.11 - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - zlib@1.2.8 zlib@1.2.8 zlib@1.2.11 - -We can uninstall packages by spec using the same syntax as install. - -.. code-block:: console - - $ spack uninstall zlib %gcc@4.7 - ==> The following packages will be uninstalled: - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - bq2wtdx zlib@1.2.11%gcc+optimize+pic+shared - - ==> Do you want to proceed? [y/N] y - ==> Successfully uninstalled zlib@1.2.11%gcc@4.7+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 /bq2wtdx - - $ spack find -lf zlib - ==> 5 installed packages. - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - i426yu3 zlib@1.2.8%clang - 4pt75q7 zlib@1.2.11%clang - - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - bkyl5bh zlib@1.2.8%gcc - 64mns5m zlib@1.2.8%gcc cppflags="-O3" - 5nus6kn zlib@1.2.11%gcc - -We can also uninstall packages by referring only to their hash. - -We can use either ``-f`` (force) or ``-R`` (remove dependents as well) to -remove packages that are required by another installed package. - -.. code-block:: console - - $ spack uninstall zlib/i426 - ==> Error: Will not uninstall zlib@1.2.8%clang@3.8.0-2ubuntu4/i426yu3 - - The following packages depend on it: - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - 6wc66et tcl@8.6.8%clang - - ==> Error: Use \`spack uninstall --dependents\` to uninstall these dependencies as well. - - $ spack uninstall -R zlib/i426 - ==> The following packages will be uninstalled: - - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - 6wc66et tcl@8.6.8%clang - i426yu3 zlib@1.2.8%clang+optimize+pic+shared - ==> Do you want to proceed? [y/N] y - ==> Successfully uninstalled tcl@8.6.8%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 /6wc66et - ==> Successfully uninstalled zlib@1.2.8%clang@3.8.0-2ubuntu4+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 /i426yu3 - -Spack will not uninstall packages that are not sufficiently -specified. The ``-a`` (all) flag can be used to uninstall multiple -packages at once. - -.. code-block:: console - - $ spack uninstall trilinos - ==> Error: trilinos matches multiple packages: - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - rlsruav trilinos@12.12.1%gcc~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 - kqc52mo trilinos@12.12.1%gcc~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 - - ==> Error: You can either: - a) use a more specific spec, or - b) use `spack uninstall --all` to uninstall ALL matching specs. - - - $ spack uninstall /rlsr - ==> The following packages will be uninstalled: - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - rlsruav trilinos@12.12.1%gcc~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 - ==> Do you want to proceed? [y/N] y - ==> Successfully uninstalled trilinos@12.12.1%gcc@5.4.0~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 arch=linux-ubuntu16.04-x86_64 /rlsruav - ------------------------------ -Advanced ``spack find`` Usage ------------------------------ - -We will go over some additional uses for the ``spack find`` command not -already covered in the :ref:`basics-tutorial-install` and -:ref:`basics-tutorial-uninstall` sections. - -The ``spack find`` command can accept what we call "anonymous specs." -These are expressions in spec syntax that do not contain a package -name. For example, ``spack find ^mpich`` will return every installed -package that depends on mpich, and ``spack find cppflags="-O3"`` will -return every package which was built with ``cppflags="-O3"``. - -.. code-block:: console - - $ spack find ^mpich - ==> 8 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - hdf5@1.10.4 matio@1.5.9 netcdf@4.6.1 parmetis@4.0.3 - hypre@2.15.1 mumps@5.1.1 netlib-scalapack@2.0.2 trilinos@12.12.1 - - $ spack find cppflags=-O3 - ==> 1 installed packages. - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - zlib@1.2.8 - -The ``find`` command can also show which packages were installed -explicitly (rather than pulled in as a dependency) using the ``-x`` -flag. The ``-X`` flag shows implicit installs only. The ``find`` command can -also show the path to which a spack package was installed using the ``-p`` -command. - -.. code-block:: console - - $ spack find -px - ==> 10 installed packages - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - zlib@1.2.11 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/clang-3.8.0-2ubuntu4/zlib-1.2.11-4pt75q7qq6lygf3hgnona4lyc2uwedul - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - hdf5@1.10.4 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-5vcv5r67vpjzenq4apyebshclelnzuja - hdf5@1.10.4 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-ozyvmhzdew66byarohm4p36ep7wtcuiw - hdf5@1.10.4 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-xxd7syhgej6onpyfyewxqcqe7ltkt7ob - tcl@8.6.8 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8-am4pbatrtga3etyusg2akmsvrswwxno2 - tcl@8.6.8 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8-qhwyccywhx2i6s7ob2gvjrjtj3rnfuqt - trilinos@12.12.1 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1-kqc52moweigxqxzwzfqajc6ocxwdwn4w - zlib@1.2.8 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8-bkyl5bhuep6fmhuxzkmhqy25qefjcvzc - zlib@1.2.8 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.8-64mns5mvdacqvlashkf7v6lqrxixhmxu - zlib@1.2.11 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ---------------------- -Customizing Compilers ---------------------- - - -Spack manages a list of available compilers on the system, detected -automatically from from the user's ``PATH`` variable. The ``spack -compilers`` command is an alias for the command ``spack compiler list``. - -.. code-block:: console - - $ spack compilers - ==> Available compilers - -- clang ubuntu16.04-x86_64 ------------------------------------- - clang@3.8.0-2ubuntu4 clang@3.7.1-2ubuntu2 - - -- gcc ubuntu16.04-x86_64 --------------------------------------- - gcc@5.4.0 gcc@4.7 - -The compilers are maintained in a YAML file. Later in the tutorial you -will learn how to configure compilers by hand for special cases. Spack -also has tools to add compilers, and compilers built with Spack can be -added to the configuration. - -.. code-block:: console - - $ spack install gcc @7.2.0 - ==> libsigsegv is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libsigsegv-2.11-fypapcprssrj3nstp6njprskeyynsgaz - ==> m4 is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/m4-1.4.18-suf5jtcfehivwfesrc5hjy72r4nukyel - ==> pkgconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/pkgconf-1.4.2-fovrh7alpft646n6mhis5mml6k6e5f4v - ==> ncurses is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/ncurses-6.1-3o765ourmesfrji6yeclb4wb5w54aqbh - ==> readline is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/readline-7.0-nxhwrg7xwc6nbsm2v4ezwe63l6nfidbi - ==> gdbm is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gdbm-1.14.1-q4fpyuo7ouhkeq6d3oabtrppctpvxmes - ==> perl is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/perl-5.26.2-ic2kyoadgp3dxfejcbllyplj2wf524fo - ==> autoconf is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/autoconf-2.69-3sx2gxeibc4oasqd4o5h6lnwpcpsgd2q - ==> automake is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/automake-1.16.1-rymw7imfehycqxzj4nuy2oiw3abegooy - ==> libtool is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libtool-2.4.6-o2pfwjf44353ajgr42xqtvzyvqsazkgu - ==> Installing gmp - ==> Searching for binary cache of gmp - ==> Finding buildcaches in /mirror/build_cache - ==> Installing gmp from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/gmp-6.1.2/linux-ubuntu16.04-x86_64-gcc-5.4.0-gmp-6.1.2-qc4qcfz4monpllc3nqupdo7vwinf73sw.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:18:16 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed gmp from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gmp-6.1.2-qc4qcfz4monpllc3nqupdo7vwinf73sw - ==> Installing isl - ==> Searching for binary cache of isl - ==> Installing isl from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/isl-0.18/linux-ubuntu16.04-x86_64-gcc-5.4.0-isl-0.18-vttqoutnsmjpm3ogb52rninksc7hq5ax.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:05:19 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed isl from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/isl-0.18-vttqoutnsmjpm3ogb52rninksc7hq5ax - ==> Installing mpfr - ==> Searching for binary cache of mpfr - ==> Installing mpfr from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpfr-3.1.6/linux-ubuntu16.04-x86_64-gcc-5.4.0-mpfr-3.1.6-jnt2nnp5pmvikbw7opueajlbwbhmjxyv.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:32:07 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed mpfr from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpfr-3.1.6-jnt2nnp5pmvikbw7opueajlbwbhmjxyv - ==> Installing mpc - ==> Searching for binary cache of mpc - ==> Installing mpc from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpc-1.1.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-mpc-1.1.0-iuf3gc3zpgr4n4mditnxhff6x3joxi27.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:30:35 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed mpc from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpc-1.1.0-iuf3gc3zpgr4n4mditnxhff6x3joxi27 - ==> zlib is already installed in /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - Installing gcc - ==> Searching for binary cache of gcc - ==> Finding buildcaches in /mirror/build_cache - ==> Installing gcc from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0/linux-ubuntu16.04-x86_64-gcc-5.4.0-gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs.spack - ######################################################################## 100.0% - gpg: Signature made Sat Nov 10 05:22:47 2018 UTC using RSA key ID 3B7C69B2 - gpg: Good signature from "sc-tutorial (GPG created for Spack) " [unknown] - gpg: WARNING: This key is not certified with a trusted signature! - gpg: There is no indication that the signature belongs to the owner. - Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F D6E9 9CFA 4A45 3B7C 69B2 - ==> Successfully installed gcc from binary cache - [+] /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs - - $ spack find -p gcc - spack find -p gcc - ==> 1 installed package - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - gcc@7.2.0 /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs - -We can add gcc to Spack as an available compiler using the ``spack -compiler add`` command. This will allow future packages to build with -gcc@7.2.0. - -.. code-block:: console - - $ spack compiler add `spack location -i gcc@7.2.0` - ==> Added 1 new compiler to /home/ubuntu/.spack/linux/compilers.yaml - gcc@7.2.0 - ==> Compilers are defined in the following files: - /home/ubuntu/.spack/linux/compilers.yaml - -We can also remove compilers from our configuration using ``spack compiler remove `` - -.. code-block:: console - - $ spack compiler remove gcc@7.2.0 - ==> Removed compiler gcc@7.2.0 diff --git a/lib/spack/docs/tutorial_buildsystems.rst b/lib/spack/docs/tutorial_buildsystems.rst deleted file mode 100644 index 9f3785e7ee7..00000000000 --- a/lib/spack/docs/tutorial_buildsystems.rst +++ /dev/null @@ -1,807 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _build-systems-tutorial: - -============================== -Spack Package Build Systems -============================== - -You may begin to notice after writing a couple of package template files a -pattern emerge for some packages. For example, you may find yourself writing -an :code:`install()` method that invokes: :code:`configure`, :code:`cmake`, -:code:`make`, :code:`make install`. You may also find yourself writing -:code:`"prefix=" + prefix` as an argument to :code:`configure` or :code:`cmake`. -Rather than having you repeat these lines for all packages, Spack has -classes that can take care of these patterns. In addition, -these package files allow for finer grained control of these build systems. -In this section, we will describe each build system and give examples on -how these can be manipulated to install a package. - ------------------------ -Package Class Hierarchy ------------------------ - -.. graphviz:: - - digraph G { - - node [ - shape = "record" - ] - edge [ - arrowhead = "empty" - ] - - PackageBase -> Package [dir=back] - PackageBase -> MakefilePackage [dir=back] - PackageBase -> AutotoolsPackage [dir=back] - PackageBase -> CMakePackage [dir=back] - PackageBase -> PythonPackage [dir=back] - } - -The above diagram gives a high level view of the class hierarchy and how each -package relates. Each subclass inherits from the :code:`PackageBaseClass` -super class. The bulk of the work is done in this super class which includes -fetching, extracting to a staging directory and installing. Each subclass -then adds additional build-system-specific functionality. In the following -sections, we will go over examples of how to utilize each subclass and to see -how powerful these abstractions are when packaging. - ------------------ -Package ------------------ - -We've already seen examples of a :code:`Package` class in our walkthrough for writing -package files, so we won't be spending much time with them here. Briefly, -the Package class allows for abitrary control over the build process, whereas -subclasses rely on certain patterns (e.g. :code:`configure` :code:`make` -:code:`make install`) to be useful. :code:`Package` classes are particularly useful -for packages that have a non-conventional way of being built since the packager -can utilize some of Spack's helper functions to customize the building and -installing of a package. - -------------------- -Autotools -------------------- - -As we have seen earlier, packages using :code:`Autotools` use :code:`configure`, -:code:`make` and :code:`make install` commands to execute the build and -install process. In our :code:`Package` class, your typical build incantation will -consist of the following: - -.. code-block:: python - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") - -You'll see that this looks similar to what we wrote in our packaging tutorial. - -The :code:`Autotools` subclass aims to simplify writing package files and provides -convenience methods to manipulate each of the different phases for a :code:`Autotools` -build system. - -:code:`Autotools` packages consist of four phases: - -1. :code:`autoreconf()` -2. :code:`configure()` -3. :code:`build()` -4. :code:`install()` - - -Each of these phases have sensible defaults. Let's take a quick look at some -the internals of the :code:`Autotools` class: - -.. code-block:: console - - $ spack edit --build-system autotools - - -This will open the :code:`AutotoolsPackage` file in your text editor. - -.. note:: - The examples showing code for these classes is abridged to avoid having - long examples. We only show what is relevant to the packager. - - -.. literalinclude:: _spack_root/lib/spack/spack/build_systems/autotools.py - :language: python - :emphasize-lines: 33,36,54 - :lines: 30-76,240-248 - :linenos: - - -Important to note are the highlighted lines. These properties allow the -packager to set what build targets and install targets they want for their -package. If, for example, we wanted to add as our build target :code:`foo` -then we can append to our :code:`build_targets` property: - -.. code-block:: python - - build_targets = ["foo"] - -Which is similiar to invoking make in our Package - -.. code-block:: python - - make("foo") - -This is useful if we have packages that ignore environment variables and need -a command-line argument. - -Another thing to take note of is in the :code:`configure()` method. -Here we see that the :code:`prefix` argument is already included since it is a -common pattern amongst packages using :code:`Autotools`. We then only have to -override :code:`configure_args()`, which will then return it's output to -to :code:`configure()`. Then, :code:`configure()` will append the common -arguments - -Packagers also have the option to run :code:`autoreconf` in case a package -needs to update the build system and generate a new :code:`configure`. Though, -for the most part this will be unnecessary. - -Let's look at the :code:`mpileaks` package.py file that we worked on earlier: - -.. code-block:: console - - $ spack edit mpileaks - -Notice that mpileaks is a :code:`Package` class but uses the :code:`Autotools` -build system. Although this package is acceptable let's make this into an -:code:`AutotoolsPackage` class and simplify it further. - -.. literalinclude:: tutorial/examples/Autotools/0.package.py - :language: python - :emphasize-lines: 9 - :linenos: - -We first inherit from the :code:`AutotoolsPackage` class. - - -Although we could keep the :code:`install()` method, most of it can be handled -by the :code:`AutotoolsPackage` base class. In fact, the only thing that needs -to be overridden is :code:`configure_args()`. - -.. literalinclude:: tutorial/examples/Autotools/1.package.py - :language: python - :emphasize-lines: 25,26,27,28,29,30,31,32 - :linenos: - -Since Spack takes care of setting the prefix for us we can exclude that as -an argument to :code:`configure`. Our packages look simpler, and the packager -does not need to worry about whether they have properly included :code:`configure` -and :code:`make`. - -This version of the :code:`mpileaks` package installs the same as the previous, -but the :code:`AutotoolsPackage` class lets us do it with a cleaner looking -package file. - ------------------ -Makefile ------------------ - -Packages that utilize :code:`Make` or a :code:`Makefile` usually require you -to edit a :code:`Makefile` to set up platform and compiler specific variables. -These packages are handled by the :code:`Makefile` subclass which provides -convenience methods to help write these types of packages. - -A :code:`MakefilePackage` class has three phases that can be overridden. These include: - - 1. :code:`edit()` - 2. :code:`build()` - 3. :code:`install()` - -Packagers then have the ability to control how a :code:`Makefile` is edited, and -what targets to include for the build phase or install phase. - -Let's also take a look inside the :code:`MakefilePackage` class: - -.. code-block:: console - - $ spack edit --build-system makefile - -Take note of the following: - - -.. literalinclude:: _spack_root/lib/spack/spack/build_systems/makefile.py - :language: python - :lines: 14,43-61,70-88 - :emphasize-lines: 21,27,34 - :linenos: - -Similar to :code:`Autotools`, :code:`MakefilePackage` class has properties -that can be set by the packager. We can also override the different -methods highlighted. - - -Let's try to recreate the Bowtie_ package: - -.. _Bowtie: http://bowtie-bio.sourceforge.net/index.shtml - - -.. code-block:: console - - $ spack create -f https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip - ==> This looks like a URL for bowtie - ==> Found 1 version of bowtie: - - 1.2.1.1 https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip - - ==> How many would you like to checksum? (default is 1, q to abort) 1 - ==> Downloading... - ==> Fetching https://downloads.sourceforge.net/project/bowtie-bio/bowtie/1.2.1.1/bowtie-1.2.1.1-src.zip - ######################################################################## 100.0% - ==> Checksummed 1 version of bowtie - ==> This package looks like it uses the makefile build system - ==> Created template for bowtie package - ==> Created package file: /Users/mamelara/spack/var/spack/repos/builtin/packages/bowtie/package.py - -Once the fetching is completed, Spack will open up your text editor in the -usual fashion and create a template of a :code:`MakefilePackage` package.py. - -.. literalinclude:: tutorial/examples/Makefile/0.package.py - :language: python - :linenos: - -Spack was successfully able to detect that :code:`Bowtie` uses :code:`Make`. -Let's add in the rest of our details for our package: - -.. literalinclude:: tutorial/examples/Makefile/1.package.py - :language: python - :emphasize-lines: 10,11,13,14,18,20 - :linenos: - -As we mentioned earlier, most packages using a :code:`Makefile` have hard-coded -variables that must be edited. These variables are fine if you happen to not -care about setup or types of compilers used but Spack is designed to work with -any compiler. The :code:`MakefilePackage` subclass makes it easy to edit -these :code:`Makefiles` by having an :code:`edit()` method that -can be overridden. - -Let's take a look at the default :code:`Makefile` that :code:`Bowtie` provides. -If we look inside, we see that :code:`CC` and :code:`CXX` point to our GNU -compiler: - -.. code-block:: console - - $ spack stage bowtie - -.. note:: - As usual make sure you have shell support activated with spack: - :code:`source /path/to/spack_root/spack/share/spack/setup-env.sh` - -.. code-block:: console - - $ spack cd -s bowtie - $ cd bowtie-1.2 - $ vim Makefile - - -.. code-block:: make - - CPP = g++ -w - CXX = $(CPP) - CC = gcc - LIBS = $(LDFLAGS) -lz - HEADERS = $(wildcard *.h) - -To fix this, we need to use the :code:`edit()` method to write our custom -:code:`Makefile`. - -.. literalinclude:: tutorial/examples/Makefile/2.package.py - :language: python - :emphasize-lines: 23,24,25 - :linenos: - -Here we use a :code:`FileFilter` object to edit our :code:`Makefile`. It takes -in a regular expression and then replaces :code:`CC` and :code:`CXX` to whatever -Spack sets :code:`CC` and :code:`CXX` environment variables to. This allows us to -build :code:`Bowtie` with whatever compiler we specify through Spack's -:code:`spec` syntax. - -Let's change the build and install phases of our package: - -.. literalinclude:: tutorial/examples/Makefile/3.package.py - :language: python - :emphasize-lines: 28,29,30,31,32,35,36 - :linenos: - -Here demonstrate another strategy that we can use to manipulate our package -We can provide command-line arguments to :code:`make()`. Since :code:`Bowtie` -can use :code:`tbb` we can either add :code:`NO_TBB=1` as a argument to prevent -:code:`tbb` support or we can just invoke :code:`make` with no arguments. - -:code:`Bowtie` requires our :code:`install_target` to provide a path to -the install directory. We can do this by providing :code:`prefix=` as a command -line argument to :code:`make()`. - -Let's look at a couple of other examples and go through them: - -.. code-block:: console - - $ spack edit esmf - -Some packages allow environment variables to be set and will honor them. -Packages that use :code:`?=` for assignment in their :code:`Makefile` -can be set using environment variables. In our :code:`esmf` example we -set two environment variables in our :code:`edit()` method: - -.. code-block:: python - - def edit(self, spec, prefix): - for var in os.environ: - if var.startswith('ESMF_'): - os.environ.pop(var) - - # More code ... - - if self.compiler.name == 'gcc': - os.environ['ESMF_COMPILER'] = 'gfortran' - elif self.compiler.name == 'intel': - os.environ['ESMF_COMPILER'] = 'intel' - elif self.compiler.name == 'clang': - os.environ['ESMF_COMPILER'] = 'gfortranclang' - elif self.compiler.name == 'nag': - os.environ['ESMF_COMPILER'] = 'nag' - elif self.compiler.name == 'pgi': - os.environ['ESMF_COMPILER'] = 'pgi' - else: - msg = "The compiler you are building with, " - msg += "'{0}', is not supported by ESMF." - raise InstallError(msg.format(self.compiler.name)) - -As you may have noticed, we didn't really write anything to the :code:`Makefile` -but rather we set environment variables that will override variables set in -the :code:`Makefile`. - -Some packages include a configuration file that sets certain compiler variables, -platform specific variables, and the location of dependencies or libraries. -If the file is simple and only requires a couple of changes, we can overwrite -those entries with our :code:`FileFilter` object. If the configuration involves -complex changes, we can write a new configuration file from scratch. - -Let's look at an example of this in the :code:`elk` package: - -.. code-block:: console - - $ spack edit elk - -.. code-block:: python - - def edit(self, spec, prefix): - # Dictionary of configuration options - config = { - 'MAKE': 'make', - 'AR': 'ar' - } - - # Compiler-specific flags - flags = '' - if self.compiler.name == 'intel': - flags = '-O3 -ip -unroll -no-prec-div' - elif self.compiler.name == 'gcc': - flags = '-O3 -ffast-math -funroll-loops' - elif self.compiler.name == 'pgi': - flags = '-O3 -lpthread' - elif self.compiler.name == 'g95': - flags = '-O3 -fno-second-underscore' - elif self.compiler.name == 'nag': - flags = '-O4 -kind=byte -dusty -dcfuns' - elif self.compiler.name == 'xl': - flags = '-O3' - config['F90_OPTS'] = flags - config['F77_OPTS'] = flags - - # BLAS/LAPACK support - # Note: BLAS/LAPACK must be compiled with OpenMP support - # if the +openmp variant is chosen - blas = 'blas.a' - lapack = 'lapack.a' - if '+blas' in spec: - blas = spec['blas'].libs.joined() - if '+lapack' in spec: - lapack = spec['lapack'].libs.joined() - # lapack must come before blas - config['LIB_LPK'] = ' '.join([lapack, blas]) - - # FFT support - if '+fft' in spec: - config['LIB_FFT'] = join_path(spec['fftw'].prefix.lib, - 'libfftw3.so') - config['SRC_FFT'] = 'zfftifc_fftw.f90' - else: - config['LIB_FFT'] = 'fftlib.a' - config['SRC_FFT'] = 'zfftifc.f90' - - # MPI support - if '+mpi' in spec: - config['F90'] = spec['mpi'].mpifc - config['F77'] = spec['mpi'].mpif77 - else: - config['F90'] = spack_fc - config['F77'] = spack_f77 - config['SRC_MPI'] = 'mpi_stub.f90' - - # OpenMP support - if '+openmp' in spec: - config['F90_OPTS'] += ' ' + self.compiler.openmp_flag - config['F77_OPTS'] += ' ' + self.compiler.openmp_flag - else: - config['SRC_OMP'] = 'omp_stub.f90' - - # Libxc support - if '+libxc' in spec: - config['LIB_libxc'] = ' '.join([ - join_path(spec['libxc'].prefix.lib, 'libxcf90.so'), - join_path(spec['libxc'].prefix.lib, 'libxc.so') - ]) - config['SRC_libxc'] = ' '.join([ - 'libxc_funcs.f90', - 'libxc.f90', - 'libxcifc.f90' - ]) - else: - config['SRC_libxc'] = 'libxcifc_stub.f90' - - # Write configuration options to include file - with open('make.inc', 'w') as inc: - for key in config: - inc.write('{0} = {1}\n'.format(key, config[key])) - -:code:`config` is just a dictionary that we can add key-value pairs to. By the -end of the :code:`edit()` method we write the contents of our dictionary to -:code:`make.inc`. - ---------------- -CMake ---------------- - -CMake_ is another common build system that has been gaining popularity. It works -in a similar manner to :code:`Autotools` but with differences in variable names, -the number of configuration options available, and the handling of shared libraries. -Typical build incantations look like this: - -.. _CMake: https://cmake.org - -.. code-block:: python - - def install(self, spec, prefix): - cmake("-DCMAKE_INSTALL_PREFIX:PATH=/path/to/install_dir ..") - make() - make("install") - -As you can see from the example above, it's very similar to invoking -:code:`configure` and :code:`make` in an :code:`Autotools` build system. However, -the variable names and options differ. Most options in CMake are prefixed -with a :code:`'-D'` flag to indicate a configuration setting. - -In the :code:`CMakePackage` class we can override the following phases: - -1. :code:`cmake()` -2. :code:`build()` -3. :code:`install()` - -The :code:`CMakePackage` class also provides sensible defaults so we only need to -override :code:`cmake_args()`. - -Let's look at these defaults in the :code:`CMakePackage` class in the :code:`_std_args()` method: - -.. code-block:: console - - $ spack edit --build-system cmake - -.. literalinclude:: _spack_root/lib/spack/spack/build_systems/cmake.py - :language: python - :lines: 102-147 - :emphasize-lines: 10,18,24,36,37,38,44 - :linenos: - -Some :code:`CMake` packages use different generators. Spack is able to support -Unix-Makefile_ generators as well as Ninja_ generators. - -.. _Unix-Makefile: https://cmake.org/cmake/help/v3.4/generator/Unix%20Makefiles.html -.. _Ninja: https://cmake.org/cmake/help/v3.4/generator/Ninja.html - -If no generator is specified Spack will default to :code:`Unix Makefiles`. - -Next we setup the build type. In :code:`CMake` you can specify the build type -that you want. Options include: - -1. :code:`empty` -2. :code:`Debug` -3. :code:`Release` -4. :code:`RelWithDebInfo` -5. :code:`MinSizeRel` - -With these options you can specify whether you want your executable to have -the debug version only, release version or the release with debug information. -Release executables tend to be more optimized than Debug. In Spack, we set -the default as RelWithDebInfo unless otherwise specified through a variant. - -Spack then automatically sets up the :code:`-DCMAKE_INSTALL_PREFIX` path, -appends the build type (:code:`RelWithDebInfo` default), and then specifies a verbose -:code:`Makefile`. - -Next we add the :code:`rpaths` to :code:`-DCMAKE_INSTALL_RPATH:STRING`. - - -Finally we add to :code:`-DCMAKE_PREFIX_PATH:STRING` the locations of all our -dependencies so that :code:`CMake` can find them. - -In the end our :code:`cmake` line will look like this (example is :code:`xrootd`): - -.. code-block:: console - - $ cmake $HOME/spack/var/spack/stage/xrootd-4.6.0-4ydm74kbrp4xmcgda5upn33co5pwddyk/xrootd-4.6.0 -G Unix Makefiles -DCMAKE_INSTALL_PREFIX:PATH=$HOME/spack/opt/spack/darwin-sierra-x86_64/clang-9.0.0-apple/xrootd-4.6.0-4ydm74kbrp4xmcgda5upn33co5pwddyk -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_FIND_FRAMEWORK:STRING=LAST -DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=FALSE -DCMAKE_INSTALL_RPATH:STRING=$HOME/spack/opt/spack/darwin-sierra-x86_64/clang-9.0.0-apple/xrootd-4.6.0-4ydm74kbrp4xmcgda5upn33co5pwddyk/lib:$HOME/spack/opt/spack/darwin-sierra-x86_64/clang-9.0.0-apple/xrootd-4.6.0-4ydm74kbrp4xmcgda5upn33co5pwddyk/lib64 -DCMAKE_PREFIX_PATH:STRING=$HOME/spack/opt/spack/darwin-sierra-x86_64/clang-9.0.0-apple/cmake-3.9.4-hally3vnbzydiwl3skxcxcbzsscaasx5 - -We can see now how :code:`CMake` takes care of a lot of the boilerplate code -that would have to be otherwise typed in. - -Let's try to recreate callpath_: - -.. _callpath: https://github.com/LLNL/callpath.git - -.. code-block:: console - - $ spack create -f https://github.com/llnl/callpath/archive/v1.0.3.tar.gz - ==> This looks like a URL for callpath - ==> Found 4 versions of callpath: - - 1.0.3 https://github.com/LLNL/callpath/archive/v1.0.3.tar.gz - 1.0.2 https://github.com/LLNL/callpath/archive/v1.0.2.tar.gz - 1.0.1 https://github.com/LLNL/callpath/archive/v1.0.1.tar.gz - 1.0 https://github.com/LLNL/callpath/archive/v1.0.tar.gz - - ==> How many would you like to checksum? (default is 1, q to abort) 1 - ==> Downloading... - ==> Fetching https://github.com/LLNL/callpath/archive/v1.0.3.tar.gz - ######################################################################## 100.0% - ==> Checksummed 1 version of callpath - ==> This package looks like it uses the cmake build system - ==> Created template for callpath package - ==> Created package file: /Users/mamelara/spack/var/spack/repos/builtin/packages/callpath/package.py - - -which then produces the following template: - -.. literalinclude:: tutorial/examples/Cmake/0.package.py - :language: python - :linenos: - -Again we fill in the details: - -.. literalinclude:: tutorial/examples/Cmake/1.package.py - :language: python - :linenos: - :emphasize-lines: 9,13,14,18,19,20,21,22,23 - -As mentioned earlier, Spack will use sensible defaults to prevent repeated code -and to make writing :code:`CMake` package files simpler. - -In callpath, we want to add options to :code:`CALLPATH_WALKER` as well as add -compiler flags. We add the following options like so: - -.. literalinclude:: tutorial/examples/Cmake/2.package.py - :language: python - :linenos: - :emphasize-lines: 26,30,31 - -Now we can control our build options using :code:`cmake_args()`. If defaults are -sufficient enough for the package, we can leave this method out. - -:code:`CMakePackage` classes allow for control of other features in the -build system. For example, you can specify the path to the "out of source" -build directory and also point to the root of the :code:`CMakeLists.txt` file if it -is placed in a non-standard location. - -A good example of a package that has its :code:`CMakeLists.txt` file located at a -different location is found in :code:`spades`. - -.. code-block:: console - - $ spack edit spades - -.. code-block:: python - - root_cmakelists_dir = "src" - -Here :code:`root_cmakelists_dir` will tell Spack where to find the location -of :code:`CMakeLists.txt`. In this example, it is located a directory level below in -the :code:`src` directory. - -Some :code:`CMake` packages also require the :code:`install` phase to be -overridden. For example, let's take a look at :code:`sniffles`. - -.. code-block:: console - - $ spack edit sniffles - -In the :code:`install()` method, we have to manually install our targets -so we override the :code:`install()` method to do it for us: - -.. code-block:: python - - # the build process doesn't actually install anything, do it by hand - def install(self, spec, prefix): - mkdir(prefix.bin) - src = "bin/sniffles-core-{0}".format(spec.version.dotted) - binaries = ['sniffles', 'sniffles-debug'] - for b in binaries: - install(join_path(src, b), join_path(prefix.bin, b)) - - --------------- -PythonPackage --------------- - -Python extensions and modules are built differently from source than most -applications. Python uses a :code:`setup.py` script to install Python modules. -The script consists of a call to :code:`setup()` which provides the information -required to build a module to Distutils. If you're familiar with pip or -easy_install, setup.py does the same thing. - -These modules are usually installed using the following line: - -.. code-block:: console - - $ python setup.py install - -There are also a list of commands and phases that you can call. To see the full -list you can run: - -.. code-block:: console - - $ python setup.py --help-commands - Standard commands: - build build everything needed to install - build_py "build" pure Python modules (copy to build directory) - build_ext build C/C++ extensions (compile/link to build directory) - build_clib build C/C++ libraries used by Python extensions - build_scripts "build" scripts (copy and fixup #! line) - clean (no description available) - install install everything from build directory - install_lib install all Python modules (extensions and pure Python) - install_headers install C/C++ header files - install_scripts install scripts (Python or otherwise) - install_data install data files - sdist create a source distribution (tarball, zip file, etc.) - register register the distribution with the Python package index - bdist create a built (binary) distribution - bdist_dumb create a "dumb" built distribution - bdist_rpm create an RPM distribution - bdist_wininst create an executable installer for MS Windows - upload upload binary package to PyPI - check perform some checks on the package - - -We can write package files for Python packages using the :code:`Package` class, -but the class brings with it a lot of methods that are useless for Python packages. -Instead, Spack has a :code:`PythonPackage` subclass that allows packagers -of Python modules to be able to invoke :code:`setup.py` and use :code:`Distutils`, -which is much more familiar to a typical python user. - -To see the defaults that Spack has for each a methods, we will take a look -at the :code:`PythonPackage` class: - -.. code-block:: console - - $ spack edit --build-system python - -We see the following: - - -.. literalinclude:: _spack_root/lib/spack/spack/build_systems/python.py - :language: python - :lines: 19,146-357 - :linenos: - -Each of these methods have sensible defaults or they can be overridden. - -We will write a package file for Pandas_: - -.. _pandas: https://pandas.pydata.org - -.. code-block:: console - - $ spack create -f https://pypi.io/packages/source/p/pandas/pandas-0.19.0.tar.gz - ==> This looks like a URL for pandas - ==> Warning: Spack was unable to fetch url list due to a certificate verification problem. You can try running spack -k, which will not check SSL certificates. Use this at your own risk. - ==> Found 1 version of pandas: - - 0.19.0 https://pypi.io/packages/source/p/pandas/pandas-0.19.0.tar.gz - - ==> How many would you like to checksum? (default is 1, q to abort) 1 - ==> Downloading... - ==> Fetching https://pypi.io/packages/source/p/pandas/pandas-0.19.0.tar.gz - ######################################################################## 100.0% - ==> Checksummed 1 version of pandas - ==> This package looks like it uses the python build system - ==> Changing package name from pandas to py-pandas - ==> Created template for py-pandas package - ==> Created package file: /Users/mamelara/spack/var/spack/repos/builtin/packages/py-pandas/package.py - -And we are left with the following template: - -.. literalinclude:: tutorial/examples/PyPackage/0.package.py - :language: python - :linenos: - -As you can see this is not any different than any package template that we have -written. We have the choice of providing build options or using the sensible -defaults - -Luckily for us, there is no need to provide build args. - -Next we need to find the dependencies of a package. Dependencies are usually -listed in :code:`setup.py`. You can find the dependencies by searching for -:code:`install_requires` keyword in that file. Here it is for :code:`Pandas`: - -.. code-block:: python - - # ... code - if sys.version_info[0] >= 3: - - setuptools_kwargs = { - 'zip_safe': False, - 'install_requires': ['python-dateutil >= 2', - 'pytz >= 2011k', - 'numpy >= %s' % min_numpy_ver], - 'setup_requires': ['numpy >= %s' % min_numpy_ver], - } - if not _have_setuptools: - sys.exit("need setuptools/distribute for Py3k" - "\n$ pip install distribute") - - # ... more code - -You can find a more comprehensive list at the Pandas documentation_. - -.. _documentation: https://pandas.pydata.org/pandas-docs/stable/install.html - - -By reading the documentation and :code:`setup.py` we found that :code:`Pandas` -depends on :code:`python-dateutil`, :code:`pytz`, and :code:`numpy`, :code:`numexpr`, -and finally :code:`bottleneck`. - -Here is the completed :code:`Pandas` script: - -.. literalinclude:: tutorial/examples/PyPackage/1.package.py - :language: python - :linenos: - -It is quite important to declare all the dependencies of a Python package. -Spack can "activate" Python packages to prevent the user from having to -load each dependency module explictly. If a dependency is missed, Spack will -be unable to properly activate the package and it will cause an issue. To -learn more about extensions go to :ref:`cmd-spack-extensions`. - -From this example, you can see that building Python modules is made easy -through the :code:`PythonPackage` class. - -------------------- -Other Build Systems -------------------- - -Although we won't get in depth with any of the other build systems that Spack -supports, it is worth mentioning that Spack does provide subclasses -for the following build systems: - -1. :code:`IntelPackage` -2. :code:`SconsPackage` -3. :code:`WafPackage` -4. :code:`RPackage` -5. :code:`PerlPackage` -6. :code:`QMakePackage` - - -Each of these classes have their own abstractions to help assist in writing -package files. For whatever doesn't fit nicely into the other build-systems, -you can use the :code:`Package` class. - -Hopefully by now you can see how we aim to make packaging simple and -robust through these classes. If you want to learn more about these build -systems, check out :ref:`installation_procedure` in the Packaging Guide. diff --git a/lib/spack/docs/tutorial_configuration.rst b/lib/spack/docs/tutorial_configuration.rst deleted file mode 100644 index 879bb949670..00000000000 --- a/lib/spack/docs/tutorial_configuration.rst +++ /dev/null @@ -1,951 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _configs-tutorial: - -====================== -Configuration Tutorial -====================== - -This tutorial will guide you through various configuration options -that allow you to customize Spack's behavior with respect to -software installation. We will first cover the configuration file -hierarchy. Then, we will cover configuration options for compilers, -focusing on how they can be used to extend Spack's compiler auto-detection. -Next, we will cover the packages configuration file, focusing on -how it can be used to override default build options as well as -specify external package installations to use. Finally, we will -briefly touch on the config configuration file, which manages more -high-level Spack configuration options. - -For all of these features, we will demonstrate how we build up a full -configuration file. For some, we will then demonstrate how the -configuration affects the install command, and for others we will use -the ``spack spec`` command to demonstrate how the configuration -changes have affected Spack's concretization algorithm. The provided -output is all from a server running Ubuntu version 16.04. - -.. _configs-tutorial-scopes: - --------------------- -Configuration Scopes --------------------- - -Depending on your use case, you may want to provide configuration -settings common to everyone on your team, or you may want to set -default behaviors specific to a single user account. Spack provides -six configuration *scopes* to handle this customization. These scopes, -in order of decreasing priority, are: - -============ =================================================== -Scope Directory -============ =================================================== -Command-line N/A -Custom Custom directory, specified with ``--config-scope`` -User ``~/.spack/`` -Site ``$SPACK_ROOT/etc/spack/`` -System ``/etc/spack/`` -Defaults ``$SPACK_ROOT/etc/spack/defaults/`` -============ =================================================== - -Spack's default configuration settings reside in -``$SPACK_ROOT/etc/spack/defaults``. These are useful for reference, -but should never be directly edited. To override these settings, -create new configuration files in any of the higher-priority -configuration scopes. - -A particular cluster may have multiple Spack installations associated -with different projects. To provide settings common to all Spack -installations, put your configuration files in ``/etc/spack``. -To provide settings specific to a particular Spack installation, -you can use the ``$SPACK_ROOT/etc/spack`` directory. - -For settings specific to a particular user, you will want to add -configuration files to the ``~/.spack`` directory. When Spack first -checked for compilers on your system, you may have noticed that it -placed your compiler configuration in this directory. - -Configuration settings can also be placed in a custom location, -which is then specified on the command line via ``--config-scope``. -An example use case is managing two sets of configurations, one for -development and another for production preferences. - -Settings specified on the command line have precedence over all -other configuration scopes. - -You can also use ``spack config blame `` for displaying -the effective configuration. Spack will show from which scopes -the configuration has been assembled. - -^^^^^^^^^^^^^^^^^^^^^^^^ -Platform-specific Scopes -^^^^^^^^^^^^^^^^^^^^^^^^ - -Some facilities manage multiple platforms from a single shared -file system. In order to handle this, each of the configuration -scopes listed above has two *sub-scopes*: platform-specific and -platform-independent. For example, compiler settings can be stored -in ``compilers.yaml`` configuration files in the following locations: - -#. ``~/.spack//compilers.yaml`` -#. ``~/.spack/compilers.yaml`` -#. ``$SPACK_ROOT/etc/spack//compilers.yaml`` -#. ``$SPACK_ROOT/etc/spack/compilers.yaml`` -#. ``/etc/spack//compilers.yaml`` -#. ``/etc/spack/compilers.yaml`` -#. ``$SPACK_ROOT/etc/defaults//compilers.yaml`` -#. ``$SPACK_ROOT/etc/defaults/compilers.yaml`` - -These files are listed in decreasing order of precedence, so files in -``~/.spack/`` will override settings in ``~/.spack``. - ------------ -YAML Format ------------ - -Spack configurations are YAML dictionaries. Every configuration file -begins with a top-level dictionary that tells Spack which -configuration set it modifies. When Spack checks its configuration, -the configuration scopes are updated as dictionaries in increasing -order of precedence, allowing higher precedence files to override -lower. YAML dictionaries use a colon ":" to specify key-value -pairs. Spack extends YAML syntax slightly to allow a double-colon -"::" to specify a key-value pair. When a double-colon is used to -specify a key-value pair, instead of adding that section, Spack -replaces what was in that section with the new value. For example, -consider a user's compilers configuration file as follows: - -.. code-block:: yaml - - compilers:: - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/gcc - cxx: /usr/bin/g++ - f77: /usr/bin/gfortran - fc: /usr/bin/gfortran - spec: gcc@5.4.0 - target: x86_64 - - -This ensures that no other compilers are used, as the user configuration -scope is the last scope searched and the ``compilers::`` line replaces -all previous configuration files information. If the same -configuration file had a single colon instead of the double colon, it -would add the GCC version 5.4.0 compiler to whatever other compilers -were listed in other configuration files. - -.. _configs-tutorial-compilers: - ----------------------- -Compiler Configuration ----------------------- - -For most tasks, we can use Spack with the compilers auto-detected the -first time Spack runs on a system. As discussed in the basic -installation tutorial, we can also tell Spack where compilers are -located using the ``spack compiler add`` command. However, in some -circumstances we want even more fine-grained control over the -compilers available. This section will teach you how to exercise that -control using the compilers configuration file. - -We will start by opening the compilers configuration file: - -.. code-block:: console - - $ spack config edit compilers - - -.. code-block:: yaml - - compilers: - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/clang-3.7 - cxx: /usr/bin/clang++-3.7 - f77: null - fc: null - spec: clang@3.7.1-2ubuntu2 - target: x86_64 - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/clang - cxx: /usr/bin/clang++ - f77: null - fc: null - spec: clang@3.8.0-2ubuntu4 - target: x86_64 - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/gcc-4.7 - cxx: /usr/bin/g++-4.7 - f77: /usr/bin/gfortran-4.7 - fc: /usr/bin/gfortran-4.7 - spec: gcc@4.7 - target: x86_64 - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/gcc - cxx: /usr/bin/g++ - f77: /usr/bin/gfortran - fc: /usr/bin/gfortran - spec: gcc@5.4.0 - target: x86_64 - - -This specifies two versions of the GCC compiler and two versions of the -Clang compiler with no Flang compiler. Now suppose we have a code that -we want to compile with the Clang compiler for C/C++ code, but with -gfortran for Fortran components. We can do this by adding another entry -to the ``compilers.yaml`` file. - -.. code-block:: yaml - - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/clang - cxx: /usr/bin/clang++ - f77: /usr/bin/gfortran - fc: /usr/bin/gfortran - spec: clang@3.8.0-gfortran - target: x86_64 - - -Let's talk about the sections of this compiler entry that we've changed. -The biggest change we've made is to the ``paths`` section. This lists -the paths to the compilers to use for each language/specification. -In this case, we point to the Clang compiler for C/C++ and the gfortran -compiler for both specifications of Fortran. We've also changed the -``spec`` entry for this compiler. The ``spec`` entry is effectively the -name of the compiler for Spack. It consists of a name and a version -number, separated by the ``@`` sigil. The name must be one of the supported -compiler names in Spack (gcc, intel, pgi, xl, xl_r, clang, nag, cce, arm). -The version number can be an arbitrary string of alphanumeric characters, -as well as ``-``, ``.``, and ``_``. The ``target`` and ``operating_system`` -sections we leave unchanged. These sections specify when Spack can use -different compilers, and are primarily useful for configuration files that -will be used across multiple systems. - -We can verify that our new compiler works by invoking it now: - -.. code-block:: console - - $ spack install --no-cache zlib %clang@3.8.0-gfortran - ... - - -This new compiler also works on Fortran codes: - -.. code-block:: console - - $ spack install --no-cache cfitsio~bzip2 %clang@3.8.0-gfortran - ... - - -^^^^^^^^^^^^^^ -Compiler Flags -^^^^^^^^^^^^^^ - -Some compilers may require specific compiler flags to work properly in -a particular computing environment. Spack provides configuration -options for setting compiler flags every time a specific compiler is -invoked. These flags become part of the package spec and therefore of -the build provenance. As on the command line, the flags are set -through the implicit build variables ``cflags``, ``cxxflags``, ``cppflags``, -``fflags``, ``ldflags``, and ``ldlibs``. - -Let's open our compilers configuration file again and add a compiler flag: - -.. code-block:: yaml - - - compiler: - environment: {} - extra_rpaths: [] - flags: - cppflags: -g - modules: [] - operating_system: ubuntu16.04 - paths: - cc: /usr/bin/clang - cxx: /usr/bin/clang++ - f77: /usr/bin/gfortran - fc: /usr/bin/gfortran - spec: clang@3.8.0-gfortran - target: x86_64 - - -We can test this out using the ``spack spec`` command to show how the -spec is concretized: - -.. code-block:: console - - $ spack spec cfitsio %clang@3.8.0-gfortran - Input spec - -------------------------------- - cfitsio%clang@3.8.0-gfortran - - Normalized - -------------------------------- - cfitsio%clang@3.8.0-gfortran - - Concretized - -------------------------------- - cfitsio@3.410%clang@3.8.0-gfortran cppflags="-g" +bzip2+shared arch=linux-ubuntu16.04-x86_64 - ^bzip2@1.0.6%clang@3.8.0-gfortran cppflags="-g" +shared arch=linux-ubuntu16.04-x86_64 - - -We can see that ``cppflags="-g"`` has been added to every node in the DAG. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Advanced Compiler Configuration -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There are three fields of the compiler configuration entry that we -have not yet talked about. - -The ``modules`` field of the compiler is used primarily on Cray systems, -but can be useful on any system that has compilers that are only -useful when a particular module is loaded. Any modules in the -``modules`` field of the compiler configuration will be loaded as part -of the build environment for packages using that compiler. - -The ``extra_rpaths`` field of the compiler configuration is used for -compilers that do not rpath all of their dependencies by -default. Since compilers are often installed externally to Spack, -Spack is unable to manage compiler dependencies and enforce -rpath usage. This can lead to packages not finding link dependencies -imposed by the compiler properly. For compilers that impose link -dependencies on the resulting executables that are not rpath'ed into -the executable automatically, the ``extra_rpaths`` field of the compiler -configuration tells Spack which dependencies to rpath into every -executable created by that compiler. The executables will then be able -to find the link dependencies imposed by the compiler. As an example, -this field can be set by: - -.. code-block:: yaml - - - compiler: - ... - extra_rpaths: - - /apps/intel/ComposerXE2017/compilers_and_libraries_2017.5.239/linux/compiler/lib/intel64_lin - ... - - -The ``environment`` field of the compiler configuration is used for -compilers that require environment variables to be set during build -time. For example, if your Intel compiler suite requires the -``INTEL_LICENSE_FILE`` environment variable to point to the proper -license server, you can set this in ``compilers.yaml`` as follows: - -.. code-block:: yaml - - - compiler: - environment: - set: - INTEL_LICENSE_FILE: 1713@license4 - ... - - -In addition to ``set``, ``environment`` also supports ``unset``, -``prepend-path``, and ``append-path``. - -.. _configs-tutorial-package-prefs: - -------------------------------- -Configuring Package Preferences -------------------------------- - -Package preferences in Spack are managed through the ``packages.yaml`` -configuration file. First, we will look at the default -``packages.yaml`` file. - -.. code-block:: console - - $ spack config --scope defaults edit packages - - -.. literalinclude:: _spack_root/etc/spack/defaults/packages.yaml - :language: yaml - - -This sets the default preferences for compilers and for providers of -virtual packages. To illustrate how this works, suppose we want to -change the preferences to prefer the Clang compiler and to prefer -MPICH over OpenMPI. Currently, we prefer GCC and OpenMPI. - -.. code-block:: console - - $ spack spec hdf5 - Input spec - -------------------------------- - hdf5 - - Concretized - -------------------------------- - hdf5@1.10.4%gcc@5.4.0~cxx~debug~fortran~hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^openmpi@3.1.3%gcc@5.4.0~cuda+cxx_exceptions fabrics= ~java~legacylaunchers~memchecker~pmi schedulers= ~sqlite3~thread_multiple+vt arch=linux-ubuntu16.04-x86_64 - ^hwloc@1.11.9%gcc@5.4.0~cairo~cuda+libxml2+pci+shared arch=linux-ubuntu16.04-x86_64 - ^libpciaccess@0.13.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^util-macros@1.19.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^libxml2@2.9.8%gcc@5.4.0~python arch=linux-ubuntu16.04-x86_64 - ^xz@5.2.4%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - ^numactl@2.0.11%gcc@5.4.0 patches=592f30f7f5f757dfc239ad0ffd39a9a048487ad803c26b419e0f96b8cda08c1a arch=linux-ubuntu16.04-x86_64 - ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - - -Now we will open the packages configuration file and update our -preferences. - -.. code-block:: console - - $ spack config edit packages - - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - - -Because of the configuration scoping we discussed earlier, this -overrides the default settings just for these two items. - -.. code-block:: console - - $ spack spec hdf5 - Input spec - -------------------------------- - hdf5 - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^mpich@3.2.1%clang@3.8.0-2ubuntu4 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64 - ^findutils@4.6.0%clang@3.8.0-2ubuntu4 patches=84b916c0bf8c51b7e7b28417692f0ad3e7030d1f3c248ba77c42ede5c1c5d11e,bd9e4e5cc280f9753ae14956c4e4aa17fe7a210f55dd6c84aa60b12d106d47a2 arch=linux-ubuntu16.04-x86_64 - ^autoconf@2.69%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^m4@1.4.18%clang@3.8.0-2ubuntu4 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - ^libsigsegv@2.11%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^perl@5.26.2%clang@3.8.0-2ubuntu4+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - ^gdbm@1.14.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^readline@7.0%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^ncurses@6.1%clang@3.8.0-2ubuntu4~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - ^pkgconf@1.4.2%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^automake@1.16.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^libtool@2.4.6%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^texinfo@6.5%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.11%clang@3.8.0-2ubuntu4+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - - -^^^^^^^^^^^^^^^^^^^ -Variant Preferences -^^^^^^^^^^^^^^^^^^^ - -The packages configuration file can also set variant preferences for -package variants. For example, let's change our preferences to build all -packages without shared libraries. We will accomplish this by turning -off the ``shared`` variant on all packages that have one. - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - variants: ~shared - - -We can check the effect of this command with ``spack spec hdf5`` again. - -.. code-block:: console - - $ spack spec hdf5 - Input spec - -------------------------------- - hdf5 - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl+mpi+pic~shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^mpich@3.2.1%clang@3.8.0-2ubuntu4 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64 - ^findutils@4.6.0%clang@3.8.0-2ubuntu4 patches=84b916c0bf8c51b7e7b28417692f0ad3e7030d1f3c248ba77c42ede5c1c5d11e,bd9e4e5cc280f9753ae14956c4e4aa17fe7a210f55dd6c84aa60b12d106d47a2 arch=linux-ubuntu16.04-x86_64 - ^autoconf@2.69%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^m4@1.4.18%clang@3.8.0-2ubuntu4 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - ^libsigsegv@2.11%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^perl@5.26.2%clang@3.8.0-2ubuntu4+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac ~shared+threads arch=linux-ubuntu16.04-x86_64 - ^gdbm@1.14.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^readline@7.0%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^ncurses@6.1%clang@3.8.0-2ubuntu4~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - ^pkgconf@1.4.2%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^automake@1.16.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^libtool@2.4.6%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^texinfo@6.5%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.11%clang@3.8.0-2ubuntu4+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - - -So far we have only made global changes to the package preferences. As -we've seen throughout this tutorial, HDF5 builds with MPI enabled by -default in Spack. If we were working on a project that would routinely -need serial HDF5, that might get annoying quickly, having to type -``hdf5~mpi`` all the time. Instead, we'll update our preferences for -HDF5. - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - variants: ~shared - hdf5: - variants: ~mpi - - -Now hdf5 will concretize without an MPI dependency by default. - -.. code-block:: console - - $ spack spec hdf5 - Input spec - -------------------------------- - hdf5 - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl~mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.11%clang@3.8.0-2ubuntu4+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - - -In general, every attribute that we can set for all packages we can -set separately for an individual package. - -^^^^^^^^^^^^^^^^^ -External Packages -^^^^^^^^^^^^^^^^^ - -The packages configuration file also controls when Spack will build -against an externally installed package. On these systems we have a -pre-installed zlib. - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - variants: ~shared - hdf5: - variants: ~mpi - zlib: - paths: - zlib@1.2.8%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64: /usr - - -Here, we've told Spack that zlib 1.2.8 is installed on our system. -We've also told it the installation prefix where zlib can be found. -We don't know exactly which variants it was built with, but that's -okay. - -.. code-block:: console - - $ spack spec hdf5 - Input spec - -------------------------------- - hdf5 - - Concretized - -------------------------------- - hdf5@1.10.4%gcc@5.4.0~cxx~debug~fortran~hl~mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.8%gcc@5.4.0+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - - -You'll notice that Spack is now using the external zlib installation, -but the compiler used to build zlib is now overriding our compiler -preference of clang. If we explicitly specify Clang: - -.. code-block:: console - - $ spack spec hdf5 %clang - Input spec - -------------------------------- - hdf5%clang - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl~mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.11%clang@3.8.0-2ubuntu4+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - - -Spack concretizes to both HDF5 and zlib being built with Clang. -This has a side-effect of rebuilding zlib. If we want to force -Spack to use the system zlib, we have two choices. We can either -specify it on the command line, or we can tell Spack that it's -not allowed to build its own zlib. We'll go with the latter. - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - variants: ~shared - hdf5: - variants: ~mpi - zlib: - paths: - zlib@1.2.8%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64: /usr - buildable: False - - -Now Spack will be forced to choose the external zlib. - -.. code-block:: console - - $ spack spec hdf5 %clang - Input spec - -------------------------------- - hdf5%clang - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl~mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.8%gcc@5.4.0+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - - -This gets slightly more complicated with virtual dependencies. Suppose -we don't want to build our own MPI, but we now want a parallel version -of HDF5? Well, fortunately we have MPICH installed on these systems. - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - variants: ~shared - hdf5: - variants: ~mpi - zlib: - paths: - zlib@1.2.8%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64: /usr - buildable: False - mpich: - paths: - mpich@3.2%gcc@5.4.0 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64: /usr - buildable: False - - -If we concretize ``hdf5+mpi`` with this configuration file, we will just -build with an alternate MPI implementation. - -.. code-block:: console - - $ spack spec hdf5+mpi %clang - Input spec - -------------------------------- - hdf5%clang+mpi - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^openmpi@3.1.3%clang@3.8.0-2ubuntu4~cuda+cxx_exceptions fabrics= ~java~legacylaunchers~memchecker~pmi schedulers= ~sqlite3~thread_multiple+vt arch=linux-ubuntu16.04-x86_64 - ^hwloc@1.11.9%clang@3.8.0-2ubuntu4~cairo~cuda+libxml2+pci~shared arch=linux-ubuntu16.04-x86_64 - ^libpciaccess@0.13.5%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^libtool@2.4.6%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^m4@1.4.18%clang@3.8.0-2ubuntu4 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - ^libsigsegv@2.11%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^pkgconf@1.4.2%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^util-macros@1.19.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^libxml2@2.9.8%clang@3.8.0-2ubuntu4~python arch=linux-ubuntu16.04-x86_64 - ^xz@5.2.4%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.8%gcc@5.4.0+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - ^numactl@2.0.11%clang@3.8.0-2ubuntu4 patches=592f30f7f5f757dfc239ad0ffd39a9a048487ad803c26b419e0f96b8cda08c1a arch=linux-ubuntu16.04-x86_64 - ^autoconf@2.69%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^perl@5.26.2%clang@3.8.0-2ubuntu4+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac ~shared+threads arch=linux-ubuntu16.04-x86_64 - ^gdbm@1.14.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^readline@7.0%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - ^ncurses@6.1%clang@3.8.0-2ubuntu4~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - ^automake@1.16.1%clang@3.8.0-2ubuntu4 arch=linux-ubuntu16.04-x86_64 - - -We have only expressed a preference for MPICH over other MPI -implementations, and Spack will happily build with one we haven't -forbid it from building. We could resolve this by requesting -``hdf5+mpi%clang^mpich`` explicitly, or we can configure Spack not to -use any other MPI implementation. Since we're focused on -configurations here and the former can get tedious, we'll need to -modify our ``packages.yaml`` file again. - -While we're at it, we can configure HDF5 to build with MPI by default -again. - -.. code-block:: yaml - - packages: - all: - compiler: [clang, gcc, intel, pgi, xl, nag] - providers: - mpi: [mpich, openmpi] - variants: ~shared - zlib: - paths: - zlib@1.2.8%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64: /usr - buildable: False - mpich: - paths: - mpich@3.2%gcc@5.4.0 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64: /usr - buildable: False - openmpi: - buildable: False - mvapich2: - buildable: False - intel-mpi: - buildable: False - intel-parallel-studio: - buildable: False - spectrum-mpi: - buildable: False - mpilander: - buildable: False - charm: - buildable: False - charmpp: - buildable: False - - -Now that we have configured Spack not to build any of the possible -providers for MPI, we can try again. - -.. code-block:: console - - $ spack spec hdf5 %clang - Input spec - -------------------------------- - hdf5%clang - - Concretized - -------------------------------- - hdf5@1.10.4%clang@3.8.0-2ubuntu4~cxx~debug~fortran~hl+mpi+pic~shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - ^mpich@3.2%gcc@5.4.0 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.8%gcc@5.4.0+optimize+pic~shared arch=linux-ubuntu16.04-x86_64 - - -By configuring most of our package preferences in ``packages.yaml``, -we can cut down on the amount of work we need to do when specifying -a spec on the command line. In addition to compiler and variant -preferences, we can specify version preferences as well. Except for -selecting providers via `^`, anything that you can specify on the -command line can be specified in ``packages.yaml`` with the exact -same spec syntax. - -^^^^^^^^^^^^^^^^^^^^^^^^ -Installation Permissions -^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``packages.yaml`` file also controls the default permissions -to use when installing a package. You'll notice that by default, -the installation prefix will be world readable but only user writable. - -Let's say we need to install ``converge``, a licensed software package. -Since a specific research group, ``fluid_dynamics``, pays for this -license, we want to ensure that only members of this group can access -the software. We can do this like so: - -.. code-block:: yaml - - packages: - converge: - permissions: - read: group - group: fluid_dynamics - - -Now, only members of the ``fluid_dynamics`` group can use any -``converge`` installations. - -.. warning:: - - Make sure to delete or move the ``packages.yaml`` you have been - editing up to this point. Otherwise, it will change the hashes - of your packages, leading to differences in the output of later - tutorial sections. - - ------------------ -High-level Config ------------------ - -In addition to compiler and package settings, Spack allows customization -of several high-level settings. These settings are stored in the generic -``config.yaml`` configuration file. You can see the default settings by -running: - -.. code-block:: console - - $ spack config --scope defaults edit config - - -.. literalinclude:: _spack_root/etc/spack/defaults/config.yaml - :language: yaml - - -As you can see, many of the directories Spack uses can be customized. -For example, you can tell Spack to install packages to a prefix -outside of the ``$SPACK_ROOT`` hierarchy. Module files can be -written to a central location if you are using multiple Spack -instances. If you have a fast scratch file system, you can run builds -from this file system with the following ``config.yaml``: - -.. code-block:: yaml - - config: - build_stage: - - /scratch/$user/spack-stage - - -.. note:: - - It is important to distinguish the build stage directory from other - directories in your scratch space to ensure ``spack clean`` does not - inadvertently remove unrelated files. Spack prepends ``spack-stage-`` - to temporary staging directory names to reduce this risk. Using a - combination of ``spack`` and or ``stage`` in each specified path, as - shown in the default settings and documented examples, will add - another layer of protection. See :ref:`config-yaml` for details. - - -On systems with compilers that absolutely *require* environment variables -like ``LD_LIBRARY_PATH``, it is possible to prevent Spack from cleaning -the build environment with the ``dirty`` setting: - -.. code-block:: yaml - - config: - dirty: true - - -However, this is strongly discouraged, as it can pull unwanted libraries -into the build. - -One last setting that may be of interest to many users is the ability -to customize the parallelism of Spack builds. By default, Spack -installs all packages in parallel with the number of jobs equal to the -number of cores on the node (up to a maximum of 16). For example, on a -node with 16 cores, this will look like: - -.. code-block:: console - - $ spack install --no-cache --verbose --overwrite zlib - ==> Installing zlib - ==> Using cached archive: /home/user/spack/var/spack/cache/zlib/zlib-1.2.11.tar.gz - ==> Staging archive: /home/user/spack/var/spack/stage/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb/zlib-1.2.11.tar.gz - ==> Created stage in /home/user/spack/var/spack/stage/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> No patches needed for zlib - ==> Building zlib [Package] - ==> Executing phase: 'install' - ==> './configure' '--prefix=/home/user/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb' - ... - ==> 'make' '-j16' - ... - ==> 'make' '-j16' 'install' - ... - ==> Successfully installed zlib - Fetch: 0.00s. Build: 1.03s. Total: 1.03s. - [+] /home/user/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - - -As you can see, we are building with all 16 cores on the node. If you are -on a shared login node, this can slow down the system for other users. If -you have a strict ulimit or restriction on the number of available licenses, -you may not be able to build at all with this many cores. On nodes with 64+ -cores, you may not see a significant speedup of the build anyway. To limit -the number of cores our build uses, set ``build_jobs`` like so: - -.. code-block:: yaml - - config: - build_jobs: 2 - - -If we uninstall and reinstall zlib, we see that it now uses only 2 cores: - -.. code-block:: console - - $ spack install --no-cache --verbose --overwrite zlib - ==> Installing zlib - ==> Using cached archive: /home/user/spack/var/spack/cache/zlib/zlib-1.2.11.tar.gz - ==> Staging archive: /home/user/spack/var/spack/stage/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb/zlib-1.2.11.tar.gz - ==> Created stage in /home/user/spack/var/spack/stage/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - ==> No patches needed for zlib - ==> Building zlib [Package] - ==> Executing phase: 'install' - ==> './configure' '--prefix=/home/user/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb' - ... - ==> 'make' '-j2' - ... - ==> 'make' '-j2' 'install' - ... - ==> Successfully installed zlib - Fetch: 0.00s. Build: 1.03s. Total: 1.03s. - [+] /home/user/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/zlib-1.2.11-5nus6knzumx4ik2yl44jxtgtsl7d54xb - - -Obviously, if you want to build everything in serial for whatever reason, -you would set ``build_jobs`` to 1. - --------- -Examples --------- - -For examples of how other sites configure Spack, see -https://github.com/spack/spack-configs. If you use Spack at your site -and want to share your config files, feel free to submit a pull request! diff --git a/lib/spack/docs/tutorial_environments.rst b/lib/spack/docs/tutorial_environments.rst deleted file mode 100644 index 4b86dbd5aca..00000000000 --- a/lib/spack/docs/tutorial_environments.rst +++ /dev/null @@ -1,815 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _environments-tutorial: - -===================== -Environments Tutorial -===================== - -We've shown you how to install and remove packages with Spack. You can -use :ref:`cmd-spack-install` to install packages, -:ref:`cmd-spack-uninstall` to remove them, and :ref:`cmd-spack-find` to -look at and query what is installed. We've also shown you how to -customize Spack's installation with configuration files like -:ref:`packages.yaml `. - -If you build a lot of software, or if you work on multiple projects, -managing everything in one place can be overwhelming. The default ``spack -find`` output may contain many packages, but you may want to *just* focus -on packages for a particular project. Moreover, you may want to include -special configuration with your package groups, e.g., to build all the -packages in the same group the same way. - -Spack **environments** provide a way to handle these problems. - -------------------- -Environment basics -------------------- - -Let's look at the output of ``spack find`` at this point in the tutorial. - -.. code-block:: console - - $ spack find - ==> 70 installed packages - -- linux-ubuntu16.04-x86_64 / clang@3.8.0-2ubuntu4 -------------- - tcl@8.6.8 zlib@1.2.8 zlib@1.2.11 - - -- linux-ubuntu16.04-x86_64 / gcc@4.7 --------------------------- - zlib@1.2.11 - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - adept-utils@1.0.1 hdf5@1.10.4 mpc@1.1.0 perl@5.26.2 - autoconf@2.69 hdf5@1.10.4 mpfr@3.1.6 pkgconf@1.4.2 - automake@1.16.1 hdf5@1.10.4 mpich@3.2.1 readline@7.0 - boost@1.68.0 hwloc@1.11.9 mpileaks@1.0 suite-sparse@5.3.0 - bzip2@1.0.6 hypre@2.15.1 mumps@5.1.1 tar@1.30 - callpath@1.0.4 hypre@2.15.1 mumps@5.1.1 tcl@8.6.8 - cmake@3.12.3 isl@0.18 ncurses@6.1 tcl@8.6.8 - diffutils@3.6 libdwarf@20180129 netcdf@4.6.1 texinfo@6.5 - dyninst@9.3.2 libiberty@2.31.1 netcdf@4.6.1 trilinos@12.12.1 - elfutils@0.173 libpciaccess@0.13.5 netlib-scalapack@2.0.2 trilinos@12.12.1 - findutils@4.6.0 libsigsegv@2.11 netlib-scalapack@2.0.2 util-macros@1.19.1 - gcc@7.2.0 libtool@2.4.6 numactl@2.0.11 xz@5.2.4 - gdbm@1.14.1 libxml2@2.9.8 openblas@0.3.3 zlib@1.2.8 - gettext@0.19.8.1 m4@1.4.18 openmpi@3.1.3 zlib@1.2.8 - glm@0.9.7.1 matio@1.5.9 openssl@1.0.2o zlib@1.2.11 - gmp@6.1.2 matio@1.5.9 parmetis@4.0.3 - hdf5@1.10.4 metis@5.1.0 parmetis@4.0.3 - - -This is a complete, but cluttered view. There are packages built with -both ``openmpi`` and ``mpich``, as well as multiple variants of other -packages, like ``zlib``. The query mechanism we learned about in ``spack -find`` can help, but it would be nice if we could start from a clean -slate without losing what we've already done. - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Creating and activating environments -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``spack env`` command can help. Let's create a new environment: - -.. code-block:: console - - $ spack env create myproject - ==> Created environment 'myproject' in ~/spack/var/spack/environments/myproject - -An environment is a virtualized ``spack`` instance that you can use for a -specific purpose. You can see the environments we've created so far like this: - -.. code-block:: console - - $ spack env list - ==> 1 environments - myproject - -And you can **activate** an environment with ``spack env activate``: - -.. code-block:: console - - $ spack env activate myproject - -Once you enter an environment, ``spack find`` shows only what is in the -current environment. That's nothing, so far: - -.. code-block:: console - - $ spack find - ==> In environment myproject - ==> No root specs - - ==> 0 installed packages - -The ``spack find`` output is still *slightly* different. It tells you -that you're in the ``myproject`` environment, so that you don't panic -when you see that there is nothing installed. It also says that there -are *no root specs*. We'll get back to what that means later. - -If you *only* want to check what environment you are in, you can use -``spack env status``: - -.. code-block:: console - - $ spack env status - ==> In environment myproject - -And, if you want to leave this environment and go back to normal Spack, -you can use ``spack env deactivate``. We like to use the -``despacktivate`` alias (which Spack sets up automatically) for short: - -.. code-block:: console - - $ despacktivate # short alias for `spack env deactivate` - $ spack env status - ==> No active environment - $ spack find - netcdf@4.6.1 readline@7.0 zlib@1.2.11 - diffutils@3.6 hdf5@1.10.4 m4@1.4.18 netcdf@4.6.1 suite-sparse@5.3.0 - dyninst@10.0.0 hwloc@1.11.9 matio@1.5.9 netlib-scalapack@2.0.2 tar@1.30 - elfutils@0.173 hypre@2.15.1 matio@1.5.9 netlib-scalapack@2.0.2 tcl@8.6.8 - findutils@4.6.0 hypre@2.15.1 metis@5.1.0 numactl@2.0.11 tcl@8.6.8 - gcc@7.2.0 intel-tbb@2019 mpc@1.1.0 openblas@0.3.3 texinfo@6.5~ - - -^^^^^^^^^^^^^^^^^^^ -Installing packages -^^^^^^^^^^^^^^^^^^^ - -Ok, now that we understand how creation and activation work, let's go -back to ``myproject`` and *install* a few packages: - -.. code-block:: console - - $ spack env activate myproject - $ spack install tcl - ==> tcl is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8-qhwyccywhx2i6s7ob2gvjrjtj3rnfuqt - $ spack install trilinos - ==> trilinos is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1-rlsruavxqvwk2tgxzxboclbo6ykjf54r - $ spack find - ==> In environment myproject - ==> Root specs - tcl trilinos - - ==> 22 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - boost@1.68.0 hwloc@1.11.9 matio@1.5.9 netlib-scalapack@2.0.2 parmetis@4.0.3 xz@5.2.4 - bzip2@1.0.6 hypre@2.15.1 metis@5.1.0 numactl@2.0.11 suite-sparse@5.3.0 zlib@1.2.11 - glm@0.9.7.1 libpciaccess@0.13.5 mumps@5.1.1 openblas@0.3.3 tcl@8.6.8 - hdf5@1.10.4 libxml2@2.9.8 netcdf@4.6.1 openmpi@3.1.3 trilinos@12.12.1 - -We've installed ``tcl`` and ``trilinos`` in our environment, along with -all of their dependencies. We call ``tcl`` and ``trilinos`` the -**roots** because we asked for them explicitly. The other 20 packages -listed under "installed packages" are present because they were needed as -dependencies. So, these are the roots of the packages' dependency graph. - -The " is already installed" messages above are generated because -we already installed these packages in previous steps of the tutorial, -and we don't have to rebuild them to put them in an environment. - -Now let's create *another* project. We'll call this one ``myproject2``: - -.. code-block:: console - - $ spack env create myproject2 - ==> Created environment 'myproject2' in ~/spack/var/spack/environments/myproject2 - $ spack env activate myproject2 - $ spack install hdf5 - ==> hdf5 is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-ozyvmhzdew66byarohm4p36ep7wtcuiw - $ spack install trilinos - ==> trilinos is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1-rlsruavxqvwk2tgxzxboclbo6ykjf54r - $ spack find - ==> In environment myproject2 - ==> Root specs - hdf5 trilinos - - ==> 22 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - boost@1.68.0 hdf5@1.10.4 libxml2@2.9.8 netcdf@4.6.1 openmpi@3.1.3 xz@5.2.4 - bzip2@1.0.6 hwloc@1.11.9 matio@1.5.9 netlib-scalapack@2.0.2 parmetis@4.0.3 zlib@1.2.11 - glm@0.9.7.1 hypre@2.15.1 metis@5.1.0 numactl@2.0.11 suite-sparse@5.3.0 - hdf5@1.10.4 libpciaccess@0.13.5 mumps@5.1.1 openblas@0.3.3 trilinos@12.12.1 - -Now we have two environments: one with ``tcl`` and ``trilinos``, and -another with ``hdf5`` and ``trilinos``. - -We can uninstall trilinos from ``myproject2`` as you would expect: - -.. code-block:: console - - $ spack uninstall trilinos - ==> The following packages will be uninstalled: - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - rlsruav trilinos@12.12.1%gcc~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 - ==> Do you want to proceed? [y/N] y - $ spack find - ==> In environment myproject2 - ==> Root specs - hdf5 - - ==> 8 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - hdf5@1.10.4 libpciaccess@0.13.5 numactl@2.0.11 xz@5.2.4 - hwloc@1.11.9 libxml2@2.9.8 openmpi@3.1.3 zlib@1.2.11 - -Now there is only one root spec, ``hdf5``, which requires fewer -additional dependencies. - -However, we still needed ``trilinos`` for the ``myproject`` environment! -What happened to it? Let's switch back and see. - -.. code-block:: console - - $ despacktivate - $ spack env activate myproject - $ spack find - ==> In environment myproject - ==> Root specs - tcl trilinos - - ==> 22 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - boost@1.68.0 hwloc@1.11.9 matio@1.5.9 netlib-scalapack@2.0.2 parmetis@4.0.3 xz@5.2.4 - bzip2@1.0.6 hypre@2.15.1 metis@5.1.0 numactl@2.0.11 suite-sparse@5.3.0 zlib@1.2.11 - glm@0.9.7.1 libpciaccess@0.13.5 mumps@5.1.1 openblas@0.3.3 tcl@8.6.8 - hdf5@1.10.4 libxml2@2.9.8 netcdf@4.6.1 openmpi@3.1.3 trilinos@12.12.1 - - -Spack is smart enough to realize that ``trilinos`` is still present in -the other environment. Trilinos won't *actually* be uninstalled unless -it is no longer needed by any environments or packages. If it is still -needed, it is only removed from the environment. - -------------------------------- -Dealing with many specs at once -------------------------------- - -In the above examples, we just used ``install`` and ``uninstall``. There -are other ways to deal with groups of packages, as well. - -^^^^^^^^^^^^^ -Adding specs -^^^^^^^^^^^^^ - -Let's go back to our first ``myproject`` environment and *add* a few specs instead of installing them: - -.. code-block:: console - - $ spack add hdf5 - ==> Adding hdf5 to environment myproject - $ spack add gmp - ==> Adding mumps to environment myproject - $ spack find - ==> In environment myproject - ==> Root specs - gmp hdf5 tcl trilinos - - ==> 22 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - boost@1.68.0 hwloc@1.11.9 matio@1.5.9 netlib-scalapack@2.0.2 parmetis@4.0.3 xz@5.2.4 - bzip2@1.0.6 hypre@2.15.1 metis@5.1.0 numactl@2.0.11 suite-sparse@5.3.0 zlib@1.2.11 - glm@0.9.7.1 libpciaccess@0.13.5 mumps@5.1.1 openblas@0.3.3 tcl@8.6.8 - hdf5@1.10.4 libxml2@2.9.8 netcdf@4.6.1 openmpi@3.1.3 trilinos@12.12.1 - -Let's take a close look at what happened. The two packages we added, -``hdf5`` and ``gmp``, are present, but they're not installed in the -environment yet. ``spack add`` just adds *roots* to the environment, but -it does not automatically install them. - -We can install *all* the as-yet uninstalled packages in an environment by -simply running ``spack install`` with no arguments: - -.. code-block:: console - - $ spack install - ==> Concretizing hdf5 - [+] ozyvmhz hdf5@1.10.4%gcc@5.4.0~cxx~debug~fortran~hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - [+] 3njc4q5 ^openmpi@3.1.3%gcc@5.4.0~cuda+cxx_exceptions fabrics= ~java~legacylaunchers~memchecker~pmi schedulers= ~sqlite3~thread_multiple+vt arch=linux-ubuntu16.04-x86_64 - [+] 43tkw5m ^hwloc@1.11.9%gcc@5.4.0~cairo~cuda+libxml2+pci+shared arch=linux-ubuntu16.04-x86_64 - [+] 5urc6tc ^libpciaccess@0.13.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] milz7fm ^util-macros@1.19.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] wpexsph ^libxml2@2.9.8%gcc@5.4.0~python arch=linux-ubuntu16.04-x86_64 - [+] teneqii ^xz@5.2.4%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - [+] ft463od ^numactl@2.0.11%gcc@5.4.0 patches=592f30f7f5f757dfc239ad0ffd39a9a048487ad803c26b419e0f96b8cda08c1a arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ==> Concretizing gmp - [+] qc4qcfz gmp@6.1.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ==> Installing environment myproject - ==> tcl is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/tcl-8.6.8-qhwyccywhx2i6s7ob2gvjrjtj3rnfuqt - ==> trilinos is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1-rlsruavxqvwk2tgxzxboclbo6ykjf54r - ==> hdf5 is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/hdf5-1.10.4-ozyvmhzdew66byarohm4p36ep7wtcuiw - ==> gmp is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gmp-6.1.2-qc4qcfz4monpllc3nqupdo7vwinf73sw - -Spack will concretize the new roots, and install everything you added to -the environment. Now we can see the installed roots in the output of -``spack find``: - -.. code-block:: console - - $ spack find - ==> In environment myproject - ==> Root specs - gmp hdf5 tcl trilinos - - ==> 24 installed packages - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - boost@1.68.0 hdf5@1.10.4 libpciaccess@0.13.5 mumps@5.1.1 openblas@0.3.3 tcl@8.6.8 - bzip2@1.0.6 hdf5@1.10.4 libxml2@2.9.8 netcdf@4.6.1 openmpi@3.1.3 trilinos@12.12.1 - glm@0.9.7.1 hwloc@1.11.9 matio@1.5.9 netlib-scalapack@2.0.2 parmetis@4.0.3 xz@5.2.4 - gmp@6.1.2 hypre@2.15.1 metis@5.1.0 numactl@2.0.11 suite-sparse@5.3.0 zlib@1.2.11 - -We can build whole environments this way, by adding specs and installing -all at once, or we can install them with the usual ``install`` and -``uninstall`` portions. The advantage to doing them all at once is that -we don't have to write a script outside of Spack to automate this, and we -can kick off a large build of many packages easily. - -^^^^^^^^^^^^^^^^^^^^^ -Configuration -^^^^^^^^^^^^^^^^^^^^^ - -So far, ``myproject`` does not have any special configuration associated -with it. The specs concretize using Spack's defaults: - -.. code-block:: console - - $ spack spec hypre - Input spec - -------------------------------- - hypre - - Concretized - -------------------------------- - hypre@2.15.1%gcc@5.4.0~debug~int64+internal-superlu+mpi+shared arch=linux-ubuntu16.04-x86_64 - ^openblas@0.3.3%gcc@5.4.0 cpu_target= ~ilp64 patches=47cfa7a952ac7b2e4632c73ae199d69fb54490627b66a62c681e21019c4ddc9d,714aea33692304a50bd0ccde42590c176c82ded4a8ac7f06e573dc8071929c33 +pic+shared threads=none ~virtual_machine arch=linux-ubuntu16.04-x86_64 - ^openmpi@3.1.3%gcc@5.4.0~cuda+cxx_exceptions fabrics= ~java~legacylaunchers~memchecker~pmi schedulers= ~sqlite3~thread_multiple+vt arch=linux-ubuntu16.04-x86_64 - ^hwloc@1.11.9%gcc@5.4.0~cairo~cuda+libxml2+pci+shared arch=linux-ubuntu16.04-x86_64 - ^libpciaccess@0.13.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^util-macros@1.19.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^libxml2@2.9.8%gcc@5.4.0~python arch=linux-ubuntu16.04-x86_64 - ^xz@5.2.4%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - ^numactl@2.0.11%gcc@5.4.0 patches=592f30f7f5f757dfc239ad0ffd39a9a048487ad803c26b419e0f96b8cda08c1a arch=linux-ubuntu16.04-x86_64 - ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - -You may want to add extra configuration to your environment. You can see -how your environment is configured using ``spack config get``: - -.. code-block:: console - - $ spack config get - # This is a Spack Environment file. - # - # It describes a set of packages to be installed, along with - # configuration settings. - spack: - # add package specs to the `specs` list - specs: [tcl, trilinos, hdf5, gmp] - -It turns out that this is a special configuration format where Spack -stores the state for the environment. Currently, the file is just a -``spack:`` header and a list of ``specs``. These are the roots. - -You can edit this file to add your own custom configuration. Spack -provides a shortcut to do that: - -.. code-block:: console - - spack config edit - -You should now see the same file, and edit it to look like this: - -.. code-block:: yaml - - # This is a Spack Environment file. - # - # It describes a set of packages to be installed, along with - # configuration settings. - spack: - packages: - all: - providers: - mpi: [mpich] - - # add package specs to the `specs` list - specs: [tcl, trilinos, hdf5, gmp] - -Now if we run ``spack spec`` again in the environment, specs will concretize with ``mpich`` as the MPI implementation: - -.. code-block:: console - - $ spack spec hypre - Input spec - -------------------------------- - hypre - - Concretized - -------------------------------- - hypre@2.15.1%gcc@5.4.0~debug~int64+internal-superlu+mpi+shared arch=linux-ubuntu16.04-x86_64 - ^mpich@3.2.1%gcc@5.4.0 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64 - ^findutils@4.6.0%gcc@5.4.0 patches=84b916c0bf8c51b7e7b28417692f0ad3e7030d1f3c248ba77c42ede5c1c5d11e,bd9e4e5cc280f9753ae14956c4e4aa17fe7a210f55dd6c84aa60b12d106d47a2 arch=linux-ubuntu16.04-x86_64 - ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^texinfo@6.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ^openblas@0.3.3%gcc@5.4.0 cpu_target= ~ilp64 patches=47cfa7a952ac7b2e4632c73ae199d69fb54490627b66a62c681e21019c4ddc9d,714aea33692304a50bd0ccde42590c176c82ded4a8ac7f06e573dc8071929c33 +pic+shared threads=none ~virtual_machine arch=linux-ubuntu16.04-x86_64 - -In addition to the ``specs`` section, an environment's configuration can -contain any of the configuration options from Spack's various config -sections. You can add custom repositories, a custom install location, -custom compilers, or custom external packages, in addition to the ``package`` -preferences we show here. - -But now we have a problem. We already installed part of this environment -with openmpi, but now we want to install it with ``mpich``. - -You can run ``spack concretize`` inside of an environment to concretize -all of its specs. We can run it here: - -.. code-block:: console - - $ spack concretize -f - ==> Concretizing tcl - [+] qhwyccy tcl@8.6.8%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - ==> Concretizing trilinos - [+] kqc52mo trilinos@12.12.1%gcc@5.4.0~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 arch=linux-ubuntu16.04-x86_64 - [+] zbgfxap ^boost@1.68.0%gcc@5.4.0+atomic+chrono~clanglibcpp cxxstd=default +date_time~debug+exception+filesystem+graph~icu+iostreams+locale+log+math~mpi+multithreaded~numpy patches=2ab6c72d03dec6a4ae20220a9dfd5c8c572c5294252155b85c6874d97c323199 +program_options~python+random+regex+serialization+shared+signals~singlethreaded+system~taggedlayout+test+thread+timer~versionedlayout+wave arch=linux-ubuntu16.04-x86_64 - [+] ufczdvs ^bzip2@1.0.6%gcc@5.4.0+shared arch=linux-ubuntu16.04-x86_64 - [+] 2rhuivg ^diffutils@3.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - [+] otafqzh ^cmake@3.12.3%gcc@5.4.0~doc+ncurses+openssl+ownlibs patches=dd3a40d4d92f6b2158b87d6fb354c277947c776424aa03f6dc8096cf3135f5d0 ~qt arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] b4y3w3b ^openssl@1.0.2o%gcc@5.4.0+systemcerts arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] jnw622j ^glm@0.9.7.1%gcc@5.4.0 build_type=RelWithDebInfo arch=linux-ubuntu16.04-x86_64 - [+] xxd7syh ^hdf5@1.10.4%gcc@5.4.0~cxx~debug~fortran+hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - [+] p3f7p2r ^mpich@3.2.1%gcc@5.4.0 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64 - [+] d4iajxs ^findutils@4.6.0%gcc@5.4.0 patches=84b916c0bf8c51b7e7b28417692f0ad3e7030d1f3c248ba77c42ede5c1c5d11e,bd9e4e5cc280f9753ae14956c4e4aa17fe7a210f55dd6c84aa60b12d106d47a2 arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] zs7a2pc ^texinfo@6.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] obewuoz ^hypre@2.15.1%gcc@5.4.0~debug~int64~internal-superlu+mpi+shared arch=linux-ubuntu16.04-x86_64 - [+] cyeg2yi ^openblas@0.3.3%gcc@5.4.0 cpu_target= ~ilp64 patches=47cfa7a952ac7b2e4632c73ae199d69fb54490627b66a62c681e21019c4ddc9d,714aea33692304a50bd0ccde42590c176c82ded4a8ac7f06e573dc8071929c33 +pic+shared threads=none ~virtual_machine arch=linux-ubuntu16.04-x86_64 - [+] gvyqldh ^matio@1.5.9%gcc@5.4.0+hdf5+shared+zlib arch=linux-ubuntu16.04-x86_64 - [+] 3wnvp4j ^metis@5.1.0%gcc@5.4.0 build_type=Release ~gdb~int64 patches=4991da938c1d3a1d3dea78e49bbebecba00273f98df2a656e38b83d55b281da1 ~real64+shared arch=linux-ubuntu16.04-x86_64 - [+] cumcj5a ^mumps@5.1.1%gcc@5.4.0+complex+double+float~int64~metis+mpi~parmetis~ptscotch~scotch+shared arch=linux-ubuntu16.04-x86_64 - [+] p7iln2p ^netlib-scalapack@2.0.2%gcc@5.4.0 build_type=RelWithDebInfo ~pic+shared arch=linux-ubuntu16.04-x86_64 - [+] wmmx5sg ^netcdf@4.6.1%gcc@5.4.0~dap~hdf4 maxdims=1024 maxvars=8192 +mpi~parallel-netcdf+shared arch=linux-ubuntu16.04-x86_64 - [+] jehtata ^parmetis@4.0.3%gcc@5.4.0 build_type=RelWithDebInfo ~gdb patches=4f892531eb0a807eb1b82e683a416d3e35154a455274cf9b162fb02054d11a5b,50ed2081bc939269689789942067c58b3e522c269269a430d5d34c00edbc5870,704b84f7c7444d4372cb59cca6e1209df4ef3b033bc4ee3cf50f369bce972a9d +shared arch=linux-ubuntu16.04-x86_64 - [+] zaau4ki ^suite-sparse@5.3.0%gcc@5.4.0~cuda~openmp+pic~tbb arch=linux-ubuntu16.04-x86_64 - ==> Concretizing hdf5 - - zjgyn3w hdf5@1.10.4%gcc@5.4.0~cxx~debug~fortran~hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - [+] p3f7p2r ^mpich@3.2.1%gcc@5.4.0 device=ch3 +hydra netmod=tcp +pmi+romio~verbs arch=linux-ubuntu16.04-x86_64 - [+] d4iajxs ^findutils@4.6.0%gcc@5.4.0 patches=84b916c0bf8c51b7e7b28417692f0ad3e7030d1f3c248ba77c42ede5c1c5d11e,bd9e4e5cc280f9753ae14956c4e4aa17fe7a210f55dd6c84aa60b12d106d47a2 arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] zs7a2pc ^texinfo@6.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - ==> Concretizing gmp - [+] qc4qcfz gmp@6.1.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - -Now, all the specs in the environment are concrete and ready to be -installed with ``mpich`` as the MPI implementation. - -Normally, we could just run ``spack config edit``, edit the environment -configuration, ``spack add`` some specs, and ``spack install``. - -But, when we already have installed packages in the environment, we have -to force everything in the environment to be re-concretized using ``spack -concretize -f``. *Then* we can re-run ``spack install``. - - ------------------------------------ -``spack.yaml`` and ``spack.lock`` ------------------------------------ - -So far we've shown you how to interact with environments from the command -line, but they also have a file-based interface that can be used by -developers and admins to manage workflows for projects. - -In this section we'll dive a little deeper to see how environments are -implemented, and how you could use this in your day-to-day development. - -^^^^^^^^^^^^^^ -``spack.yaml`` -^^^^^^^^^^^^^^ - -Earlier, we changed an environment's configuration using ``spack config -edit``. We were actually editing a special file called ``spack.yaml``. -Let's take a look. - -We can get directly to the current environment's location using ``spack cd``: - -.. code-block:: console - - $ spack cd -e myproject - $ pwd - ~/spack/var/spack/environments/myproject - $ ls - spack.lock spack.yaml - -We notice two things here. First, the environment is just a directory -inside of ``var/spack/environments`` within the Spack installation. -Second, it contains two important files: ``spack.yaml`` and -``spack.lock``. - -``spack.yaml`` is the configuration file for environments that we've -already seen, but it does not *have* to live inside Spack. If you create -an environment using ``spack env create``, it is *managed* by -Spack in the ``var/spack/environments`` directory, and you can refer to -it by name. - -You can actually put a ``spack.yaml`` file *anywhere*, and you can use it -to bundle an environment, or a list of dependencies to install, with your -project. Let's make a simple project: - -.. code-block:: console - - $ cd - $ mkdir code - $ cd code - $ spack env create -d . - ==> Created environment in ~/code - -Here, we made a new directory called *code*, and we used the ``-d`` -option to create an environment in it. - -What really happened? - -.. code-block:: console - - $ ls - spack.yaml - $ cat spack.yaml - # This is a Spack Environment file. - # - # It describes a set of packages to be installed, along with - # configuration settings. - spack: - # add package specs to the `specs` list - specs: [] - -Spack just created a ``spack.yaml`` file in the code directory, with an -empty list of root specs. Now we have a Spack environment, *in a -directory*, that we can use to manage dependencies. Suppose your project -depends on ``boost``, ``trilinos``, and ``openmpi``. You can add these -to your spec list: - -.. code-block:: yaml - - # This is a Spack Environment file. - # - # It describes a set of packages to be installed, along with - # configuration settings. - spack: - # add package specs to the `specs` list - specs: - - boost - - trilinos - - openmpi - -And now *anyone* who uses the *code* repository can use this format to -install the project's dependencies. They need only clone the repository, -``cd`` into it, and type ``spack install``: - -.. code-block:: console - - $ spack install - ==> Concretizing boost - [+] zbgfxap boost@1.68.0%gcc@5.4.0+atomic+chrono~clanglibcpp cxxstd=default +date_time~debug+exception+filesystem+graph~icu+iostreams+locale+log+math~mpi+multithreaded~numpy patches=2ab6c72d03dec6a4ae20220a9dfd5c8c572c5294252155b85c6874d97c323199 +program_options~python+random+regex+serialization+shared+signals~singlethreaded+system~taggedlayout+test+thread+timer~versionedlayout+wave arch=linux-ubuntu16.04-x86_64 - [+] ufczdvs ^bzip2@1.0.6%gcc@5.4.0+shared arch=linux-ubuntu16.04-x86_64 - [+] 2rhuivg ^diffutils@3.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - ==> Concretizing trilinos - [+] rlsruav trilinos@12.12.1%gcc@5.4.0~alloptpkgs+amesos+amesos2+anasazi+aztec+belos+boost build_type=RelWithDebInfo ~cgns~complex~dtk+epetra+epetraext+exodus+explicit_template_instantiation~float+fortran~fortrilinos+gtest+hdf5+hypre+ifpack+ifpack2~intrepid~intrepid2~isorropia+kokkos+metis~minitensor+ml+muelu+mumps~nox~openmp~phalanx~piro~pnetcdf~python~rol~rythmos+sacado~shards+shared~stk+suite-sparse~superlu~superlu-dist~teko~tempus+teuchos+tpetra~x11~xsdkflags~zlib+zoltan+zoltan2 arch=linux-ubuntu16.04-x86_64 - [+] zbgfxap ^boost@1.68.0%gcc@5.4.0+atomic+chrono~clanglibcpp cxxstd=default +date_time~debug+exception+filesystem+graph~icu+iostreams+locale+log+math~mpi+multithreaded~numpy patches=2ab6c72d03dec6a4ae20220a9dfd5c8c572c5294252155b85c6874d97c323199 +program_options~python+random+regex+serialization+shared+signals~singlethreaded+system~taggedlayout+test+thread+timer~versionedlayout+wave arch=linux-ubuntu16.04-x86_64 - [+] ufczdvs ^bzip2@1.0.6%gcc@5.4.0+shared arch=linux-ubuntu16.04-x86_64 - [+] 2rhuivg ^diffutils@3.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - [+] otafqzh ^cmake@3.12.3%gcc@5.4.0~doc+ncurses+openssl+ownlibs patches=dd3a40d4d92f6b2158b87d6fb354c277947c776424aa03f6dc8096cf3135f5d0 ~qt arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] b4y3w3b ^openssl@1.0.2o%gcc@5.4.0+systemcerts arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] jnw622j ^glm@0.9.7.1%gcc@5.4.0 build_type=RelWithDebInfo arch=linux-ubuntu16.04-x86_64 - [+] oqwnui7 ^hdf5@1.10.4%gcc@5.4.0~cxx~debug~fortran+hl+mpi+pic+shared~szip~threadsafe arch=linux-ubuntu16.04-x86_64 - [+] 3njc4q5 ^openmpi@3.1.3%gcc@5.4.0~cuda+cxx_exceptions fabrics= ~java~legacylaunchers~memchecker~pmi schedulers= ~sqlite3~thread_multiple+vt arch=linux-ubuntu16.04-x86_64 - [+] 43tkw5m ^hwloc@1.11.9%gcc@5.4.0~cairo~cuda+libxml2+pci+shared arch=linux-ubuntu16.04-x86_64 - [+] 5urc6tc ^libpciaccess@0.13.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] milz7fm ^util-macros@1.19.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] wpexsph ^libxml2@2.9.8%gcc@5.4.0~python arch=linux-ubuntu16.04-x86_64 - [+] teneqii ^xz@5.2.4%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] ft463od ^numactl@2.0.11%gcc@5.4.0 patches=592f30f7f5f757dfc239ad0ffd39a9a048487ad803c26b419e0f96b8cda08c1a arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] fshksdp ^hypre@2.15.1%gcc@5.4.0~debug~int64~internal-superlu+mpi+shared arch=linux-ubuntu16.04-x86_64 - [+] cyeg2yi ^openblas@0.3.3%gcc@5.4.0 cpu_target= ~ilp64 patches=47cfa7a952ac7b2e4632c73ae199d69fb54490627b66a62c681e21019c4ddc9d,714aea33692304a50bd0ccde42590c176c82ded4a8ac7f06e573dc8071929c33 +pic+shared threads=none ~virtual_machine arch=linux-ubuntu16.04-x86_64 - [+] lmzdgss ^matio@1.5.9%gcc@5.4.0+hdf5+shared+zlib arch=linux-ubuntu16.04-x86_64 - [+] 3wnvp4j ^metis@5.1.0%gcc@5.4.0 build_type=Release ~gdb~int64 patches=4991da938c1d3a1d3dea78e49bbebecba00273f98df2a656e38b83d55b281da1 ~real64+shared arch=linux-ubuntu16.04-x86_64 - [+] acsg2dz ^mumps@5.1.1%gcc@5.4.0+complex+double+float~int64~metis+mpi~parmetis~ptscotch~scotch+shared arch=linux-ubuntu16.04-x86_64 - [+] wotpfwf ^netlib-scalapack@2.0.2%gcc@5.4.0 build_type=RelWithDebInfo ~pic+shared arch=linux-ubuntu16.04-x86_64 - [+] mhm4izp ^netcdf@4.6.1%gcc@5.4.0~dap~hdf4 maxdims=1024 maxvars=8192 +mpi~parallel-netcdf+shared arch=linux-ubuntu16.04-x86_64 - [+] uv6h3sq ^parmetis@4.0.3%gcc@5.4.0 build_type=RelWithDebInfo ~gdb patches=4f892531eb0a807eb1b82e683a416d3e35154a455274cf9b162fb02054d11a5b,50ed2081bc939269689789942067c58b3e522c269269a430d5d34c00edbc5870,704b84f7c7444d4372cb59cca6e1209df4ef3b033bc4ee3cf50f369bce972a9d +shared arch=linux-ubuntu16.04-x86_64 - [+] zaau4ki ^suite-sparse@5.3.0%gcc@5.4.0~cuda~openmp+pic~tbb arch=linux-ubuntu16.04-x86_64 - ==> Concretizing openmpi - [+] 3njc4q5 openmpi@3.1.3%gcc@5.4.0~cuda+cxx_exceptions fabrics= ~java~legacylaunchers~memchecker~pmi schedulers= ~sqlite3~thread_multiple+vt arch=linux-ubuntu16.04-x86_64 - [+] 43tkw5m ^hwloc@1.11.9%gcc@5.4.0~cairo~cuda+libxml2+pci+shared arch=linux-ubuntu16.04-x86_64 - [+] 5urc6tc ^libpciaccess@0.13.5%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] o2pfwjf ^libtool@2.4.6%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] suf5jtc ^m4@1.4.18%gcc@5.4.0 patches=3877ab548f88597ab2327a2230ee048d2d07ace1062efe81fc92e91b7f39cd00,c0a408fbffb7255fcc75e26bd8edab116fc81d216bfd18b473668b7739a4158e,fc9b61654a3ba1a8d6cd78ce087e7c96366c290bc8d2c299f09828d793b853c8 +sigsegv arch=linux-ubuntu16.04-x86_64 - [+] fypapcp ^libsigsegv@2.11%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] fovrh7a ^pkgconf@1.4.2%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] milz7fm ^util-macros@1.19.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] wpexsph ^libxml2@2.9.8%gcc@5.4.0~python arch=linux-ubuntu16.04-x86_64 - [+] teneqii ^xz@5.2.4%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 5nus6kn ^zlib@1.2.11%gcc@5.4.0+optimize+pic+shared arch=linux-ubuntu16.04-x86_64 - [+] ft463od ^numactl@2.0.11%gcc@5.4.0 patches=592f30f7f5f757dfc239ad0ffd39a9a048487ad803c26b419e0f96b8cda08c1a arch=linux-ubuntu16.04-x86_64 - [+] 3sx2gxe ^autoconf@2.69%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] ic2kyoa ^perl@5.26.2%gcc@5.4.0+cpanm patches=0eac10ed90aeb0459ad8851f88081d439a4e41978e586ec743069e8b059370ac +shared+threads arch=linux-ubuntu16.04-x86_64 - [+] q4fpyuo ^gdbm@1.14.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] nxhwrg7 ^readline@7.0%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - [+] 3o765ou ^ncurses@6.1%gcc@5.4.0~symlinks~termlib arch=linux-ubuntu16.04-x86_64 - [+] rymw7im ^automake@1.16.1%gcc@5.4.0 arch=linux-ubuntu16.04-x86_64 - ==> Installing environment ~/code - ==> boost is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/boost-1.68.0-zbgfxapchxa4awxdwpleubfuznblxzvt - ==> trilinos is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/trilinos-12.12.1-rlsruavxqvwk2tgxzxboclbo6ykjf54r - ==> openmpi is already installed in ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx - - -Spack concretizes the specs in the ``spack.yaml`` file and installs them. - -What happened here? If you ``cd`` into a directory that has a -``spack.yaml`` file in it, Spack considers this directory's environment -to be activated. The directory does not have to live within Spack; it -can be anywhere. - -So, from ``~/code``, we can actually manipulate ``spack.yaml`` using -``spack add`` and ``spack remove`` (just like managed environments): - -.. code-block:: console - - $ spack add hdf5@5.5.1 - ==> Adding hdf5 to environment ~/code - $ cat spack.yaml - # This is a Spack Environment file. - # - # It describes a set of packages to be installed, along with - # configuration settings. - spack: - # add package specs to the `specs` list - specs: - - boost - - trilinos - - openmpi - - hdf5@5.5.1 - - $ spack remove hdf5 - ==> Removing hdf5 from environment ~/code - $ cat spack.yaml - # This is a Spack Environment file. - # - # It describes a set of packages to be installed, along with - # configuration settings. - spack: - # add package specs to the `specs` list - specs: - - boost - - trilinos - - openmpi - - -^^^^^^^^^^^^^^ -``spack.lock`` -^^^^^^^^^^^^^^ - -Okay, we've covered managed environments, environments in directories, and -the last thing we'll cover is ``spack.lock``. You may remember that when -we ran ``spack install``, Spack concretized all the specs in the -``spack.yaml`` file and installed them. - -Whenever we concretize Specs in an environment, all concrete specs in the -environment are written out to a ``spack.lock`` file *alongside* -``spack.yaml``. The ``spack.lock`` file is not really human-readable -like the ``spack.yaml`` file. It is a ``json`` format that contains all -the information that we need to *reproduce* the build of an -environment: - -.. code-block:: console - - $ head spack.lock - { - "concrete_specs": { - "teneqii2xv5u6zl5r6qi3pwurc6pmypz": { - "xz": { - "version": "5.2.4", - "arch": { - "platform": "linux", - "platform_os": "ubuntu16.04", - "target": "x86_64" - }, - ... - -``spack.yaml`` and ``spack.lock`` correspond to two fundamental concepts -in Spack, but for environments: - - * ``spack.yaml`` is the set of *abstract* specs and configuration that - you want to install. - * ``spack.lock`` is the set of all fully *concretized* specs generated - from concretizing ``spack.yaml`` - -Using either of these, you can recreate an environment that someone else -built. ``spack env create`` takes an extra optional argument, which can -be either a ``spack.yaml`` or a ``spack.lock`` file: - -.. code-block:: console - - $ spack env create my-project spack.yaml - - $ spack env create my-project spack.lock - -Both of these create a new environment called ``my-project``, but which -one you choose to use depends on your needs: - -#. copying the yaml file allows someone else to build your *requirements*, - potentially a different way. - -#. copying the lock file allows someone else to rebuild your - *installation* exactly as you built it. - -The first use case can *re-concretize* the same specs on new platforms in -order to build, but it will preserve the abstract requirements. The -second use case (currently) requires you to be on the same machine, but -it retains all decisions made during concretization and is faithful to a -prior install. diff --git a/lib/spack/docs/tutorial_modules.rst b/lib/spack/docs/tutorial_modules.rst deleted file mode 100644 index 686da9f26e7..00000000000 --- a/lib/spack/docs/tutorial_modules.rst +++ /dev/null @@ -1,1575 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _modules-tutorial: - -============ -Module Files -============ - -In this tutorial, we'll introduce a few concepts that are fundamental -to the generation of module files with Spack, and we'll guide you through -the customization of both module files content and their layout on disk. In the end you -should have a clear understanding of: - - * What are module files and how they work - * How Spack generates them - * Which commands are available to ease their maintenance - * How it is possible to customize them in all aspects - -.. _module_file_tutorial_overview: - -------------------- -Modules at a glance -------------------- - -Let's start by summarizing what module files are and how you can use -them to modify your environment. The idea is to give enough information so that -people without any previous exposure to them will be able to follow the tutorial -later on. We'll also give a high-level view of how module files are generated -in Spack. If you are already familiar with these topics you can quickly skim -through this section or move directly to :ref:`module_file_tutorial_prerequisites`. - -.. _module_file_tutorial_what_are_modules: - -^^^^^^^^^^^^^^^^^^^^^^ -What are module files? -^^^^^^^^^^^^^^^^^^^^^^ - -Module files are an easy way to modify your environment in a controlled manner -during a shell session. In general, they contain the information needed to run an -application or use a library, and they work in conjunction with a tool that -interprets them. -Typical module files instruct this tool to modify the environment variables when a -module file is loaded: - - .. code-block:: console - - $ module show zlib - ------------------------------------------------------------------- - /home/mculpo/PycharmProjects/spack/share/spack/modules/linux-ubuntu14.04-x86_64/zlib/1.2.11-gcc-7.2.0-linux-ubuntu14.04-x86_64-co2px3k: - - module-whatis A free, general-purpose, legally unencumbered lossless data-compression library. - prepend-path MANPATH /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/share/man - prepend-path LIBRARY_PATH /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/lib - prepend-path LD_LIBRARY_PATH /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/lib - prepend-path CPATH /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/include - prepend-path PKG_CONFIG_PATH /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/lib/pkgconfig - prepend-path CMAKE_PREFIX_PATH /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/ - ------------------------------------------------------------------- - - $ echo $LD_LIBRARY_PATH - - $ module load zlib - $ echo $LD_LIBRARY_PATH - /home/mculpo/PycharmProjects/spack/opt/spack/linux-ubuntu14.04-x86_64/gcc-7.2.0/zlib-1.2.11-co2px3k53m76lm6tofylh2mur2hnicux/lib - -and to undo the modifications when the same module file is unloaded: - - .. code-block:: console - - $ module unload zlib - $ echo $LD_LIBRARY_PATH - - $ - -Different formats exist for module files, and different tools -provide various levels of support for them. Spack can natively generate: - -1. Non-hierarchical module files written in TCL -2. Hierarchical module files written in Lua - -and can build `environment-modules `_ -and `lmod `_ as support tools. -Which of the formats or tools best suits one's needs depends on each particular -use-case. For the sake of illustration, we'll be working on -both formats using ``lmod``. - -.. seealso:: - Environment modules - This is the original tool that provided modules support. Its first - version was coded in C in the early '90s and was later substituted by a version - completely coded in TCL - the one Spack is distributing. More details on - its features are given in the `homepage of the project `_ - or in its `github page `_. The tool is able to - interpret the non-hierarchical TCL modulefiles written by Spack. - - Lmod - Lmod is a module system written in Lua, designed to easily handle hierarchies of - module files. It's a drop-in replacement of Environment Modules and works with - both of the module file formats generated by Spack. - Despite being fully compatible with Environment Modules there are many features that - are unique to Lmod. These features are either - `targeted towards safety `_ - or meant to - `extend the module system functionality `_. - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -How do we generate module files? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Before we dive into the hands-on sections it's worth spending a couple of words to explain how -module files are generated by Spack. The following diagram provides a high-level view -of the process: - - -.. image:: module_file_generation.* - -The red dashed line above represents Spack's boundaries, the blue one Spack's dependencies [#f1]_. -Module files are generated by combining: - - * the configuration details in ``config.yaml`` and ``modules.yaml`` - * the information contained in Spack packages (and processed by the module subpackage) - * a set of template files - -with `Jinja2 `_, an external template engine -that stamps out each particular module file. As Spack serves very diverse needs -this process has many points of customization, and we'll explore most of -them in the next sections. - -.. [#f1] Spack vendors its dependencies! This means that Spack comes with a copy of - each one of its dependencies, including ``Jinja2``, and is already configured to use them. - -.. _module_file_tutorial_prerequisites: - ----------------------- -Setup for the tutorial ----------------------- - -In order to showcase the capabilities of Spack's module file generation, we need -a representative set of software to work with. This set must include different -flavors of the same packages installed alongside each other and some -:ref:`external packages `. - -The purpose of this setup is not to make our life harder but to demonstrate -how Spack can help with similar situations, as they will happen on real HPC clusters. -For instance, it's often preferable for Spack to use vendor-provided MPI -implementations than to build one itself. - -To keep the set of software we're dealing with manageable, we're going -to uninstall everything from earlier in the tutorial. - -.. code-block: console - - $ spack uninstall -ay - -^^^^^^^^^^^^^^^^^^^ -Build a module tool -^^^^^^^^^^^^^^^^^^^ - -The first thing that we need is the module tool. In this case we -choose ``lmod`` as it can work with both hierarchical and non-hierarchical -module file layouts. - -.. code-block:: console - - $ bin/spack install lmod - -Once the module tool is installed we need to have it available in the -current shell. As the installation directories are definitely not easy -to remember, we'll employ the command ``spack location`` to retrieve the -``lmod`` prefix directly from Spack: - -.. code-block:: console - - $ . $(spack location -i lmod)/lmod/lmod/init/bash - -Now we can re-source the setup file and Spack modules will be put in -our module path. - -.. code-block:: console - - $ . share/spack/setup-env.sh - -.. FIXME: this needs bootstrap support for ``lmod`` - -.. FIXME: check the docs here, update them if necessary - If you need to install Lmod or Environment module you can refer - to the documentation :ref:`here `. - - -^^^^^^^^^^^^^^^^^^ -Add a new compiler -^^^^^^^^^^^^^^^^^^ - -The second step is to build a recent compiler. On first use, Spack -scans the environment and automatically locates the compiler(s) -already available on the system. For this tutorial, however, we want -to use ``gcc@7.2.0``. - - -.. code-block:: console - - $ spack install gcc@7.2.0 - ... - Wait a long time - ... - -Once ``gcc`` is installed we can use shell support to load it and make -it readily available: - -.. code-block:: console - - $ spack load gcc@7.2.0 - -It may not be apparent, but the last command employed the module files -generated automatically by Spack. What happens under the hood when you use -the ``spack load`` command is: - -1. the spec passed as argument is translated into a module file name -2. the current module tool is used to load that module file - -You can use this command to double check: - -.. code-block:: console - - $ module list - Currently Loaded Modules: - 1) gcc-7.2.0-gcc-5.4.0-b7smjjc - -Note that the 7-digit hash at the end of the generated module may vary depending -on architecture or package version. Now that we have ``gcc@7.2.0`` in ``PATH`` we -can finally add it to the list of compilers known to Spack: - -.. code-block:: console - - $ spack compiler add - ==> Added 1 new compiler to /home/spack1/.spack/linux/compilers.yaml - gcc@7.2.0 - ==> Compilers are defined in the following files: - /home/spack1/.spack/linux/compilers.yaml - - $ spack compiler list - ==> Available compilers - -- clang ubuntu16.04-x86_64 ------------------------------------- - clang@3.8.0-2ubuntu4 clang@3.7.1-2ubuntu2 - - -- gcc ubuntu16.04-x86_64 --------------------------------------- - gcc@7.2.0 gcc@5.4.0 gcc@4.7 - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Build the software that will be used in the tutorial -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Finally, we should use Spack to install the packages used in the examples: - -.. code-block:: console - - $ spack install netlib-scalapack ^openmpi ^openblas - $ spack install netlib-scalapack ^mpich ^openblas - $ spack install netlib-scalapack ^openmpi ^netlib-lapack - $ spack install netlib-scalapack ^mpich ^netlib-lapack - $ spack install py-scipy ^openblas - - -.. _module_file_tutorial_non_hierarchical: - ------------------------------ -Non-hierarchical module files ------------------------------ - -If you arrived to this point you should have an environment that looks similar to: - -.. code-block:: console - - $ module avail - - ----------------------------------------------- /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64 ----------------------------------------------- - autoconf-2.69-gcc-5.4.0-3sx2gxe libsigsegv-2.11-gcc-7.2.0-g67xpfd openssl-1.0.2o-gcc-5.4.0-b4y3w3b - autoconf-2.69-gcc-7.2.0-yb2makb libtool-2.4.6-gcc-5.4.0-o2pfwjf openssl-1.0.2o-gcc-7.2.0-cvldq3v - automake-1.16.1-gcc-5.4.0-rymw7im libtool-2.4.6-gcc-7.2.0-kt2udm6 pcre-8.42-gcc-5.4.0-gt5lgzi - automake-1.16.1-gcc-7.2.0-qoowd5q libxml2-2.9.8-gcc-5.4.0-wpexsph perl-5.26.2-gcc-5.4.0-ic2kyoa - bzip2-1.0.6-gcc-5.4.0-ufczdvs libxml2-2.9.8-gcc-7.2.0-47gf5kk perl-5.26.2-gcc-7.2.0-fdwz5yu - bzip2-1.0.6-gcc-7.2.0-mwamumj lmod-7.8-gcc-5.4.0-kmhks3p pkgconf-1.4.2-gcc-5.4.0-fovrh7a - cmake-3.12.3-gcc-7.2.0-obqgn2v lua-5.3.4-gcc-5.4.0-cpfeo2w pkgconf-1.4.2-gcc-7.2.0-yoxwmgb - curl-7.60.0-gcc-5.4.0-vzqreb2 lua-luafilesystem-1_6_3-gcc-5.4.0-alakjim py-numpy-1.15.2-gcc-7.2.0-wbwtcxf - diffutils-3.6-gcc-5.4.0-2rhuivg lua-luaposix-33.4.0-gcc-5.4.0-7wqhwoc py-scipy-1.1.0-gcc-7.2.0-d5n3cph - diffutils-3.6-gcc-7.2.0-eauxwi7 m4-1.4.18-gcc-5.4.0-suf5jtc py-setuptools-40.4.3-gcc-7.2.0-5dbwfwn - expat-2.2.5-gcc-5.4.0-emyv67q m4-1.4.18-gcc-7.2.0-wdzvagl python-2.7.15-gcc-7.2.0-ucmr2mn - findutils-4.6.0-gcc-7.2.0-ca4b7zq mpc-1.1.0-gcc-5.4.0-iuf3gc3 readline-7.0-gcc-5.4.0-nxhwrg7 - gcc-7.2.0-gcc-5.4.0-b7smjjc (L) mpfr-3.1.6-gcc-5.4.0-jnt2nnp readline-7.0-gcc-7.2.0-ccruj2i - gdbm-1.14.1-gcc-5.4.0-q4fpyuo mpich-3.2.1-gcc-7.2.0-vt5xcat sqlite-3.23.1-gcc-7.2.0-5ltus3a - gdbm-1.14.1-gcc-7.2.0-zk5lhob ncurses-6.1-gcc-5.4.0-3o765ou tar-1.30-gcc-5.4.0-dk7lrpo - gettext-0.19.8.1-gcc-5.4.0-tawgous ncurses-6.1-gcc-7.2.0-xcgzqdv tcl-8.6.8-gcc-5.4.0-qhwyccy - git-2.19.1-gcc-5.4.0-p3gjnfa netlib-lapack-3.8.0-gcc-7.2.0-fj7nayd texinfo-6.5-gcc-7.2.0-cuqnfgf - gmp-6.1.2-gcc-5.4.0-qc4qcfz netlib-scalapack-2.0.2-gcc-7.2.0-67nmj7g unzip-6.0-gcc-5.4.0-ba23fbg - hwloc-1.11.9-gcc-7.2.0-gbyc65s netlib-scalapack-2.0.2-gcc-7.2.0-6jgjbyg util-macros-1.19.1-gcc-7.2.0-t62kozq - isl-0.18-gcc-5.4.0-vttqout netlib-scalapack-2.0.2-gcc-7.2.0-prgo67d xz-5.2.4-gcc-5.4.0-teneqii - libbsd-0.8.6-gcc-5.4.0-f4qkkwm netlib-scalapack-2.0.2-gcc-7.2.0-zxpt252 xz-5.2.4-gcc-7.2.0-rql5kog - libiconv-1.15-gcc-5.4.0-u2x3umv numactl-2.0.11-gcc-7.2.0-rifwktk zlib-1.2.11-gcc-5.4.0-5nus6kn - libpciaccess-0.13.5-gcc-7.2.0-riipwi2 openblas-0.3.3-gcc-7.2.0-xxoxfh4 zlib-1.2.11-gcc-7.2.0-ezuwp4p - libsigsegv-2.11-gcc-5.4.0-fypapcp openmpi-3.1.3-gcc-7.2.0-do5xfer - - Where: - L: Module is loaded - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -The non-hierarchical module files that have been generated so far -follow :ref:`the default rules for module generation `. -Taking a look at the ``gcc`` module you'll see, for example: - -.. code-block:: console - - $ module show gcc-7.2.0-gcc-5.4.0-b7smjjc - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64/gcc-7.2.0-gcc-5.4.0-b7smjjc: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, and Go, as well as libraries for these languages. ") - prepend_path("PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin") - prepend_path("MANPATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/share/man") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib") - prepend_path("LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib64") - prepend_path("LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib64") - prepend_path("CPATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/include") - prepend_path("CMAKE_PREFIX_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/") - setenv("CC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gcc") - setenv("CXX","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/g++") - setenv("FC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F77","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F90","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, Ada, and Go, as well as libraries for these languages. - ]]) - -As expected, a few environment variables representing paths will be modified -by the module file according to the default prefix inspection rules. - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Filter unwanted modifications to the environment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Now consider the case that your site has decided that ``CPATH`` and -``LIBRARY_PATH`` modifications should not be present in module files. What you can -do to abide by the rules is to create a configuration file ``~/.spack/modules.yaml`` -with the following content: - -.. code-block:: yaml - - modules: - tcl: - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -Next you should regenerate all the module files: - -.. code-block:: console - - $ spack module tcl refresh - ==> You are about to regenerate tcl module files for: - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - 3sx2gxe autoconf@2.69 b7smjjc gcc@7.2.0 f4qkkwm libbsd@0.8.6 cpfeo2w lua@5.3.4 3o765ou ncurses@6.1 dk7lrpo tar@1.30 - rymw7im automake@1.16.1 q4fpyuo gdbm@1.14.1 u2x3umv libiconv@1.15 alakjim lua-luafilesystem@1_6_3 b4y3w3b openssl@1.0.2o qhwyccy tcl@8.6.8 - ufczdvs bzip2@1.0.6 tawgous gettext@0.19.8.1 fypapcp libsigsegv@2.11 7wqhwoc lua-luaposix@33.4.0 gt5lgzi pcre@8.42 ba23fbg unzip@6.0 - vzqreb2 curl@7.60.0 p3gjnfa git@2.19.1 o2pfwjf libtool@2.4.6 suf5jtc m4@1.4.18 ic2kyoa perl@5.26.2 teneqii xz@5.2.4 - 2rhuivg diffutils@3.6 qc4qcfz gmp@6.1.2 wpexsph libxml2@2.9.8 iuf3gc3 mpc@1.1.0 fovrh7a pkgconf@1.4.2 5nus6kn zlib@1.2.11 - emyv67q expat@2.2.5 vttqout isl@0.18 kmhks3p lmod@7.8 jnt2nnp mpfr@3.1.6 nxhwrg7 readline@7.0 - - -- linux-ubuntu16.04-x86_64 / gcc@7.2.0 ------------------------- - yb2makb autoconf@2.69 riipwi2 libpciaccess@0.13.5 6jgjbyg netlib-scalapack@2.0.2 fdwz5yu perl@5.26.2 cuqnfgf texinfo@6.5 - qoowd5q automake@1.16.1 g67xpfd libsigsegv@2.11 zxpt252 netlib-scalapack@2.0.2 yoxwmgb pkgconf@1.4.2 t62kozq util-macros@1.19.1 - mwamumj bzip2@1.0.6 kt2udm6 libtool@2.4.6 67nmj7g netlib-scalapack@2.0.2 wbwtcxf py-numpy@1.15.2 rql5kog xz@5.2.4 - obqgn2v cmake@3.12.3 47gf5kk libxml2@2.9.8 prgo67d netlib-scalapack@2.0.2 d5n3cph py-scipy@1.1.0 ezuwp4p zlib@1.2.11 - eauxwi7 diffutils@3.6 wdzvagl m4@1.4.18 rifwktk numactl@2.0.11 5dbwfwn py-setuptools@40.4.3 - ca4b7zq findutils@4.6.0 vt5xcat mpich@3.2.1 xxoxfh4 openblas@0.3.3 ucmr2mn python@2.7.15 - zk5lhob gdbm@1.14.1 xcgzqdv ncurses@6.1 do5xfer openmpi@3.1.3 ccruj2i readline@7.0 - gbyc65s hwloc@1.11.9 fj7nayd netlib-lapack@3.8.0 cvldq3v openssl@1.0.2o 5ltus3a sqlite@3.23.1 - - ==> Do you want to proceed? [y/n] y - ==> Regenerating tcl module files - -If you take a look now at the module for ``gcc`` you'll see that the unwanted -paths have disappeared: - -.. code-block:: console - - $ module show gcc-7.2.0-gcc-5.4.0-b7smjjc - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64/gcc-7.2.0-gcc-5.4.0-b7smjjc: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, and Go, as well as libraries for these languages. ") - prepend_path("PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin") - prepend_path("MANPATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/share/man") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib64") - prepend_path("CMAKE_PREFIX_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/") - setenv("CC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gcc") - setenv("CXX","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/g++") - setenv("FC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F77","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F90","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, Ada, and Go, as well as libraries for these languages. - ]]) - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Prevent some module files from being generated -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Another common request at many sites is to avoid exposing software that -is only needed as an intermediate step when building a newer stack. -Let's try to prevent the generation of -module files for anything that is compiled with ``gcc@5.4.0`` (the OS provided compiler). - -To do this you should add a ``blacklist`` keyword to ``~/.spack/modules.yaml``: - -.. code-block:: yaml - :emphasize-lines: 3,4 - - modules: - tcl: - blacklist: - - '%gcc@5.4.0' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -and regenerate the module files: - -This time it is convenient to pass the option ``--delete-tree`` to the command that -regenerates the module files to instruct it to delete the existing tree and regenerate -a new one instead of overwriting the files in the existing directory. - -.. code-block:: console - - $ spack module tcl refresh --delete-tree - ==> You are about to regenerate tcl module files for: - - -- linux-ubuntu16.04-x86_64 / gcc@5.4.0 ------------------------- - 3sx2gxe autoconf@2.69 b7smjjc gcc@7.2.0 f4qkkwm libbsd@0.8.6 cpfeo2w lua@5.3.4 3o765ou ncurses@6.1 dk7lrpo tar@1.30 - rymw7im automake@1.16.1 q4fpyuo gdbm@1.14.1 u2x3umv libiconv@1.15 alakjim lua-luafilesystem@1_6_3 b4y3w3b openssl@1.0.2o qhwyccy tcl@8.6.8 - ufczdvs bzip2@1.0.6 tawgous gettext@0.19.8.1 fypapcp libsigsegv@2.11 7wqhwoc lua-luaposix@33.4.0 gt5lgzi pcre@8.42 ba23fbg unzip@6.0 - vzqreb2 curl@7.60.0 p3gjnfa git@2.19.1 o2pfwjf libtool@2.4.6 suf5jtc m4@1.4.18 ic2kyoa perl@5.26.2 teneqii xz@5.2.4 - 2rhuivg diffutils@3.6 qc4qcfz gmp@6.1.2 wpexsph libxml2@2.9.8 iuf3gc3 mpc@1.1.0 fovrh7a pkgconf@1.4.2 5nus6kn zlib@1.2.11 - emyv67q expat@2.2.5 vttqout isl@0.18 kmhks3p lmod@7.8 jnt2nnp mpfr@3.1.6 nxhwrg7 readline@7.0 - - -- linux-ubuntu16.04-x86_64 / gcc@7.2.0 ------------------------- - yb2makb autoconf@2.69 riipwi2 libpciaccess@0.13.5 6jgjbyg netlib-scalapack@2.0.2 fdwz5yu perl@5.26.2 cuqnfgf texinfo@6.5 - qoowd5q automake@1.16.1 g67xpfd libsigsegv@2.11 zxpt252 netlib-scalapack@2.0.2 yoxwmgb pkgconf@1.4.2 t62kozq util-macros@1.19.1 - mwamumj bzip2@1.0.6 kt2udm6 libtool@2.4.6 67nmj7g netlib-scalapack@2.0.2 wbwtcxf py-numpy@1.15.2 rql5kog xz@5.2.4 - obqgn2v cmake@3.12.3 47gf5kk libxml2@2.9.8 prgo67d netlib-scalapack@2.0.2 d5n3cph py-scipy@1.1.0 ezuwp4p zlib@1.2.11 - eauxwi7 diffutils@3.6 wdzvagl m4@1.4.18 rifwktk numactl@2.0.11 5dbwfwn py-setuptools@40.4.3 - ca4b7zq findutils@4.6.0 vt5xcat mpich@3.2.1 xxoxfh4 openblas@0.3.3 ucmr2mn python@2.7.15 - zk5lhob gdbm@1.14.1 xcgzqdv ncurses@6.1 do5xfer openmpi@3.1.3 ccruj2i readline@7.0 - gbyc65s hwloc@1.11.9 fj7nayd netlib-lapack@3.8.0 cvldq3v openssl@1.0.2o 5ltus3a sqlite@3.23.1 - - ==> Do you want to proceed? [y/n] y - ==> Regenerating tcl module files - - $ module avail - - ----------------------------------------------- /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64 ----------------------------------------------- - autoconf-2.69-gcc-7.2.0-yb2makb m4-1.4.18-gcc-7.2.0-wdzvagl perl-5.26.2-gcc-7.2.0-fdwz5yu - automake-1.16.1-gcc-7.2.0-qoowd5q mpich-3.2.1-gcc-7.2.0-vt5xcat pkgconf-1.4.2-gcc-7.2.0-yoxwmgb - bzip2-1.0.6-gcc-7.2.0-mwamumj ncurses-6.1-gcc-7.2.0-xcgzqdv py-numpy-1.15.2-gcc-7.2.0-wbwtcxf - cmake-3.12.3-gcc-7.2.0-obqgn2v netlib-lapack-3.8.0-gcc-7.2.0-fj7nayd py-scipy-1.1.0-gcc-7.2.0-d5n3cph - diffutils-3.6-gcc-7.2.0-eauxwi7 netlib-scalapack-2.0.2-gcc-7.2.0-67nmj7g py-setuptools-40.4.3-gcc-7.2.0-5dbwfwn - findutils-4.6.0-gcc-7.2.0-ca4b7zq netlib-scalapack-2.0.2-gcc-7.2.0-6jgjbyg python-2.7.15-gcc-7.2.0-ucmr2mn - gdbm-1.14.1-gcc-7.2.0-zk5lhob netlib-scalapack-2.0.2-gcc-7.2.0-prgo67d readline-7.0-gcc-7.2.0-ccruj2i - hwloc-1.11.9-gcc-7.2.0-gbyc65s netlib-scalapack-2.0.2-gcc-7.2.0-zxpt252 sqlite-3.23.1-gcc-7.2.0-5ltus3a - libpciaccess-0.13.5-gcc-7.2.0-riipwi2 numactl-2.0.11-gcc-7.2.0-rifwktk texinfo-6.5-gcc-7.2.0-cuqnfgf - libsigsegv-2.11-gcc-7.2.0-g67xpfd openblas-0.3.3-gcc-7.2.0-xxoxfh4 util-macros-1.19.1-gcc-7.2.0-t62kozq - libtool-2.4.6-gcc-7.2.0-kt2udm6 openmpi-3.1.3-gcc-7.2.0-do5xfer xz-5.2.4-gcc-7.2.0-rql5kog - libxml2-2.9.8-gcc-7.2.0-47gf5kk openssl-1.0.2o-gcc-7.2.0-cvldq3v zlib-1.2.11-gcc-7.2.0-ezuwp4p - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -If you look closely you'll see though that we went too far in blacklisting modules: -the module for ``gcc@7.2.0`` disappeared as it was bootstrapped with ``gcc@5.4.0``. To specify -exceptions to the blacklist rules you can use ``whitelist``: - -.. code-block:: yaml - :emphasize-lines: 3,4 - - modules: - tcl: - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -``whitelist`` rules always have precedence over ``blacklist`` rules. If you regenerate the modules again: - -.. code-block:: console - - $ spack module tcl refresh -y - ==> Regenerating tcl module files - - -you'll see that now the module for ``gcc@7.2.0`` has reappeared: - -.. code-block:: console - - $ module avail gcc-7.2.0-gcc-5.4.0-b7smjjc - - -------------------------------------------- /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64 --------------------------------------------- - gcc-7.2.0-gcc-5.4.0-b7smjjc - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -An additional possibility that you can leverage to unclutter the environment -is that of preventing the generation of module files for implicitly installed -packages. In this case all one needs to do is to add the following line: - -.. code-block:: yaml - :emphasize-lines: 3 - - modules: - tcl: - blacklist_implicits: true - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -to ``modules.yaml`` and regenerate the module file tree as above. - -^^^^^^^^^^^^^^^^^^^^^^^^^ -Change module file naming -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The next step in making module files more user-friendly is to -improve their naming scheme. -To reduce the length of the hash or remove it altogether you can -use the ``hash_length`` keyword in the configuration file: - -.. code-block:: yaml - :emphasize-lines: 3 - - modules: - tcl: - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -If you try to regenerate the module files now you will get an error: - -.. code-block:: console - - $ spack module tcl refresh --delete-tree -y - ==> Error: Name clashes detected in module files: - - file: /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64/netlib-scalapack-2.0.2-gcc-7.2.0 - spec: netlib-scalapack@2.0.2%gcc@7.2.0 build_type=RelWithDebInfo ~pic+shared arch=linux-ubuntu16.04-x86_64 - spec: netlib-scalapack@2.0.2%gcc@7.2.0 build_type=RelWithDebInfo ~pic+shared arch=linux-ubuntu16.04-x86_64 - spec: netlib-scalapack@2.0.2%gcc@7.2.0 build_type=RelWithDebInfo ~pic+shared arch=linux-ubuntu16.04-x86_64 - spec: netlib-scalapack@2.0.2%gcc@7.2.0 build_type=RelWithDebInfo ~pic+shared arch=linux-ubuntu16.04-x86_64 - - ==> Error: Operation aborted - -.. note:: - We try to check for errors upfront! - In Spack we check for errors upfront whenever possible, so don't worry about your module files: - as a name clash was detected nothing has been changed on disk. - -The problem here is that without -the hashes the four different flavors of ``netlib-scalapack`` map to the same module file -name. We can add suffixes to differentiate them: - -.. code-block:: yaml - :emphasize-lines: 9-11,14-17 - - modules: - tcl: - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -As you can see it is possible to specify rules that apply only to a -restricted set of packages using :ref:`anonymous specs `. -Regenerating module files now we obtain: - -.. code-block:: console - - $ spack module tcl refresh --delete-tree -y - ==> Regenerating tcl module files - $ module avail - - ----------------------------------------------- /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64 ----------------------------------------------- - autoconf-2.69-gcc-7.2.0 m4-1.4.18-gcc-7.2.0 pkgconf-1.4.2-gcc-7.2.0 - automake-1.16.1-gcc-7.2.0 mpich-3.2.1-gcc-7.2.0 py-numpy-1.15.2-gcc-7.2.0-openblas - bzip2-1.0.6-gcc-7.2.0 ncurses-6.1-gcc-7.2.0 py-scipy-1.1.0-gcc-7.2.0-openblas - cmake-3.12.3-gcc-7.2.0 netlib-lapack-3.8.0-gcc-7.2.0 py-setuptools-40.4.3-gcc-7.2.0 - diffutils-3.6-gcc-7.2.0 netlib-scalapack-2.0.2-gcc-7.2.0-netlib-mpich python-2.7.15-gcc-7.2.0 - findutils-4.6.0-gcc-7.2.0 netlib-scalapack-2.0.2-gcc-7.2.0-netlib-openmpi readline-7.0-gcc-7.2.0 - gcc-7.2.0-gcc-5.4.0 netlib-scalapack-2.0.2-gcc-7.2.0-openblas-mpich sqlite-3.23.1-gcc-7.2.0 - gdbm-1.14.1-gcc-7.2.0 netlib-scalapack-2.0.2-gcc-7.2.0-openblas-openmpi texinfo-6.5-gcc-7.2.0 - hwloc-1.11.9-gcc-7.2.0 numactl-2.0.11-gcc-7.2.0 util-macros-1.19.1-gcc-7.2.0 - libpciaccess-0.13.5-gcc-7.2.0 openblas-0.3.3-gcc-7.2.0 xz-5.2.4-gcc-7.2.0 - libsigsegv-2.11-gcc-7.2.0 openmpi-3.1.3-gcc-7.2.0 zlib-1.2.11-gcc-7.2.0 - libtool-2.4.6-gcc-7.2.0 openssl-1.0.2o-gcc-7.2.0 - libxml2-2.9.8-gcc-7.2.0 perl-5.26.2-gcc-7.2.0 - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -Finally we can set a ``naming_scheme`` to prevent users from loading -modules that refer to different flavors of the same library/application: - -.. code-block:: yaml - :emphasize-lines: 4,10,11 - - modules: - tcl: - hash_length: 0 - naming_scheme: '{name}/{version}-{compiler.name}-{compiler.version}' - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - conflict: - - '{name}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -The final result should look like: - -.. code-block:: console - - $ spack module tcl refresh --delete-tree -y - ==> Regenerating tcl module files - $ module avail - - ----------------------------------------------- /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64 ----------------------------------------------- - autoconf/2.69-gcc-7.2.0 m4/1.4.18-gcc-7.2.0 pkgconf/1.4.2-gcc-7.2.0 - automake/1.16.1-gcc-7.2.0 mpich/3.2.1-gcc-7.2.0 py-numpy/1.15.2-gcc-7.2.0-openblas - bzip2/1.0.6-gcc-7.2.0 ncurses/6.1-gcc-7.2.0 py-scipy/1.1.0-gcc-7.2.0-openblas - cmake/3.12.3-gcc-7.2.0 netlib-lapack/3.8.0-gcc-7.2.0 py-setuptools/40.4.3-gcc-7.2.0 - diffutils/3.6-gcc-7.2.0 netlib-scalapack/2.0.2-gcc-7.2.0-netlib-mpich python/2.7.15-gcc-7.2.0 - findutils/4.6.0-gcc-7.2.0 netlib-scalapack/2.0.2-gcc-7.2.0-netlib-openmpi readline/7.0-gcc-7.2.0 - gcc/7.2.0-gcc-5.4.0 netlib-scalapack/2.0.2-gcc-7.2.0-openblas-mpich sqlite/3.23.1-gcc-7.2.0 - gdbm/1.14.1-gcc-7.2.0 netlib-scalapack/2.0.2-gcc-7.2.0-openblas-openmpi (D) texinfo/6.5-gcc-7.2.0 - hwloc/1.11.9-gcc-7.2.0 numactl/2.0.11-gcc-7.2.0 util-macros/1.19.1-gcc-7.2.0 - libpciaccess/0.13.5-gcc-7.2.0 openblas/0.3.3-gcc-7.2.0 xz/5.2.4-gcc-7.2.0 - libsigsegv/2.11-gcc-7.2.0 openmpi/3.1.3-gcc-7.2.0 zlib/1.2.11-gcc-7.2.0 - libtool/2.4.6-gcc-7.2.0 openssl/1.0.2o-gcc-7.2.0 - libxml2/2.9.8-gcc-7.2.0 perl/5.26.2-gcc-7.2.0 - - Where: - D: Default Module - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -.. note:: - TCL specific directive - The directives ``naming_scheme`` and ``conflict`` are TCL specific and - can't be used in the ``lmod`` section of the configuration file. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Add custom environment modifications -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -At many sites it is customary to set an environment variable in a -package's module file that points to the folder in which the package -is installed. You can achieve this with Spack by adding an -``environment`` directive to the configuration file: - -.. code-block:: yaml - :emphasize-lines: 17-19 - - modules: - tcl: - hash_length: 0 - naming_scheme: '{name}/{version}-{compiler.name}-{compiler.version}' - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - conflict: - - '{name}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '{name}_ROOT': '{prefix}' - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -Under the hood Spack uses the :meth:`~spack.spec.Spec.format` API to substitute -tokens in either environment variable names or values. There are two caveats though: - -- The set of allowed tokens in variable names is restricted to - ``name``, ``version``, ``compiler``, ``compiler.name``, - ``compiler.version``, ``architecture`` -- Any token expanded in a variable name is made uppercase, but other than that - case sensitivity is preserved - -Regenerating the module files results in something like: - -.. code-block:: console - :emphasize-lines: 15 - - $ spack module tcl refresh -y - ==> Regenerating tcl module files - - $ module show gcc - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64/gcc/7.2.0-gcc-5.4.0: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, and Go, as well as libraries for these languages. ") - conflict("gcc") - prepend_path("PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin") - prepend_path("MANPATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/share/man") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib64") - prepend_path("CMAKE_PREFIX_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/") - setenv("CC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gcc") - setenv("CXX","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/g++") - setenv("FC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F77","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F90","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("GCC_ROOT","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, Ada, and Go, as well as libraries for these languages. - ]]) - -As you can see, the ``gcc`` module has the environment variable ``GCC_ROOT`` set. - -Sometimes it's also useful to apply environment modifications selectively and target -only certain packages. You can, for instance set the common variables ``CC``, ``CXX``, -etc. in the ``gcc`` module file and apply other custom modifications to the -``openmpi`` modules as follows: - -.. code-block:: yaml - :emphasize-lines: 20-32 - - modules: - tcl: - hash_length: 0 - naming_scheme: '{name}/{version}-{compiler.name}-{compiler.version}' - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - conflict: - - '{name}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '{name}_ROOT': '{prefix}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -This time we will be more selective and regenerate only the ``gcc`` and -``openmpi`` module files: - -.. code-block:: console - - $ spack module tcl refresh -y gcc - ==> Regenerating tcl module files - - $ spack module tcl refresh -y openmpi - ==> Regenerating tcl module files - - $ module show gcc - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64/gcc/7.2.0-gcc-5.4.0: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, and Go, as well as libraries for these languages. ") - conflict("gcc") - prepend_path("PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin") - prepend_path("MANPATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/share/man") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/lib64") - prepend_path("CMAKE_PREFIX_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/") - setenv("CC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gcc") - setenv("CXX","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/g++") - setenv("FC","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F77","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("F90","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs/bin/gfortran") - setenv("GCC_ROOT","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/gcc-7.2.0-b7smjjcsmwe5u5fcsvjmonlhlzzctnfs") - setenv("CC","gcc") - setenv("CXX","g++'") - setenv("FC","gfortran") - setenv("F77","gfortran") - setenv("F90","gfortran") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, Ada, and Go, as well as libraries for these languages. - ]]) - - $ module show openmpi - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64/openmpi/3.1.3-gcc-7.2.0: - ------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("An open source Message Passing Interface implementation. ") - conflict("openmpi") - prepend_path("PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4/bin") - prepend_path("MANPATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4/share/man") - prepend_path("LD_LIBRARY_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4/lib") - prepend_path("PKG_CONFIG_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4/lib/pkgconfig") - prepend_path("CMAKE_PREFIX_PATH","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4/") - setenv("OPENMPI_ROOT","/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/openmpi-3.1.3-do5xfer2whhk7gc26atgs3ozr3ljbvs4") - setenv("SLURM_MPI_TYPE","pmi2") - setenv("OMPI_MCA_btl_openib_warn_default_gid_prefix","0") - help([[An open source Message Passing Interface implementation. The Open MPI - Project is an open source Message Passing Interface implementation that - is developed and maintained by a consortium of academic, research, and - industry partners. Open MPI is therefore able to combine the expertise, - technologies, and resources from all across the High Performance - Computing community in order to build the best MPI library available. - Open MPI offers advantages for system and software vendors, application - developers and computer science researchers. - ]]) - - -^^^^^^^^^^^^^^^^^^^^^ -Autoload dependencies -^^^^^^^^^^^^^^^^^^^^^ - -Spack can also generate module files that contain code to load the -dependencies automatically. You can, for instance generate python -modules that load their dependencies by adding the ``autoload`` -directive and assigning it the value ``direct``: - -.. code-block:: yaml - :emphasize-lines: 3,38,39 - - modules: - tcl: - verbose: True - hash_length: 0 - naming_scheme: '{name}/{version}-{compiler.name}-{compiler.version}' - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - conflict: - - '{name}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '{name}_ROOT': '{prefix}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - ^python: - autoload: 'direct' - -and regenerating the module files for every package that depends on ``python``: - -.. code-block:: console - - root@module-file-tutorial:/# spack module tcl refresh -y ^python - ==> Regenerating tcl module files - -Now the ``py-scipy`` module will be: - -.. code-block:: tcl - - #%Module1.0 - ## Module file created by spack (https://github.com/spack/spack) on 2018-11-11 22:10:48.834221 - ## - ## py-scipy@1.1.0%gcc@7.2.0 arch=linux-ubuntu16.04-x86_64 /d5n3cph - ## - - - module-whatis "SciPy (pronounced 'Sigh Pie') is a Scientific Library for Python. It provides many user-friendly and efficient numerical routines such as routines for numerical integration and optimization." - - proc ModulesHelp { } { - puts stderr "SciPy (pronounced "Sigh Pie") is a Scientific Library for Python. It" - puts stderr "provides many user-friendly and efficient numerical routines such as" - puts stderr "routines for numerical integration and optimization." - } - - if { [ module-info mode load ] && ![ is-loaded python/2.7.15-gcc-7.2.0 ] } { - puts stderr "Autoloading python/2.7.15-gcc-7.2.0" - module load python/2.7.15-gcc-7.2.0 - } - if { [ module-info mode load ] && ![ is-loaded openblas/0.3.3-gcc-7.2.0 ] } { - puts stderr "Autoloading openblas/0.3.3-gcc-7.2.0" - module load openblas/0.3.3-gcc-7.2.0 - } - if { [ module-info mode load ] && ![ is-loaded py-numpy/1.15.2-gcc-7.2.0-openblas ] } { - puts stderr "Autoloading py-numpy/1.15.2-gcc-7.2.0-openblas" - module load py-numpy/1.15.2-gcc-7.2.0-openblas - } - conflict py-scipy - - prepend-path LD_LIBRARY_PATH "/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/py-scipy-1.1.0-d5n3cphk2lx2v74ypwb6h7tna7vvgdyn/lib" - prepend-path CMAKE_PREFIX_PATH "/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/py-scipy-1.1.0-d5n3cphk2lx2v74ypwb6h7tna7vvgdyn/" - prepend-path PYTHONPATH "/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/py-scipy-1.1.0-d5n3cphk2lx2v74ypwb6h7tna7vvgdyn/lib/python2.7/site-packages" - setenv PY_SCIPY_ROOT "/home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/py-scipy-1.1.0-d5n3cphk2lx2v74ypwb6h7tna7vvgdyn" - -and will contain code to autoload all the dependencies: - -.. code-block:: console - - $ module load py-scipy - Autoloading python/2.7.15-gcc-7.2.0 - Autoloading openblas/0.3.3-gcc-7.2.0 - Autoloading py-numpy/1.15.2-gcc-7.2.0-openblas - -In case messages are unwanted during the autoload procedure, it will be -sufficient to omit the line setting ``verbose: True`` in the configuration file above. - -------------------------- -Hierarchical module files -------------------------- - -So far we worked with non-hierarchical module files, i.e. with module files -that are all generated in the same root directory and don't attempt to -dynamically modify the ``MODULEPATH``. This results in a flat module structure where -all the software is visible at the same time: - -.. code-block:: console - - $ module avail - - ----------------------------------------------- /home/spack1/spack/share/spack/modules/linux-ubuntu16.04-x86_64 ----------------------------------------------- - autoconf/2.69-gcc-7.2.0 m4/1.4.18-gcc-7.2.0 pkgconf/1.4.2-gcc-7.2.0 - automake/1.16.1-gcc-7.2.0 mpich/3.2.1-gcc-7.2.0 py-numpy/1.15.2-gcc-7.2.0-openblas (L) - bzip2/1.0.6-gcc-7.2.0 ncurses/6.1-gcc-7.2.0 py-scipy/1.1.0-gcc-7.2.0-openblas (L) - cmake/3.12.3-gcc-7.2.0 netlib-lapack/3.8.0-gcc-7.2.0 py-setuptools/40.4.3-gcc-7.2.0 - diffutils/3.6-gcc-7.2.0 netlib-scalapack/2.0.2-gcc-7.2.0-netlib-mpich python/2.7.15-gcc-7.2.0 (L) - findutils/4.6.0-gcc-7.2.0 netlib-scalapack/2.0.2-gcc-7.2.0-netlib-openmpi readline/7.0-gcc-7.2.0 - gcc/7.2.0-gcc-5.4.0 netlib-scalapack/2.0.2-gcc-7.2.0-openblas-mpich sqlite/3.23.1-gcc-7.2.0 - gdbm/1.14.1-gcc-7.2.0 netlib-scalapack/2.0.2-gcc-7.2.0-openblas-openmpi (D) texinfo/6.5-gcc-7.2.0 - hwloc/1.11.9-gcc-7.2.0 numactl/2.0.11-gcc-7.2.0 util-macros/1.19.1-gcc-7.2.0 - libpciaccess/0.13.5-gcc-7.2.0 openblas/0.3.3-gcc-7.2.0 (L) xz/5.2.4-gcc-7.2.0 - libsigsegv/2.11-gcc-7.2.0 openmpi/3.1.3-gcc-7.2.0 zlib/1.2.11-gcc-7.2.0 - libtool/2.4.6-gcc-7.2.0 openssl/1.0.2o-gcc-7.2.0 - libxml2/2.9.8-gcc-7.2.0 perl/5.26.2-gcc-7.2.0 - - Where: - L: Module is loaded - D: Default Module - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -This layout is quite simple to deploy, but you can see from the above snippet -that nothing prevents users from loading incompatible sets of modules: - -.. code-block:: console - - $ module purge - $ module load netlib-lapack/3.8.0-gcc-7.2.0 openblas/0.3.3-gcc-7.2.0 - $ module list - - Currently Loaded Modules: - 1) netlib-lapack/3.8.0-gcc-7.2.0 2) openblas/0.3.3-gcc-7.2.0 - -Even if ``conflicts`` directives are carefully placed in module files, they: - - - won't enforce a consistent environment, but will just report an error - - need constant updates, for instance as soon as a new compiler or MPI library is installed - -`Hierarchical module files `_ try to -overcome these shortcomings by showing at start-up only a restricted view of what is -available on the system: more specifically only the software that has been installed with -OS provided compilers. Among this software there will be other - usually more recent - compilers -that, once loaded, will prepend new directories to ``MODULEPATH`` unlocking all the software -that was compiled with them. This "unlocking" idea can then be extended arbitrarily to -virtual dependencies, as we'll see in the following section. - -^^^^^^^^^^^^^^^^^ -Core/Compiler/MPI -^^^^^^^^^^^^^^^^^ - -The most widely used hierarchy is the so called ``Core/Compiler/MPI`` where, on top -of the compilers, different MPI libraries also unlock software linked to them. -There are just a few steps needed to adapt the ``modules.yaml`` file we used previously: - - #. enable the ``lmod`` file generator - #. change the ``tcl`` tag to ``lmod`` - #. remove ``tcl`` specific directives (``naming_scheme`` and ``conflict``) - #. declare which compilers are considered ``core_compilers`` - #. remove the ``mpi`` related suffixes (as they will be substituted by hierarchies) - -After these modifications your configuration file should look like: - -.. code-block:: yaml - :emphasize-lines: 2-8 - - modules: - enable:: - - lmod - lmod: - core_compilers: - - 'gcc@5.4.0' - hierarchy: - - mpi - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '{name}_ROOT': '{prefix}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - - -.. note:: - Double colon in configuration files - The double colon after ``enable`` is intentional and it serves the - purpose of overriding the default list of enabled generators so - that only ``lmod`` will be active (see :ref:`config-overrides` for more - details). - -The directive ``core_compilers`` accepts a list of compilers. Everything built -using these compilers will create a module in the ``Core`` part of the hierarchy, -which is the entry point for hierarchical module files. It is -common practice to put the OS provided compilers in the list and only build common utilities -and other compilers with them. - -If we now regenerate the module files: - -.. code-block:: console - - $ spack module lmod refresh --delete-tree -y - ==> Regenerating lmod module files - -and update ``MODULEPATH`` to point to the ``Core``: - -.. code-block:: console - - $ module purge - $ module unuse $HOME/spack/share/spack/modules/linux-ubuntu16.04-x86_64 - $ module use $HOME/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/Core - -asking for the available modules will return: - -.. code-block:: console - - $ module avail - - ----------------------------------------------------------- share/spack/lmod/linux-ubuntu16.04-x86_64/Core ------------------------------------------------------------ - gcc/7.2.0 - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -Unsurprisingly, the only visible module is ``gcc``. Loading that we'll unlock -the ``Compiler`` part of the hierarchy: - -.. code-block:: console - - $ module load gcc - $ module avail - - ------------------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/gcc/7.2.0 -------------------------------------------- - autoconf/2.69 findutils/4.6.0 libtool/2.4.6 netlib-lapack/3.8.0 perl/5.26.2 python/2.7.15 xz/5.2.4 - automake/1.16.1 gdbm/1.14.1 libxml2/2.9.8 numactl/2.0.11 pkgconf/1.4.2 readline/7.0 zlib/1.2.11 - bzip2/1.0.6 hwloc/1.11.9 m4/1.4.18 openblas/0.3.3 py-numpy/1.15.2-openblas sqlite/3.23.1 - cmake/3.12.3 libpciaccess/0.13.5 mpich/3.2.1 openmpi/3.1.3 py-scipy/1.1.0-openblas texinfo/6.5 - diffutils/3.6 libsigsegv/2.11 ncurses/6.1 openssl/1.0.2o py-setuptools/40.4.3 util-macros/1.19.1 - - ----------------------------------------------------------- share/spack/lmod/linux-ubuntu16.04-x86_64/Core ------------------------------------------------------------ - gcc/7.2.0 (L) - - Where: - L: Module is loaded - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -The same holds true also for the ``MPI`` part, that you can enable by loading -either ``mpich`` or ``openmpi``. Let's start by loading ``mpich``: - -.. code-block:: console - - $ module load mpich - $ module avail - - --------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/mpich/3.2.1-vt5xcat/gcc/7.2.0 ---------------------------------- - netlib-scalapack/2.0.2-netlib netlib-scalapack/2.0.2-openblas (D) - - ------------------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/gcc/7.2.0 -------------------------------------------- - autoconf/2.69 findutils/4.6.0 libtool/2.4.6 netlib-lapack/3.8.0 perl/5.26.2 python/2.7.15 xz/5.2.4 - automake/1.16.1 gdbm/1.14.1 libxml2/2.9.8 numactl/2.0.11 pkgconf/1.4.2 readline/7.0 zlib/1.2.11 - bzip2/1.0.6 hwloc/1.11.9 m4/1.4.18 openblas/0.3.3 py-numpy/1.15.2-openblas sqlite/3.23.1 - cmake/3.12.3 libpciaccess/0.13.5 mpich/3.2.1 (L) openmpi/3.1.3 py-scipy/1.1.0-openblas texinfo/6.5 - diffutils/3.6 libsigsegv/2.11 ncurses/6.1 openssl/1.0.2o py-setuptools/40.4.3 util-macros/1.19.1 - - ----------------------------------------------------------- share/spack/lmod/linux-ubuntu16.04-x86_64/Core ------------------------------------------------------------ - gcc/7.2.0 (L) - - Where: - L: Module is loaded - D: Default Module - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - - - root@module-file-tutorial:/# module load openblas netlib-scalapack/2.0.2-openblas - root@module-file-tutorial:/# module list - - Currently Loaded Modules: - 1) gcc/7.2.0 2) mpich/3.2.1 3) openblas/0.3.3 4) netlib-scalapack/2.0.2-openblas - -At this point we can showcase the improved consistency that a hierarchical layout provides -over a non-hierarchical one: - -.. code-block:: console - - $ module load openmpi - - Lmod is automatically replacing "mpich/3.2.1" with "openmpi/3.1.3". - - - Due to MODULEPATH changes, the following have been reloaded: - 1) netlib-scalapack/2.0.2-openblas - -``Lmod`` took care of swapping the MPI provider for us, and it also substituted the -``netlib-scalapack`` module to conform to the change in the MPI. -In this way we can't accidentally pull-in two different MPI providers at the -same time or load a module file for a package linked to ``openmpi`` when ``mpich`` is also loaded. -Consistency for compilers and MPI is ensured by the tool. - - -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Add LAPACK to the hierarchy -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The hierarchy just shown is already a great improvement over non-hierarchical layouts, -but it still has an asymmetry: ``LAPACK`` providers cover the same semantic role -as ``MPI`` providers, but yet they are not part of the hierarchy. - -To be more practical, this means that although we have gained an improved consistency in -our environment when it comes to ``MPI``, we still have the same problems as we had before -for ``LAPACK`` implementations: - -.. code-block:: console - - root@module-file-tutorial:/# module list - - Currently Loaded Modules: - 1) gcc/7.2.0 2) openblas/0.3.3 3) openmpi/3.1.3 4) netlib-scalapack/2.0.2-openblas - - root@module-file-tutorial:/# module load netlib-scalapack/2.0.2-netlib - - The following have been reloaded with a version change: - 1) netlib-scalapack/2.0.2-openblas => netlib-scalapack/2.0.2-netlib - - root@module-file-tutorial:/# module list - - Currently Loaded Modules: - 1) gcc/7.2.0 2) openblas/0.3.3 3) openmpi/3.1.3 4) netlib-scalapack/2.0.2-netlib - -Hierarchies that are deeper than ``Core``/``Compiler``/``MPI`` are -probably still considered "unusual" or "impractical" at many sites, mainly because -module files are written manually and keeping track of the combinations -among multiple providers quickly becomes quite involved. - -For instance, having both ``MPI`` and ``LAPACK`` in the hierarchy -means we must classify software into one of four categories: - - #. Software that doesn't depend on ``MPI`` or ``LAPACK`` - #. Software that depends only on ``MPI`` - #. Software that depends only on ``LAPACK`` - #. Software that depends on both - -to decide when to show it to the user. The situation becomes more involved as the number of virtual -dependencies in the hierarchy increases. - -We can take advantage of the DAG that Spack maintains for the installed software and solve -this combinatorial problem in a clean and automated way. -In some sense Spack's ability to manage this combinatorial complexity makes deeper -hierarchies feasible. - -Coming back to our example, let's add ``lapack`` to the hierarchy and remove any remaining suffix: - -.. code-block:: yaml - :emphasize-lines: 9 - - modules: - enable:: - - lmod - lmod: - core_compilers: - - 'gcc@5.4.0' - hierarchy: - - mpi - - lapack - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '{name}_ROOT': '{prefix}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - -After module files have been regenerated as usual: - -.. code-block:: console - - root@module-file-tutorial:/# module purge - - root@module-file-tutorial:/# spack module lmod refresh --delete-tree -y - ==> Regenerating lmod module files - -we can see that now we have additional components in the hierarchy: - -.. code-block:: console - - $ module load gcc - $ module load openblas - $ module avail - - -------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/openblas/0.3.3-xxoxfh4/gcc/7.2.0 -------------------------------- - py-numpy/1.15.2 py-scipy/1.1.0 - - ------------------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/gcc/7.2.0 -------------------------------------------- - autoconf/2.69 findutils/4.6.0 libtool/2.4.6 netlib-lapack/3.8.0 perl/5.26.2 sqlite/3.23.1 - automake/1.16.1 gdbm/1.14.1 libxml2/2.9.8 numactl/2.0.11 pkgconf/1.4.2 texinfo/6.5 - bzip2/1.0.6 hwloc/1.11.9 m4/1.4.18 openblas/0.3.3 (L) py-setuptools/40.4.3 util-macros/1.19.1 - cmake/3.12.3 libpciaccess/0.13.5 mpich/3.2.1 openmpi/3.1.3 python/2.7.15 xz/5.2.4 - diffutils/3.6 libsigsegv/2.11 ncurses/6.1 openssl/1.0.2o readline/7.0 zlib/1.2.11 - - ----------------------------------------------------------- share/spack/lmod/linux-ubuntu16.04-x86_64/Core ------------------------------------------------------------ - gcc/7.2.0 (L) - - Where: - L: Module is loaded - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - - - $ module load openmpi - $ module avail - - --------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/openmpi/3.1.3-do5xfer/openblas/0.3.3-xxoxfh4/gcc/7.2.0 --------------------- - netlib-scalapack/2.0.2 - - -------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/openblas/0.3.3-xxoxfh4/gcc/7.2.0 -------------------------------- - py-numpy/1.15.2 py-scipy/1.1.0 - - ------------------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/gcc/7.2.0 -------------------------------------------- - autoconf/2.69 findutils/4.6.0 libtool/2.4.6 netlib-lapack/3.8.0 perl/5.26.2 sqlite/3.23.1 - automake/1.16.1 gdbm/1.14.1 libxml2/2.9.8 numactl/2.0.11 pkgconf/1.4.2 texinfo/6.5 - bzip2/1.0.6 hwloc/1.11.9 m4/1.4.18 openblas/0.3.3 (L) py-setuptools/40.4.3 util-macros/1.19.1 - cmake/3.12.3 libpciaccess/0.13.5 mpich/3.2.1 openmpi/3.1.3 (L) python/2.7.15 xz/5.2.4 - diffutils/3.6 libsigsegv/2.11 ncurses/6.1 openssl/1.0.2o readline/7.0 zlib/1.2.11 - - ---------------------------------------------- /home/spack1/spack/share/spack/lmod/linux-ubuntu16.04-x86_64/Core ---------------------------------------------- - gcc/7.2.0 (L) - - Where: - L: Module is loaded - - Use "module spider" to find all possible modules. - Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys". - -Both ``MPI`` and ``LAPACK`` providers will now benefit from the same safety features: - -.. code-block:: console - - $ module load py-numpy netlib-scalapack - $ module load mpich - - Lmod is automatically replacing "openmpi/3.1.3" with "mpich/3.2.1". - - - Due to MODULEPATH changes, the following have been reloaded: - 1) netlib-scalapack/2.0.2 - - $ module load netlib-lapack - - Lmod is automatically replacing "openblas/0.3.3" with "netlib-lapack/3.8.0". - - - Inactive Modules: - 1) py-numpy - - Due to MODULEPATH changes, the following have been reloaded: - 1) netlib-scalapack/2.0.2 - -Because we only compiled ``py-numpy`` with ``openblas`` the module -is made inactive when we switch the ``LAPACK`` provider. The user -environment is now consistent by design! - ----------------------- -Working with templates ----------------------- - -As briefly mentioned in the introduction, Spack uses `Jinja2 `_ -to generate each individual module file. -This means that you have all of its flexibility and power when it comes to -customizing what gets generated! - -^^^^^^^^^^^^^^^^^^^^^ -Module file templates -^^^^^^^^^^^^^^^^^^^^^ - -The templates that Spack uses to generate module files are stored in the -``share/spack/templates/module`` directory within the Spack prefix, and -they all share the same common structure. Usually, they start with a -header that identifies the type of module being generated. In the case of -hierarchical module files it's: - -.. literalinclude:: _spack_root/share/spack/templates/modules/modulefile.lua - :language: jinja - :lines: 1-6 - -The statements within double curly brackets ``{{ ... }}`` denote -`expressions `_ -that will be evaluated and substituted at module generation time. -The rest of the file is then divided into -`blocks `_ -that can be overridden or extended by users, if need be. -`Control structures `_ -, delimited by ``{% ... %}``, -are also permitted in the template language: - -.. literalinclude:: _spack_root/share/spack/templates/modules/modulefile.lua - :language: jinja - :lines: 73-88 - -The locations where Spack looks for templates are specified -in ``config.yaml``: - -.. literalinclude:: _spack_root/etc/spack/defaults/config.yaml - :language: yaml - :lines: 21-24 - -and can be extended by users to employ custom templates, as we'll see next. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Extend the default templates -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Let's assume one of our software is protected by group membership: -allowed users belong to the same linux group, and access is granted at group level. -Wouldn't it be nice if people that are not -yet entitled to use it could receive a helpful message at module load time -that tells them who to contact in your organization to be inserted in the group? - -To automate the generation of module files with such site-specific behavior -we'll start by extending the list of locations where Spack looks for module -files. Let's create the file ``~/.spack/config.yaml`` with the content: - -.. code-block:: yaml - - config: - template_dirs: - - $HOME/.spack/templates - -This tells Spack to also search another location when looking for template files. -Next, we need to create our custom template extension in the folder listed above: - -.. code-block:: jinja - - {% extends "modules/modulefile.lua" %} - {% block footer %} - -- Access is granted only to specific groups - if not isDir("{{ spec.prefix }}") then - LmodError ( - "You don't have the necessary rights to run \"{{ spec.name }}\".\n\n", - "\tPlease write an e-mail to 1234@foo.com if you need further information on how to get access to it.\n" - ) - end - {% endblock %} - -Let's name this file ``group-restricted.lua``. The line: - -.. code-block:: jinja - - {% extends "modules/modulefile.lua" %} - -tells Jinja2 that we are reusing the standard template for hierarchical module files. -The section: - -.. code-block:: jinja - - {% block footer %} - -- Access is granted only to specific groups - if not isDir("{{ spec.prefix }}") then - LmodError ( - "You don't have the necessary rights to run \"{{ spec.name }}\".\n\n", - "\tPlease write an e-mail to 1234@foo.com if you need further information on how to get access to it.\n" - ) - end - {% endblock %} - -overrides the ``footer`` block. -Finally, we need to add a couple of lines in ``modules.yaml`` to tell Spack which specs -need to use the new custom template. For the sake of illustration let's assume -it's ``netlib-scalapack``: - -.. code-block:: yaml - :emphasize-lines: 35-36 - - modules: - enable:: - - lmod - lmod: - core_compilers: - - 'gcc@5.4.0' - hierarchy: - - mpi - - lapack - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@5.4.0' - - readline - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '{name}_ROOT': '{prefix}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - netlib-scalapack: - template: 'group-restricted.lua' - -If we regenerate the module files one last time: - -.. code-block:: console - - root@module-file-tutorial:/# spack module lmod refresh -y netlib-scalapack - ==> Regenerating lmod module files - -we'll find the following at the end of each ``netlib-scalapack`` module file: - -.. code-block:: lua - - -- Access is granted only to specific groups - if not isDir("/usr/local/opt/spack/linux-ubuntu16.04-x86_64/gcc-7.2.0/netlib-scalapack-2.0.2-d3lertflood3twaor44eam2kcr4l72ag") then - LmodError ( - "You don't have the necessary rights to run \"netlib-scalapack\".\n\n", - "\tPlease write an e-mail to 1234@foo.com if you need further information on how to get access to it.\n" - ) - end - -and every user that doesn't have access to the software will now be redirected to -the right e-mail address where to ask for it! diff --git a/lib/spack/docs/tutorial_packaging.rst b/lib/spack/docs/tutorial_packaging.rst deleted file mode 100644 index ca693ba14f7..00000000000 --- a/lib/spack/docs/tutorial_packaging.rst +++ /dev/null @@ -1,559 +0,0 @@ -.. Copyright 2013-2019 Lawrence Livermore National Security, LLC and other - Spack Project Developers. See the top-level COPYRIGHT file for details. - - SPDX-License-Identifier: (Apache-2.0 OR MIT) - -.. _packaging-tutorial: - -========================= -Package Creation Tutorial -========================= - -This tutorial will walk you through the steps behind building a simple -package installation script. We'll focus on writing a package for -mpileaks, an MPI debugging tool. By creating a package file we're -essentially giving Spack a recipe for how to build a particular piece of -software. We're describing some of the software's dependencies, where to -find the package, what commands and options are used to build the package -from source, and more. Once we've specified a package's recipe, we can -ask Spack to build that package in many different ways. - -This tutorial assumes you have a basic familiarity with some of the Spack -commands, and that you have a working version of Spack installed. If -not, we suggest looking at Spack's :ref:`getting_started` guide. This -tutorial also assumes you have at least a beginner's-level familiarity -with Python. - -Also note that this document is a tutorial. It can help you get started -with packaging, but is not intended to be complete. See Spack's -:ref:`packaging-guide` for more complete documentation on this topic. - ---------------- -Getting Started ---------------- - -A few things before we get started: - -- We'll refer to the Spack installation location via the environment - variable ``SPACK_ROOT``. You should point ``SPACK_ROOT`` at wherever - you have Spack installed. -- Add ``$SPACK_ROOT/bin`` to your ``PATH`` before you start. -- Make sure your ``EDITOR`` environment variable is set to your - preferred text editor. -- We'll be writing Python code as part of this tutorial. You can find - successive versions of the Python code in - ``$SPACK_ROOT/lib/spack/docs/tutorial/examples``. - -------------------------- -Creating the Package File -------------------------- - -We will use a separate package repository for the tutorial. Package -repositories allow you to separate sets of packages that take -precedence over one another. We will use the tutorial repo that ships -with Spack to avoid breaking the builtin Spack packages. - -.. code-block:: console - - $ spack repo add $SPACK_ROOT/var/spack/repos/tutorial/ - ==> Added repo with namespace 'tutorial'. - -Spack comes with a handy command to create a new package: ``spack create``. - -This command is given the location of a package's source code, downloads -the code, and sets up some basic packaging infrastructure for you. The -mpileaks source code can be found on GitHub, and here's what happens when -we run ``spack create`` on it: - -.. code-block:: console - - $ spack create -t generic https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - ==> This looks like a URL for mpileaks - ==> Found 1 version of mpileaks: - - 1.0 https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - - ==> How many would you like to checksum? (default is 1, q to abort) 1 - ==> Downloading... - ==> Fetching https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - ############################################################################# 100.0% - ==> Checksummed 1 version of mpileaks - ==> Using specified package template: 'generic' - ==> Created template for mpileaks package - ==> Created package file: ~/spack/var/spack/repos/tutorial/packages/mpileaks/package.py - -Spack should spawn a text editor with this file: - -.. literalinclude:: tutorial/examples/0.package.py - :language: python - -Spack has created this file in -``$SPACK_ROOT/var/spack/repos/tutorial/packages/mpileaks/package.py``. Take a -moment to look over the file. There's a few placeholders that Spack has -created, which we'll fill in as part of this tutorial: - -- We'll document some information about this package in the comments. -- We'll fill in the dependency list for this package. -- We'll fill in some of the configuration arguments needed to build this - package. - -For the moment, exit your editor and let's see what happens when we try -to build this package: - -.. code-block:: console - - $ spack install mpileaks - ==> Installing mpileaks - ==> Searching for binary cache of mpileaks - ==> Warning: No Spack mirrors are currently configured - ==> No binary for mpileaks found: installing from source - ==> Fetching https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - ############################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu/mpileaks-1.0.tar.gz - ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu - ==> No patches needed for mpileaks - ==> Building mpileaks [Package] - ==> Executing phase: 'install' - ==> Error: ProcessError: Command exited with status 2: - 'make' '-j16' - - 1 error found in build log: - 1 ==> Executing phase: 'install' - 2 ==> 'make' '-j16' - >> 3 make: *** No targets specified and no makefile found. Stop. - - See build log for details: - ~/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu/spack-build-out.txt - -This obviously didn't work; we need to fill in the package-specific -information. Specifically, Spack didn't try to build any of mpileaks' -dependencies, nor did it use the proper configure arguments. Let's start -fixing things. - ---------------------- -Package Documentation ---------------------- - -We can bring the ``package.py`` file back into our ``EDITOR`` with the -``spack edit`` command: - -.. code-block:: console - - $ spack edit mpileaks - -Let's remove some of the ``FIXME`` comments, add links to the mpileaks -homepage, and document what mpileaks does. I'm also going to cut out the -Copyright clause at this point to keep this tutorial document shorter, -but you shouldn't do that normally. The results of these changes can be -found in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/1.package.py`` -and are displayed below. Make these changes to your ``package.py``: - -.. literalinclude:: tutorial/examples/1.package.py - :lines: 6- - :language: python - -We've filled in the comment that describes what this package does and -added a link to its website. That won't help us build yet, but it will -allow Spack to provide some documentation on this package to other users: - -.. code-block:: console - - $ spack info mpileaks - Package: mpileaks - - Description: - Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes. - - Homepage: https://github.com/LLNL/mpileaks - - Tags: - None - - Preferred version: - 1.0 https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - - Safe versions: - 1.0 https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - - Variants: - None - - Installation Phases: - install - - Build Dependencies: - None - - Link Dependencies: - None - - Run Dependencies: - None - - Virtual Packages: - None - -As we fill in more information about this package the ``spack info`` command -will become more informative. Now let's start making this package build. - ------------- -Dependencies ------------- - -The mpileaks package depends on three other packages: ``mpi``, -``adept-utils``, and ``callpath``. Let's add those via the -``depends_on`` command in our ``package.py`` (this version is in -``$SPACK_ROOT/lib/spack/docs/tutorial/examples/2.package.py``): - -.. literalinclude:: tutorial/examples/2.package.py - :lines: 6- - :language: python - -Now when we go to build mpileaks, Spack will fetch and build these -dependencies before building mpileaks. Note that the mpi dependency is a -different kind of beast than the adept-utils and callpath dependencies; -there is no mpi package available in Spack. Instead mpi is a *virtual -dependency*. Spack may satisfy that dependency by installing packages -such as ``openmpi`` or ``mvapich2``. See the :ref:`packaging-guide` for more -information on virtual dependencies. - -Now when we try to install this package, a lot more happens: - -.. code-block:: console - - $ spack install mpileaks - ... - ==> Successfully installed libdwarf from binary cache - [+] ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libdwarf-20180129-p4jeflorwlnkoq2vpuyocwrbcht2ayak - ==> Installing callpath - ==> Searching for binary cache of callpath - ==> Installing callpath from binary cache - ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x.spack - ######################################################################## 100.0% - ==> Successfully installed callpath from binary cache - [+] ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x - ==> Installing mpileaks - ==> Searching for binary cache of mpileaks - ==> No binary for mpileaks found: installing from source - ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz - ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb - ==> No patches needed for mpileaks - ==> Building mpileaks [Package] - ==> Executing phase: 'install' - ==> Error: ProcessError: Command exited with status 2: - 'make' '-j16' - - 1 error found in build log: - 1 ==> Executing phase: 'install' - 2 ==> 'make' '-j16' - >> 3 make: *** No targets specified and no makefile found. Stop. - - See build log for details: - ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0/spack-build-out.txt - -Note that this command may take a while to run and produce more output if -you don't have an MPI already installed or configured in Spack. - -Now Spack has identified and made sure all of our dependencies have been -built. It found the ``openmpi`` package that will satisfy our ``mpi`` -dependency, and the ``callpath`` and ``adept-utils`` package to satisfy our -concrete dependencies. - ------------------------- -Debugging Package Builds ------------------------- - -Our ``mpileaks`` package is still not building. It may be obvious to -many of you that we never ran the configure script. Let's add a -call to ``configure()`` to the top of the install routine. The resulting -``package.py`` is in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/3.package.py``: - -.. literalinclude:: tutorial/examples/3.package.py - :lines: 6- - :language: python - -If we re-run we still get errors: - -.. code-block:: console - - $ spack install mpileaks - ... - ==> Installing mpileaks - ==> Searching for binary cache of mpileaks - ==> Finding buildcaches in /mirror/build_cache - ==> No binary for mpileaks found: installing from source - ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz - ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb - ==> No patches needed for mpileaks - ==> Building mpileaks [Package] - ==> Executing phase: 'install' - ==> Error: ProcessError: Command exited with status 1: - './configure' - - 1 error found in build log: - 25 checking for ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3-3 - njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc... ~/spack/opt/spack/linux-ubuntu16.04- - x86_64/gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc - 26 Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 - .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-showme:compile'... no - 27 Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 - .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-showme'... no - 28 Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 - .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-compile-info'... no - 29 Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 - .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-show'... no - 30 ./configure: line 4809: Echo: command not found - >> 31 configure: error: unable to locate adept-utils installation - - See build log for details: - ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0/spack-build-out.txt - -Again, the problem may be obvious. But let's pretend we're not -all experienced Autotools developers and use this opportunity to spend some -time debugging. We have a few options that can tell us about -what's going wrong: - -As per the error message, Spack has given us a ``spack-build-out.txt`` debug -log: - -.. code-block:: console - - ==> Executing phase: 'install' - ==> './configure' - checking metadata... no - checking installation directory variables... yes - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - checking for a thread-safe mkdir -p... /bin/mkdir -p - checking for gawk... gawk - checking whether make sets $(MAKE)... yes - checking for gcc... /home/spack1/spack/lib/spack/env/gcc/gcc - checking for C compiler default output file name... a.out - checking whether the C compiler works... yes - checking whether we are cross compiling... no - checking for suffix of executables... - checking for suffix of object files... o - checking whether we are using the GNU C compiler... yes - checking whether /home/spack1/spack/lib/spack/env/gcc/gcc accepts -g... yes - checking for /home/spack1/spack/lib/spack/env/gcc/gcc option to accept ISO C89... none needed - checking for style of include used by make... GNU - checking dependency style of /home/spack1/spack/lib/spack/env/gcc/gcc... gcc3 - checking whether /home/spack1/spack/lib/spack/env/gcc/gcc and cc understand -c and -o together... yes - checking whether we are using the GNU C++ compiler... yes - checking whether /home/spack1/spack/lib/spack/env/gcc/g++ accepts -g... yes - checking dependency style of /home/spack1/spack/lib/spack/env/gcc/g++... gcc3 - checking for /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f/bin/mpicc... /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f/bin/mpicc - Checking whether /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f/bin/mpicc responds to '-showme:compile'... yes - configure: error: unable to locate adept-utils installation - -This gives us the output from the build, and mpileaks isn't -finding its ``adept-utils`` package. Spack has -automatically added the include and library directories of -``adept-utils`` to the compiler's search path, but some packages like -mpileaks can sometimes be picky and still want things spelled out on -their command line. But let's continue to pretend we're not experienced -developers, and explore some other debugging paths: - -We can also enter the build area and try to manually run the build: - -.. code-block:: console - - $ spack build-env mpileaks bash - $ spack cd mpileaks - -The ``spack build-env`` command spawned a new shell that contains the same -environment that Spack used to build the mpileaks package (you can -substitute bash for your favorite shell). The ``spack cd`` command -changed our working dirctory to the last attempted build for mpileaks. -From here we can manually re-run the build: - -.. code-block:: console - - $ ./configure - checking metadata... no - checking installation directory variables... yes - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - checking for a thread-safe mkdir -p... /bin/mkdir -p - checking for gawk... gawk - checking whether make sets $(MAKE)... yes - checking for gcc... /home/spack1/spack/lib/spack/env/gcc/gcc - checking for C compiler default output file name... a.out - checking whether the C compiler works... yes - checking whether we are cross compiling... no - checking for suffix of executables... - checking for suffix of object files... o - checking whether we are using the GNU C compiler... yes - checking whether /home/spack1/spack/lib/spack/env/gcc/gcc accepts -g... yes - checking for /home/spack1/spack/lib/spack/env/gcc/gcc option to accept ISO C89... none needed - checking for style of include used by make... GNU - checking dependency style of /home/spack1/spack/lib/spack/env/gcc/gcc... gcc3 - checking whether /home/spack1/spack/lib/spack/env/gcc/gcc and cc understand -c and -o together... yes - checking whether we are using the GNU C++ compiler... yes - checking whether /home/spack1/spack/lib/spack/env/gcc/g++ accepts -g... yes - checking dependency style of /home/spack1/spack/lib/spack/env/gcc/g++... gcc3 - checking for /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f/bin/mpicc... /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f/bin/mpicc - Checking whether /home/spack1/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.0.0-yo5qkfvumpmgmvlbalqcadu46j5bd52f/bin/mpicc responds to '-showme:compile'... yes - configure: error: unable to locate adept-utils installation - -We're seeing the same error, but now we're in a shell where we can run -the command ourselves and debug as needed. We could, for example, run -``./configure --help`` to see what options we can use to specify -dependencies. - -We can use the ``exit`` command to leave the shell spawned by ``spack -build-env``. - ------------------------------- -Specifying Configure Arguments ------------------------------- - -Let's add the configure arguments to the mpileaks' ``package.py``. This -version can be found in -``$SPACK_ROOT/lib/spack/docs/tutorial/examples/4.package.py``: - -.. literalinclude:: tutorial/examples/4.package.py - :lines: 6- - :language: python - -This is all we need for a working mpileaks package! If we install now we'll see: - -.. code-block:: console - - $ spack install mpileaks - ... - ==> Installing mpileaks - ==> Searching for binary cache of mpileaks - ==> Finding buildcaches in /mirror/build_cache - ==> No binary for mpileaks found: installing from source - ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz - ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb - ==> No patches needed for mpileaks - ==> Building mpileaks [Package] - ==> Executing phase: 'install' - ==> Successfully installed mpileaks - Fetch: 0.00s. Build: 9.41s. Total: 9.41s. - [+] ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb - -There are some special circumstances in this package that are worth highlighting. -Normally, Spack would have automatically detected that mpileaks was an -Autotools-based package when we ran ``spack create`` and made it an ``AutoToolsPackage`` -class (except we added the ``-t generic`` option to skip this). Instead of -a full install routine we would have just written: - -.. code-block:: python - - def configure_args(self): - return [ - '--with-adept-utils={0}'.format(self.spec['adept-utils'].prefix), - '--with-callpath={0}'.format(self.spec['callpath'].prefix) - ] - -Similarly, if this had been a CMake-based package we -would have been filling in a ``cmake_args`` function instead of -``configure_args``. There are similar default package types for -many build environments that will be discussed later in the tutorial. - --------- -Variants --------- - -We have a successful mpileaks build, but let's take some time to improve -it. ``mpileaks`` has a build-time option to truncate parts of the stack -that it walks. Let's add a variant to allow users to set this when they -build mpileaks with Spack. - -To do this, we'll add a variant to our package, as per the following (see -``$SPACK_ROOT/lib/spack/docs/tutorial/examples/5.package.py``): - -.. literalinclude:: tutorial/examples/5.package.py - :lines: 6- - :language: python - -We've added the variant ``stackstart``, and given it a default value of -``0``. If we install now we can see the stackstart variant added to the -configure line (output truncated for length): - -.. code-block:: console - - $ spack install --verbose mpileaks stackstart=4 - ... - ==> Installing mpileaks - ==> Searching for binary cache of mpileaks - ==> Finding buildcaches in /mirror/build_cache - ==> No binary for mpileaks found: installing from source - ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto/mpileaks-1.0.tar.gz - ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto - ==> No patches needed for mpileaks - ==> Building mpileaks [Package] - ==> Executing phase: 'install' - ==> './configure' '--prefix=~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto' '--with-adept-utils=~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/adept-utils-1.0.1-7tippnvo5g76wpijk7x5kwfpr3iqiaen' '--with-callpath=~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x' '--with-stack-start-c=4' '--with-stack-start-fortran=4' - ---------------- -The Spec Object ---------------- - -This tutorial has glossed over a few important features, which weren't -too relevant for mpileaks but may be useful for other packages. There -were several places we reference the ``self.spec`` object. This is a -powerful class for querying information about what we're building. For -example, you could use the spec to query information about how a -package's dependencies were built, or what compiler was being used, or -what version of a package is being installed. Full documentation can be -found in the :ref:`packaging-guide`, but here's some quick snippets with -common queries: - -- Am I building ``mpileaks`` version ``1.1`` or greater? - -.. code-block:: python - - if self.spec.satisfies('@1.1:'): - # Do things needed for 1.1+ - -- Is ``openmpi`` the MPI I'm building with? - -.. code-block:: python - - if self.spec['mpi'].name == 'openmpi': - # Do openmpi things - -- Am I building with ``gcc`` version less than ``5.0.0``: - -.. code-block:: python - - if self.spec.satisfies('%gcc@:5.0.0'): - # Add arguments specific to gcc's earlier than 5.0.0 - -- Am I building with the ``debug`` variant: - -.. code-block:: python - - if self.spec.satisfies('+debug'): - # Add -g option to configure flags - -- Is my ``dyninst`` dependency greater than version ``8.0``? - -.. code-block:: python - - if self.spec['dyninst'].satisfies('@8.0:'): - # Use newest dyninst options - -More examples can be found in the thousands of packages already added to -Spack in ``$SPACK_ROOT/var/spack/repos/builtin/packages``. - -Good Luck! - -To ensure that future sections of the tutorial run properly, please -uninstall mpileaks and remove the tutorial repo from your -configuration. - -.. code-block:: console - - $ spack uninstall -ay mpileaks - $ spack repo remove tutorial - $ rm -rf $SPACK_ROOT/var/spack/repos/tutorial/packages/mpileaks