diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py
index 49dc971d3a82275f52408b62d6bc8f54c8bc21b1..867d317e4d8c7aa949bdcc17a76f47e2835c3cb6 100644
--- a/var/spack/repos/builtin/packages/dealii/package.py
+++ b/var/spack/repos/builtin/packages/dealii/package.py
@@ -25,8 +25,10 @@
 from spack import *
 import sys
 
+
 class Dealii(Package):
-    """C++ software library providing well-documented tools to build finite element codes for a broad variety of PDEs."""
+    """C++ software library providing well-documented tools to build finite
+    element codes for a broad variety of PDEs."""
     homepage = "https://www.dealii.org"
     url      = "https://github.com/dealii/dealii/releases/download/v8.4.0/dealii-8.4.0.tar.gz"
 
@@ -36,7 +38,7 @@ class Dealii(Package):
     variant('mpi',      default=True,  description='Compile with MPI')
     variant('arpack',   default=True,  description='Compile with Arpack and PArpack (only with MPI)')
     variant('doc',      default=False, description='Compile with documentation')
-    variant('gsl' ,     default=True,  description='Compile with GSL')
+    variant('gsl',      default=True,  description='Compile with GSL')
     variant('hdf5',     default=True,  description='Compile with HDF5 (only with MPI)')
     variant('metis',    default=True,  description='Compile with Metis')
     variant('netcdf',   default=True,  description='Compile with Netcdf (only with MPI)')
@@ -47,38 +49,40 @@ class Dealii(Package):
     variant('trilinos', default=True,  description='Compile with Trilinos (only with MPI)')
 
     # required dependencies, light version
-    depends_on ("blas")
-    # Boost 1.58 is blacklisted, see https://github.com/dealii/dealii/issues/1591
-    # require at least 1.59
-    depends_on ("boost@1.59.0:",     when='~mpi')
-    depends_on ("boost@1.59.0:+mpi", when='+mpi')
-    depends_on ("bzip2")
-    depends_on ("cmake")
-    depends_on ("lapack")
-    depends_on ("muparser")
-    depends_on ("suite-sparse")
-    depends_on ("tbb")
-    depends_on ("zlib")
+    depends_on("blas")
+    # Boost 1.58 is blacklisted, see
+    # https://github.com/dealii/dealii/issues/1591
+    # Require at least 1.59
+    depends_on("boost@1.59.0:+thread+system+serialization+iostreams",     when='~mpi')  # NOQA: ignore=E501
+    depends_on("boost@1.59.0:+mpi+thread+system+serialization+iostreams", when='+mpi')  # NOQA: ignore=E501
+    depends_on("bzip2")
+    depends_on("cmake")
+    depends_on("lapack")
+    depends_on("muparser")
+    depends_on("suite-sparse")
+    depends_on("tbb")
+    depends_on("zlib")
 
     # optional dependencies
-    depends_on ("mpi", when="+mpi")
-    depends_on ("arpack-ng+mpi", when='+arpack+mpi')
-    depends_on ("doxygen", when='+doc')
-    depends_on ("gsl", when='@8.5.0:+gsl')
-    depends_on ("gsl", when='@dev+gsl')
-    depends_on ("hdf5+mpi~cxx", when='+hdf5+mpi') #FIXME NetCDF declares dependency with ~cxx, why?
-    depends_on ("metis@5:", when='+metis')
-    depends_on ("netcdf+mpi", when="+netcdf+mpi")
-    depends_on ("netcdf-cxx", when='+netcdf+mpi')
-    depends_on ("oce", when='+oce')
-    depends_on ("p4est", when='+p4est+mpi')
-    depends_on ("petsc+mpi", when='+petsc+mpi')
-    depends_on ("slepc", when='+slepc+petsc+mpi')
-    depends_on ("trilinos", when='+trilinos+mpi')
+    depends_on("mpi",              when="+mpi")
+    depends_on("arpack-ng+mpi",    when='+arpack+mpi')
+    depends_on("doxygen+graphviz", when='+doc')
+    depends_on("graphviz",         when='+doc')
+    depends_on("gsl",              when='@8.5.0:+gsl')
+    depends_on("gsl",              when='@dev+gsl')
+    depends_on("hdf5+mpi",         when='+hdf5+mpi')
+    depends_on("metis@5:",         when='+metis')
+    depends_on("netcdf+mpi",       when="+netcdf+mpi")
+    depends_on("netcdf-cxx",       when='+netcdf+mpi')
+    depends_on("oce",              when='+oce')
+    depends_on("p4est",            when='+p4est+mpi')
+    depends_on("petsc+mpi",        when='+petsc+mpi')
+    depends_on("slepc",            when='+slepc+petsc+mpi')
+    depends_on("trilinos",         when='+trilinos+mpi')
 
     # developer dependnecies
-    depends_on ("numdiff", when='@dev')
-    depends_on ("astyle@2.04", when='@dev')
+    depends_on("numdiff",     when='@dev')
+    depends_on("astyle@2.04", when='@dev')
 
     def install(self, spec, prefix):
         options = []
