From 3d77ecd92e0ccc950daf30468ec2ef591668d8eb Mon Sep 17 00:00:00 2001
From: Massimiliano Culpo <massimiliano.culpo@gmail.com>
Date: Mon, 21 Oct 2019 20:20:05 +0200
Subject: [PATCH] Bootstrap environment modules optimizing for generic
 architectures (#13105)

fixes #13073

Since #3206 was merged bootstrapping environment-modules was using the architecture of the current host or the best match supported by the default compiler. The former case is an issue since shell integration was looking for a spec targeted at the host microarchitecture.

1. Bootstrap an env modules targeted at generic architectures
2. Look for generic targets in shell integration scripts
3. Add a new entry in Travis to test shell integration
---
 .travis.yml                        |  5 ++++
 lib/spack/spack/cmd/bootstrap.py   |  8 ++++++-
 lib/spack/spack/main.py            |  6 +++--
 share/spack/qa/run-bootstrap-tests | 37 ++++++++++++++++++++++++++++++
 4 files changed, 53 insertions(+), 3 deletions(-)
 create mode 100755 share/spack/qa/run-bootstrap-tests

diff --git a/.travis.yml b/.travis.yml
index 33c0346eaf..1f5b82c811 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,6 +22,11 @@ jobs:
       os: linux
       language: python
       env: TEST_SUITE=flake8
+# Shell integration with module files
+    - python: '3.7'
+      os: linux
+      language: python
+      env: [ TEST_SUITE=bootstrap ]
     - stage: 'unit tests + documentation'
       python: '2.6'
       dist: trusty
diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py
index 71db75c788..96cb8ccaa9 100644
--- a/lib/spack/spack/cmd/bootstrap.py
+++ b/lib/spack/spack/cmd/bootstrap.py
@@ -3,6 +3,7 @@
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 
+import llnl.util.cpu
 import llnl.util.tty as tty
 
 import spack.repo
@@ -56,7 +57,12 @@ def bootstrap(parser, args, **kwargs):
     # Define requirement dictionary defining general specs which need
     # to be satisfied, and the specs to install when the general spec
     # isn't satisfied.
-    requirement_dict = {'environment-modules': 'environment-modules~X'}
+    requirement_dict = {
+        # Install environment-modules with generic optimizations
+        'environment-modules': 'environment-modules~X target={0}'.format(
+            llnl.util.cpu.host().family
+        )
+    }
 
     for requirement in requirement_dict:
         installed_specs = spack.store.db.query(requirement)
diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py
index 89b4d3dc85..ff2ff74da3 100644
--- a/lib/spack/spack/main.py
+++ b/lib/spack/spack/main.py
@@ -20,6 +20,7 @@
 import warnings
 from six import StringIO
 
+import llnl.util.cpu
 import llnl.util.tty as tty
 import llnl.util.tty.color as color
 from llnl.util.tty.log import log_output
@@ -621,8 +622,9 @@ def shell_set(var, value):
     # print environment module system if available. This can be expensive
     # on clusters, so skip it if not needed.
     if 'modules' in info:
-        specs = spack.store.db.query(
-            'environment-modules arch=%s' % spack.architecture.sys_type())
+        generic_arch = llnl.util.cpu.host().family
+        module_spec = 'environment-modules target={0}'.format(generic_arch)
+        specs = spack.store.db.query(module_spec)
         if specs:
             shell_set('_sp_module_prefix', specs[-1].prefix)
         else:
diff --git a/share/spack/qa/run-bootstrap-tests b/share/spack/qa/run-bootstrap-tests
new file mode 100755
index 0000000000..346122c529
--- /dev/null
+++ b/share/spack/qa/run-bootstrap-tests
@@ -0,0 +1,37 @@
+#!/bin/bash -e
+#
+# 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)
+
+#
+# Description:
+#     Checks that Spack shell integration with modules works correctly.
+#
+# Usage:
+#     run-bootstrap-tests
+#
+. "$(dirname $0)/setup.sh"
+check_dependencies ${coverage} git hg svn
+
+# Fetch the sources in a mirror, and add it to Spack
+mkdir -p ~/.mirror
+bin/spack mirror add travis ~/.mirror
+bin/spack mirror create -D -d ~/.mirror environment-modules~X
+
+
+# Move to root directory of Spack
+# Allows script to be run from anywhere
+cd "$SPACK_ROOT"
+
+# Print compiler information
+spack config get compilers
+
+# Run some build smoke tests, potentially with code coverage
+${coverage_run} bin/spack bootstrap
+
+# Check module integration
+. "share/spack/setup-env.sh"
+module av || exit 1
+spack load tcl || exit 1
-- 
GitLab