summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2015-12-19 02:06:47 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2015-12-19 02:06:47 -0800
commit7cc4d88726501d6d93adf86f8080e65523e2400f (patch)
tree055cd2959798b24be8cd18729cb60f3ff2d15776 /lib
parent5f9a61616b20c6fa181f10727767612de7352911 (diff)
downloadspack-7cc4d88726501d6d93adf86f8080e65523e2400f.tar.gz
spack-7cc4d88726501d6d93adf86f8080e65523e2400f.tar.bz2
spack-7cc4d88726501d6d93adf86f8080e65523e2400f.tar.xz
spack-7cc4d88726501d6d93adf86f8080e65523e2400f.zip
Fix #254: libtool & distutils want certain compiler names.
This changes the compiler wrappers so that they are called by the same name as the wrapped compiler. Many builds make assumptions about compiler names, and we need the spack compilers to be recognizable so that build systems will get their flags right. This adds per-compiler subdirectories to lib/spack/spack/env directory that contain symlinks to cc for the C, C++, F77, and F90 compilers. The build now sets CC, CXX, F77, and F90 to point to these links instead of to the generically named cc, c++, f77, and f90 wrappers.
Diffstat (limited to 'lib')
-rwxr-xr-xlib/spack/env/cc14
l---------lib/spack/env/clang/clang1
l---------lib/spack/env/clang/clang++1
l---------lib/spack/env/gcc/g++1
l---------lib/spack/env/gcc/gcc1
l---------lib/spack/env/gcc/gfortran1
l---------lib/spack/env/intel/icc1
l---------lib/spack/env/intel/icpc1
l---------lib/spack/env/intel/ifort1
l---------lib/spack/env/pgi/case-insensitive/pgCC1
l---------lib/spack/env/pgi/pgcc1
l---------lib/spack/env/pgi/pgf771
l---------lib/spack/env/pgi/pgf901
l---------lib/spack/env/xl/xlc1
l---------lib/spack/env/xl/xlc++1
l---------lib/spack/env/xl/xlf1
l---------lib/spack/env/xl/xlf901
-rw-r--r--lib/spack/spack/build_environment.py32
-rw-r--r--lib/spack/spack/compilers/clang.py6
-rw-r--r--lib/spack/spack/compilers/gcc.py6
-rw-r--r--lib/spack/spack/compilers/intel.py6
-rw-r--r--lib/spack/spack/compilers/pgi.py6
-rw-r--r--lib/spack/spack/compilers/xl.py6
23 files changed, 77 insertions, 15 deletions
diff --git a/lib/spack/env/cc b/lib/spack/env/cc
index 75a63f6fac..0966277a91 100755
--- a/lib/spack/env/cc
+++ b/lib/spack/env/cc
@@ -86,22 +86,22 @@ done
#
command=$(basename "$0")
case "$command" in
- cc|gcc|c89|c99|clang|xlc)
+ cc|c89|c99|gcc|clang|icc|pgcc|xlc)
command="$SPACK_CC"
language="C"
;;
- c++|CC|g++|clang++|xlC)
+ c++|CC|g++|clang++|icpc|pgCC|xlc++)
command="$SPACK_CXX"
language="C++"
;;
- f77|xlf)
- command="$SPACK_F77"
- language="Fortran 77"
- ;;
- fc|f90|f95|xlf90)
+ f90|fc|f95|gfortran|ifort|pgf90|xlf90)
command="$SPACK_FC"
language="Fortran 90"
;;
+ f77|gfortran|ifort|pgf77|xlf)
+ command="$SPACK_F77"
+ language="Fortran 77"
+ ;;
cpp)
mode=cpp
;;
diff --git a/lib/spack/env/clang/clang b/lib/spack/env/clang/clang
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/clang/clang
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/clang/clang++ b/lib/spack/env/clang/clang++
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/clang/clang++
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/gcc/g++ b/lib/spack/env/gcc/g++
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/gcc/g++
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/gcc/gcc b/lib/spack/env/gcc/gcc
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/gcc/gcc
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/gcc/gfortran b/lib/spack/env/gcc/gfortran
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/gcc/gfortran
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/intel/icc b/lib/spack/env/intel/icc
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/intel/icc
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/intel/icpc b/lib/spack/env/intel/icpc
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/intel/icpc
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/intel/ifort b/lib/spack/env/intel/ifort
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/intel/ifort
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/pgi/case-insensitive/pgCC b/lib/spack/env/pgi/case-insensitive/pgCC
new file mode 120000
index 0000000000..e2deb67f3b
--- /dev/null
+++ b/lib/spack/env/pgi/case-insensitive/pgCC
@@ -0,0 +1 @@
+../../cc \ No newline at end of file
diff --git a/lib/spack/env/pgi/pgcc b/lib/spack/env/pgi/pgcc
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/pgi/pgcc
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/pgi/pgf77 b/lib/spack/env/pgi/pgf77
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/pgi/pgf77
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/pgi/pgf90 b/lib/spack/env/pgi/pgf90
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/pgi/pgf90
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/xl/xlc b/lib/spack/env/xl/xlc
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/xl/xlc
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/xl/xlc++ b/lib/spack/env/xl/xlc++
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/xl/xlc++
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/xl/xlf b/lib/spack/env/xl/xlf
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/xl/xlf
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/env/xl/xlf90 b/lib/spack/env/xl/xlf90
new file mode 120000
index 0000000000..82c2b8e90a
--- /dev/null
+++ b/lib/spack/env/xl/xlf90
@@ -0,0 +1 @@
+../cc \ No newline at end of file
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index dac25d9940..20154a55b3 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -88,10 +88,14 @@ def set_compiler_environment_variables(pkg):
compiler = pkg.compiler
# Set compiler variables used by CMake and autotools
- os.environ['CC'] = join_path(spack.build_env_path, 'cc')
- os.environ['CXX'] = join_path(spack.build_env_path, 'c++')
- os.environ['F77'] = join_path(spack.build_env_path, 'f77')
- os.environ['FC'] = join_path(spack.build_env_path, 'f90')
+ assert all(key in pkg.compiler.link_paths
+ for key in ('cc', 'cxx', 'f77', 'fc'))
+
+ link_dir = spack.build_env_path
+ os.environ['CC'] = join_path(link_dir, pkg.compiler.link_paths['cc'])
+ os.environ['CXX'] = join_path(link_dir, pkg.compiler.link_paths['cxx'])
+ os.environ['F77'] = join_path(link_dir, pkg.compiler.link_paths['f77'])
+ os.environ['FC'] = join_path(link_dir, pkg.compiler.link_paths['fc'])
# Set SPACK compiler variables so that our wrapper knows what to call
if compiler.cc:
@@ -110,11 +114,23 @@ def set_build_environment_variables(pkg):
"""This ensures a clean install environment when we build packages.
"""
# Add spack build environment path with compiler wrappers first in
- # the path. We handle case sensitivity conflicts like "CC" and
- # "cc" by putting one in the <build_env_path>/case-insensitive
+ # the path. We add both spack.env_path, which includes default
+ # wrappers (cc, c++, f77, f90), AND a subdirectory containing
+ # compiler-specific symlinks. The latter ensures that builds that
+ # are sensitive to the *name* of the compiler see the right name
+ # when we're building wtih the wrappers.
+ #
+ # Conflicts on case-insensitive systems (like "CC" and "cc") are
+ # handled by putting one in the <build_env_path>/case-insensitive
# directory. Add that to the path too.
- env_paths = [spack.build_env_path,
- join_path(spack.build_env_path, 'case-insensitive')]
+ env_paths = []
+ def add_env_path(path):
+ env_paths.append(path)
+ ci = join_path(path, 'case-insensitive')
+ if os.path.isdir(ci): env_paths.append(ci)
+ add_env_path(spack.build_env_path)
+ add_env_path(join_path(spack.build_env_path, pkg.compiler.name))
+
path_put_first("PATH", env_paths)
path_set(SPACK_ENV_PATH, env_paths)
diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py
index b34d1f2f9c..340051019c 100644
--- a/lib/spack/spack/compilers/clang.py
+++ b/lib/spack/spack/compilers/clang.py
@@ -37,6 +37,12 @@ class Clang(Compiler):
# Subclasses use possible names of Fortran 90 compiler
fc_names = []
+ # Named wrapper links within spack.build_env_path
+ link_paths = { 'cc' : 'clang/clang',
+ 'cxx' : 'clang/clang++',
+ # Use default wrappers for fortran, in case provided in compilers.yaml
+ 'f77' : 'f77',
+ 'fc' : 'f90' }
@classmethod
def default_version(self, comp):
diff --git a/lib/spack/spack/compilers/gcc.py b/lib/spack/spack/compilers/gcc.py
index 2886888d57..495b638a3a 100644
--- a/lib/spack/spack/compilers/gcc.py
+++ b/lib/spack/spack/compilers/gcc.py
@@ -42,6 +42,12 @@ class Gcc(Compiler):
# MacPorts builds gcc versions with prefixes and -mp-X.Y suffixes.
suffixes = [r'-mp-\d\.\d']
+ # Named wrapper links within spack.build_env_path
+ link_paths = {'cc' : 'gcc/gcc',
+ 'cxx' : 'gcc/g++',
+ 'f77' : 'gcc/gfortran',
+ 'fc' : 'gcc/gfortran' }
+
@property
def cxx11_flag(self):
if self.version < ver('4.3'):
diff --git a/lib/spack/spack/compilers/intel.py b/lib/spack/spack/compilers/intel.py
index 1298429974..69e9764790 100644
--- a/lib/spack/spack/compilers/intel.py
+++ b/lib/spack/spack/compilers/intel.py
@@ -37,6 +37,12 @@ class Intel(Compiler):
# Subclasses use possible names of Fortran 90 compiler
fc_names = ['ifort']
+ # Named wrapper links within spack.build_env_path
+ link_paths = { 'cc' : 'intel/icc',
+ 'cxx' : 'intel/icpc',
+ 'f77' : 'intel/ifort',
+ 'fc' : 'intel/ifort' }
+
@property
def cxx11_flag(self):
if self.version < ver('11.1'):
diff --git a/lib/spack/spack/compilers/pgi.py b/lib/spack/spack/compilers/pgi.py
index 6999eb50de..9ac74cfbdb 100644
--- a/lib/spack/spack/compilers/pgi.py
+++ b/lib/spack/spack/compilers/pgi.py
@@ -37,6 +37,12 @@ class Pgi(Compiler):
# Subclasses use possible names of Fortran 90 compiler
fc_names = ['pgf95', 'pgf90']
+ # Named wrapper links within spack.build_env_path
+ link_paths = { 'cc' : 'pgi/pgcc',
+ 'cxx' : 'pgi/case-insensitive/pgCC',
+ 'f77' : 'pgi/pgf77',
+ 'fc' : 'pgi/pgf90' }
+
@classmethod
def default_version(cls, comp):
"""The '-V' option works for all the PGI compilers.
diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py
index 308f811eb4..c1d55109a3 100644
--- a/lib/spack/spack/compilers/xl.py
+++ b/lib/spack/spack/compilers/xl.py
@@ -38,6 +38,12 @@ class Xl(Compiler):
# Subclasses use possible names of Fortran 90 compiler
fc_names = ['xlf90','xlf90_r','xlf95','xlf95_r','xlf2003','xlf2003_r','xlf2008','xlf2008_r']
+ # Named wrapper links within spack.build_env_path
+ link_paths = { 'cc' : 'xl/xlc',
+ 'cxx' : 'xl/xlc++',
+ 'f77' : 'xl/xlf',
+ 'fc' : 'xl/xlf90' }
+
@property
def cxx11_flag(self):
if self.version < ver('13.1'):