@@ -96,17 +100,17 @@ def install(self, spec, prefix):
             '-DDEAL_II_WITH_THREADS:BOOL=ON',
             '-DBOOST_DIR=%s' % spec['boost'].prefix,
             '-DBZIP2_DIR=%s' % spec['bzip2'].prefix,
-            # CMake's FindBlas/Lapack may pickup system's blas/lapack instead of Spack's.
-            # Be more specific to avoid this.
-            # Note that both lapack and blas are provided in -DLAPACK_XYZ variables
+            # CMake's FindBlas/Lapack may pickup system's blas/lapack instead
+            # of Spack's. Be more specific to avoid this.
+            # Note that both lapack and blas are provided in -DLAPACK_XYZ.
             '-DLAPACK_FOUND=true',
             '-DLAPACK_INCLUDE_DIRS=%s;%s' %
                 (spec['lapack'].prefix.include,
                  spec['blas'].prefix.include),
             '-DLAPACK_LIBRARIES=%s;%s' %
-                (join_path(spec['lapack'].prefix.lib,'liblapack.%s' % dsuf), # FIXME don't hardcode names
-                 join_path(spec['blas'].prefix.lib,'libblas.%s' % dsuf)),    # FIXME don't hardcode names
-            '-DMUPARSER_DIR=%s ' % spec['muparser'].prefix,
+                (spec['lapack'].lapack_shared_lib,
+                 spec['blas'].blas_shared_lib),
+            '-DMUPARSER_DIR=%s' % spec['muparser'].prefix,
             '-DUMFPACK_DIR=%s' % spec['suite-sparse'].prefix,
             '-DTBB_DIR=%s' % spec['tbb'].prefix,
             '-DZLIB_DIR=%s' % spec['zlib'].prefix
@@ -116,33 +120,34 @@ def install(self, spec, prefix):
         if '+mpi' in spec:
             options.extend([
                 '-DDEAL_II_WITH_MPI:BOOL=ON',
-                '-DCMAKE_C_COMPILER=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpicc'), # FIXME: avoid hardcoding mpi wrappers names
-                '-DCMAKE_CXX_COMPILER=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpic++'),
-                '-DCMAKE_Fortran_COMPILER=%s' % join_path(self.spec['mpi'].prefix.bin, 'mpif90'),
+                '-DCMAKE_C_COMPILER=%s'       % spec['mpi'].mpicc,
+                '-DCMAKE_CXX_COMPILER=%s'     % spec['mpi'].mpicxx,
+                '-DCMAKE_Fortran_COMPILER=%s' % spec['mpi'].mpifc,
             ])
         else:
             options.extend([
                 '-DDEAL_II_WITH_MPI:BOOL=OFF',
             ])
 
-        # Optional dependencies for which librariy names are the same as CMake variables
-        for library in ('gsl','hdf5','p4est','petsc','slepc','trilinos','metis'):
+        # Optional dependencies for which librariy names are the same as CMake
+        # variables:
+        for library in ('gsl', 'hdf5', 'p4est', 'petsc', 'slepc', 'trilinos', 'metis'):  # NOQA: ignore=E501
             if library in spec:
                 options.extend([
-                    '-D{library}_DIR={value}'.format(library=library.upper(), value=spec[library].prefix),
-                    '-DDEAL_II_WITH_{library}:BOOL=ON'.format(library=library.upper())
+                    '-D%s_DIR=%s' % (library.upper(), spec[library].prefix),
+                    '-DDEAL_II_WITH_%s:BOOL=ON' % library.upper()
                 ])
             else:
                 options.extend([
-                    '-DDEAL_II_WITH_{library}:BOOL=OFF'.format(library=library.upper())
+                    '-DDEAL_II_WITH_%s:BOOL=OFF' % library.upper()
                 ])
 
         # doxygen
         options.extend([
-            '-DDEAL_II_COMPONENT_DOCUMENTATION=%s' % ('ON' if '+doc' in spec else 'OFF'),
+            '-DDEAL_II_COMPONENT_DOCUMENTATION=%s' %
+            ('ON' if '+doc' in spec else 'OFF'),
         ])
 
