I'd like to get some additional feedback on this patch for the Cray
Compiler Environment support in libtool, now that the copyright
assignment process has (finally) gone through.
From 533d9854c7b3c6c351f5a8d7f2f69e69fb73ad40 Mon Sep 17 00:00:00 2001
From: Eric Bavier <address@hidden>
Date: Tue, 18 Nov 2014 15:33:58 -0600
Subject: [PATCH] libtool: preliminary support for the Cray compiler.
This patch adds preliminary support for the Cray Compiler
Environment (CCE) to libtool. Main issues:
- When linking a static executable, the value of the STRIP environment
variable must be an absolute file name.
- Symbols will be stripped from shared libraries during creation if
the STRIP environment variable is set.
- When linking against shared libraries, or dlopening a library, a
"-dynamic" option needs to be given to the compiler that it can make
sure that linked system libraries are shared libraries.
---
build-aux/ltmain.in | 38 +++++++++++++++++++++++++++++++++++---
m4/libtool.m4 | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in
index d5cf07a..aee9a9b 100644
--- a/build-aux/ltmain.in
+++ b/build-aux/ltmain.in
@@ -5159,7 +5159,7 @@ func_mode_link ()
;;
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*|-h*omp)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
@@ -5693,7 +5693,7 @@ func_mode_link ()
found=false
case $deplib in
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*|-h*omp)
if test prog,link = "$linkmode,$pass"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
@@ -6234,6 +6234,21 @@ func_mode_link ()
esac
# This is a shared library
+ # Cray's compiler drivers need a -dynamic flag if any linked
+ # library is a shared library. Ensure it gets this flag.
+ case `$CC -V 2>&1 | sed 5q` in
+ *Cray*)
+ case " $compile_command " in
+ *" -dynamic ") ;;
+ *) func_append compile_command " -dynamic" ;;
+ esac
+ case " $finalize_command " in
+ *" -dynamic ") ;;
+ *) func_append finalize_command " -dynamic" ;;
+ esac
+ ;;
+ esac
+
# Warn about portability, can't link against -module's on some
# systems (darwin). Don't bleat about dlopened modules though!
dlopenmodule=
@@ -8311,7 +8326,24 @@ EOF
finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
;;
esac
-
+ if test -n "$dlfiles" ||
+ test "$dlself" = "yes" ||
+ test "$export_dynamic" = "yes"; then
+ # Cray's compiler drivers need a -dynamic flag if the program
+ # is going to be dlopening itself or any libraries.
+ case `$CC -V 2>&1 | sed 5q` in
+ *Cray*)
+ case " $compile_command " in
+ *" -dynamic ") ;;
+ *) func_append compile_command " -dynamic" ;;
+ esac
+ case " $finalize_command " in
+ *" -dynamic ") ;;
+ *) func_append finalize_command " -dynamic" ;;
+ esac
+ ;;
+ esac
+ fi
# move library search paths that coincide with paths to not yet
# installed libraries to the beginning of the library search list
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index a3bc337..5467b5d 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -1530,7 +1530,9 @@ _LT_DECL([], [archiver_list_spec], [1],
m4_defun([_LT_CMD_OLD_ARCHIVE],
[_LT_PROG_AR
-AC_CHECK_TOOL(STRIP, strip, :)
+# Cray's compiler drivers need STRIP to be an absolute file name when
+# static linking.
+AC_PATH_TOOL(STRIP, strip, :)
test -z "$STRIP" && STRIP=:
_LT_DECL([], [STRIP], [1], [A symbol stripping program])
@@ -4407,6 +4409,12 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
;;
+ *Cray\ C*)
+ # Cray C++ compiler
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-hpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
esac
;;
esac
@@ -4764,6 +4772,11 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
+ *Cray\ Fortran* | *Cray\ C*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-hpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
esac
;;
esac
@@ -5247,6 +5260,14 @@ _LT_EOF
fi
;;
esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Cray\ C* | *Cray\ Fortran*) # Cray C/C++/Fortran
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+ _LT_TAGVAR(archive_cmds, $1)='save_STRIP=$STRIP; unset STRIP; $CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib; ret=\$?; STRIP=\$save_STRIP; export STRIP; (exit \$ret)'
+ ;;
+ esac
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -5792,6 +5813,16 @@ _LT_EOF
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Cray\ C* | *Cray\ Fortran*) # Cray C/C++/Fortran
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+ _LT_TAGVAR(archive_cmds, $1)='save_STRIP=$STRIP; unset STRIP; $CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib; ret=\$?; STRIP=\$save_STRIP; export STRIP; (exit \$ret)'
+ ;;
+ *)
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
;;
netbsd*)
@@ -7064,6 +7095,21 @@ if test yes != "$_lt_caught_CXX_error"; then
# in the archive.
_LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
;;
+ *Cray\ C*) # Cray C++ compiler
+ # If STRIP is set while creating a shared library with
+ # the Cray compiler, the library has its symbols
+ # removed. So we unset and restore it.
+ _LT_TAGVAR(archive_cmds, $1)='save_STRIP=$STRIP; unset STRIP; $CC -shared $wl-soname $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags; ret=\$?; STRIP=\$save_STRIP; export STRIP; (exit \$ret)'
+ _LT_TAGVAR(archive_expsym_cmds, $1)=''
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='-vv $wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+ ;;
esac
;;
esac
--
2.0.0
Thank you,
Eric Bavier, Scientific Libraries, Cray Inc.