Re: [PATCH] libtool: preliminary support for the Cray compiler.

Christian Feld <[email protected]>
Newsgroups gmane.comp.gnu.libtool.general
Message-ID <[email protected]>
Hi Eric,

On 2015-06-02 17:27, Eric Bavier wrote:
> Has anyone had a chance to look this patch over?

we found one OpenMP related issue in your patch. In contrast to other
compilers, the Cray compiler enables OpenMP by default (-homp) and you
need to pass -hnoomp to disable it.

With your patch, building a non-OpenMP library adds -hnoomp to
inherited_linker_flags. Linking this non-OpenMP library to an OpenMP
program leads to undefined OpenMP symbols because the inherited linker
flag -hnoomp gets added late to the link line. Here it doesn't matter if
you explicitly specify -homp for linking or just use the default.

This is easy to fix, see below.

> `~Eric
>
> On 04/14/2015 12:46 PM, Eric Bavier wrote:
>> 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.
>>
>>
>> 0001-libtool-preliminary-support-for-the-Cray-compiler.patch
>>
>>
>> From 533d9854c7b3c6c351f5a8d7f2f69e69fb73ad40 Mon Sep 17 00:00:00 2001
>> From: Eric Bavier <[email protected]>
>> 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)

should be:
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*|-homp)

>>      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=*)

should be:
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*|-homp)

Thanks,
Christian

>> +        |-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.
>
>
>
> _______________________________________________
> https://lists.gnu.org/mailman/listinfo/libtool
>



------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich
Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzender des Aufsichtsrats: MinDir Dr. Karl Eugen Huthmacher
Geschaeftsfuehrung: Prof. Dr.-Ing. Wolfgang Marquardt (Vorsitzender),
Karsten Beneke (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,
Prof. Dr. Sebastian M. Schmidt
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------


_______________________________________________
https://lists.gnu.org/mailman/listinfo/libtool
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.