summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeth R. Johnson <johnsonsr@ornl.gov>2019-09-30 14:02:32 -0400
committerPeter Scheibel <scheibel1@llnl.gov>2019-09-30 11:02:32 -0700
commit7bcb306d4a5fc74fff63ea73369211e95270b911 (patch)
tree8ead385c89660f6952076173f9d64b3eca613c20
parent139eaa13064c2f8db824abe9c29f26296408ea86 (diff)
downloadspack-7bcb306d4a5fc74fff63ea73369211e95270b911.tar.gz
spack-7bcb306d4a5fc74fff63ea73369211e95270b911.tar.bz2
spack-7bcb306d4a5fc74fff63ea73369211e95270b911.tar.xz
spack-7bcb306d4a5fc74fff63ea73369211e95270b911.zip
Fix GCC environment variables for external installations (#12454)
Unlike the compiler binary name search logic, the `setup_environment` in GCC's package assumes the compiler names are *exactly* `gcc`, `g++`, etc. In many external installations (Homebrew, Macports) the installation includes only *suffixed* versions such as `gcc-9`. This patch uses the GCC compiler search suffixes to actually locate the correct filenames for the installed compilers, allowing the Spack-generated module file to have useful definitions of CC, CXX, etc. It also allows for the possibility that the user's external installation of GCC is compiled without Fortran support, in which case the `FC` environment variables are not defined.
-rw-r--r--var/spack/repos/builtin/packages/gcc/package.py30
1 files changed, 25 insertions, 5 deletions
diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py
index 15acc438c3..86e2b843e4 100644
--- a/var/spack/repos/builtin/packages/gcc/package.py
+++ b/var/spack/repos/builtin/packages/gcc/package.py
@@ -8,6 +8,7 @@ from spack.operating_systems.mac_os import macos_version, macos_sdk_path
from llnl.util import tty
import glob
+import itertools
import os
import sys
@@ -420,8 +421,27 @@ class Gcc(AutotoolsPackage):
set_install_permissions(specs_file)
def setup_environment(self, spack_env, run_env):
- run_env.set('CC', join_path(self.spec.prefix.bin, 'gcc'))
- run_env.set('CXX', join_path(self.spec.prefix.bin, 'g++'))
- run_env.set('FC', join_path(self.spec.prefix.bin, 'gfortran'))
- run_env.set('F77', join_path(self.spec.prefix.bin, 'gfortran'))
- run_env.set('F90', join_path(self.spec.prefix.bin, 'gfortran'))
+ # Search prefix directory for possibly modified compiler names
+ from spack.compilers.gcc import Gcc as Compiler
+
+ # Get the contents of the installed binary directory
+ bin_path = self.spec.prefix.bin
+ bin_contents = os.listdir(bin_path)
+
+ # Find the first non-symlink compiler binary present for each language
+ for lang in ['cc', 'cxx', 'fc', 'f77']:
+ for filename, regexp in itertools.product(
+ bin_contents,
+ Compiler.search_regexps(lang)
+ ):
+ if not regexp.match(filename):
+ continue
+
+ abspath = os.path.join(bin_path, filename)
+ if os.path.islink(abspath):
+ continue
+
+ # Set the proper environment variable
+ run_env.set(lang.upper(), abspath)
+ # Stop searching filename/regex combos for this language
+ break