diff options
Diffstat (limited to 'lib/spack/docs/tutorial_configuration.rst')
-rw-r--r-- | lib/spack/docs/tutorial_configuration.rst | 951 |
1 files changed, 0 insertions, 951 deletions
diff --git a/lib/spack/docs/tutorial_configuration.rst b/lib/spack/docs/tutorial_configuration.rst deleted file mode 100644 index 879bb94967..0000000000 --- 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 <config>`` 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/<platform>/compilers.yaml`` -#. ``~/.spack/compilers.yaml`` -#. ``$SPACK_ROOT/etc/spack/<platform>/compilers.yaml`` -#. ``$SPACK_ROOT/etc/spack/compilers.yaml`` -#. ``/etc/spack/<platform>/compilers.yaml`` -#. ``/etc/spack/compilers.yaml`` -#. ``$SPACK_ROOT/etc/defaults/<platform>/compilers.yaml`` -#. ``$SPACK_ROOT/etc/defaults/compilers.yaml`` - -These files are listed in decreasing order of precedence, so files in -``~/.spack/<platform>`` 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! |