-
         # arpack
         if '+arpack' in spec:
             options.extend([
@@ -160,11 +165,13 @@ def install(self, spec, prefix):
             options.extend([
                 '-DNETCDF_FOUND=true',
                 '-DNETCDF_LIBRARIES=%s;%s' %
-                    (join_path(spec['netcdf-cxx'].prefix.lib,'libnetcdf_c++.%s' % dsuf),
-                    join_path(spec['netcdf'].prefix.lib,'libnetcdf.%s' % dsuf)),
+                    (join_path(spec['netcdf-cxx'].prefix.lib,
+                               'libnetcdf_c++.%s' % dsuf),
+                     join_path(spec['netcdf'].prefix.lib,
+                               'libnetcdf.%s' % dsuf)),
                 '-DNETCDF_INCLUDE_DIRS=%s;%s' %
                     (spec['netcdf-cxx'].prefix.include,
-                    spec['netcdf'].prefix.include),
+                     spec['netcdf'].prefix.include),
             ])
         else:
             options.extend([
@@ -200,7 +207,7 @@ def install(self, spec, prefix):
         with working_dir('examples/step-3'):
             cmake('.')
             make('release')
-            make('run',parallel=False)
+            make('run', parallel=False)
 
         # An example which uses Metis + PETSc
         # FIXME: switch step-18 to MPI
@@ -213,7 +220,7 @@ def install(self, spec, prefix):
             if '^petsc' in spec and '^metis' in spec:
                 cmake('.')
                 make('release')
-                make('run',parallel=False)
+                make('run', parallel=False)
 
         # take step-40 which can use both PETSc and Trilinos
         # FIXME: switch step-40 to MPI run
@@ -222,43 +229,49 @@ def install(self, spec, prefix):
             print('========== Step-40 PETSc ============')
             print('=====================================')
             # list the number of cycles to speed up
-            filter_file(r'(const unsigned int n_cycles = 8;)',  ('const unsigned int n_cycles = 2;'), 'step-40.cc')
+            filter_file(r'(const unsigned int n_cycles = 8;)',
+                        ('const unsigned int n_cycles = 2;'), 'step-40.cc')
             cmake('.')
             if '^petsc' in spec:
                 make('release')
-                make('run',parallel=False)
+                make('run', parallel=False)
 
             print('=====================================')
             print('========= Step-40 Trilinos ==========')
             print('=====================================')
             # change Linear Algebra to Trilinos
-            filter_file(r'(\/\/ #define FORCE_USE_OF_TRILINOS.*)',  ('#define FORCE_USE_OF_TRILINOS'), 'step-40.cc')
+            filter_file(r'(\/\/ #define FORCE_USE_OF_TRILINOS.*)',
+                        ('#define FORCE_USE_OF_TRILINOS'), 'step-40.cc')
             if '^trilinos+hypre' in spec:
                 make('release')
-                make('run',parallel=False)
+                make('run', parallel=False)
 
             print('=====================================')
             print('=== Step-40 Trilinos SuperluDist ====')
             print('=====================================')
             # change to direct solvers
-            filter_file(r'(LA::SolverCG solver\(solver_control\);)',  ('TrilinosWrappers::SolverDirect::AdditionalData data(false,"Amesos_Superludist"); TrilinosWrappers::SolverDirect solver(solver_control,data);'), 'step-40.cc')
-            filter_file(r'(LA::MPI::PreconditionAMG preconditioner;)',  (''), 'step-40.cc')
-            filter_file(r'(LA::MPI::PreconditionAMG::AdditionalData data;)',  (''), 'step-40.cc')
-            filter_file(r'(preconditioner.initialize\(system_matrix, data\);)',  (''), 'step-40.cc')
-            filter_file(r'(solver\.solve \(system_matrix, completely_distributed_solution, system_rhs,)',  ('solver.solve (system_matrix, completely_distributed_solution, system_rhs);'), 'step-40.cc')
+            filter_file(r'(LA::SolverCG solver\(solver_control\);)',  ('TrilinosWrappers::SolverDirect::AdditionalData data(false,"Amesos_Superludist"); TrilinosWrappers::SolverDirect solver(solver_control,data);'), 'step-40.cc')  # NOQA: ignore=E501
+            filter_file(r'(LA::MPI::PreconditionAMG preconditioner;)',
+                        (''), 'step-40.cc')
+            filter_file(r'(LA::MPI::PreconditionAMG::AdditionalData data;)',
+                        (''), 'step-40.cc')
+            filter_file(r'(preconditioner.initialize\(system_matrix, data\);)',
+                        (''), 'step-40.cc')
+            filter_file(r'(solver\.solve \(system_matrix, completely_distributed_solution, system_rhs,)',  ('solver.solve (system_matrix, completely_distributed_solution, system_rhs);'), 'step-40.cc')  # NOQA: ignore=E501
             filter_file(r'(preconditioner\);)',  (''), 'step-40.cc')
             if '^trilinos+superlu-dist' in spec:
                 make('release')
-                make('run',paralle=False)
+                make('run', paralle=False)
 
             print('=====================================')
             print('====== Step-40 Trilinos MUMPS =======')
             print('=====================================')
             # switch to Mumps
-            filter_file(r'(Amesos_Superludist)',  ('Amesos_Mumps'), 'step-40.cc')
+            filter_file(r'(Amesos_Superludist)',
+                        ('Amesos_Mumps'), 'step-40.cc')
             if '^trilinos+mumps' in spec:
                 make('release')
-                make('run',parallel=False)
+                make('run', parallel=False)
 
         print('=====================================')
         print('============ Step-36 ================')
@@ -267,7 +280,7 @@ def install(self, spec, prefix):
             if 'slepc' in spec:
                 cmake('.')
                 make('release')
-                make('run',parallel=False)
+                make('run', parallel=False)
 
         print('=====================================')
         print('============ Step-54 ================')
@@ -276,7 +289,7 @@ def install(self, spec, prefix):
             if 'oce' in spec:
                 cmake('.')
                 make('release')
-                make('run',parallel=False)
+                make('run', parallel=False)
 
     def setup_environment(self, spack_env, env):
         env.set('DEAL_II_DIR', self.prefix)