libtool-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: backport of duplicate members changes to branch-2-0


From: Ralf Wildenhues
Subject: Re: backport of duplicate members changes to branch-2-0
Date: Sat, 7 May 2005 08:23:28 +0200
User-agent: Mutt/1.5.9i

Hi Peter,

* Peter O'Gorman wrote on Thu, May 05, 2005 at 03:02:03PM CEST:
>
> Okay to apply?

Minor nits below, otherwise fine, I think.
(As fine as it is in HEAD currently, which will change soon)

Regards,
Ralf

> Index: config/ltmain.m4sh
> ===================================================================
> RCS file: /cvsroot/libtool/libtool/config/ltmain.m4sh,v
> retrieving revision 1.1.2.51
> diff -u -r1.1.2.51 ltmain.m4sh
> --- config/ltmain.m4sh 27 Apr 2005 11:31:16 -0000 1.1.2.51
> +++ config/ltmain.m4sh 5 May 2005 12:59:16 -0000
> @@ -936,32 +936,7 @@
>      if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
>       :
>      else
> -      f_ex_an_ar_lib=`$ECHO "X$f_ex_an_ar_oldlib" | $Xsed -e 's%^.*/%%'`
> -      func_warning "$modename: warning: object name conflicts; renaming 
> object files" 1>&2
> -      func_warning "$modename: warning: to ensure that they will not 
> overwrite" 1>&2
> -      $show "cp $f_ex_an_ar_oldlib $f_ex_an_ar_dir/$f_ex_an_ar_lib"
> -      $run eval "cp \$f_ex_an_ar_oldlib \$f_ex_an_ar_dir/\$f_ex_an_ar_lib"
> -      $AR t "$f_ex_an_ar_oldlib" | sort | uniq -c | while read count name
> -      do
> -     # We don't want to do anything to objects with unique names
> -        test "$count" -eq 1 && continue
> -     i=1
> -     while test "$i" -le "$count"
> -       do
> -       # Put our $i before any first dot (extension)
> -       # Never overwrite any file
> -       name_to="$name"
> -       while test "X$name_to" = "X$name" || test -f 
> "$f_ex_an_ar_dir/$name_to"
> -         do
> -         name_to=`$ECHO "X$name_to" | $Xsed -e "s/\([[^.]]*\)/\1-$i/"`
> -       done
> -       $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_lib '$name' && $MV 
> '$name' '$name_to' && $AR d $f_ex_an_ar_lib '$name')"
> -       $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_lib '$name' && 
> $MV '$name' '$name_to' && $AR d \$f_ex_an_ar_lib '$name')" || exit $?
> -       i=`expr $i + 1`
> -     done
> -      done
> -      $show "$RM $f_ex_an_ar_dir/$f_ex_an_ar_lib"
> -      $run eval "$RM \$f_ex_an_ar_dir/\$f_ex_an_ar_lib"
> +     func_fatal_error "object name conflicts in archive: 
> $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
>      fi
>  }
>  
> @@ -6262,6 +6237,52 @@
>         oldobjs="$oldobjs $func_extract_archives_result"
>       fi
>  
> +     # POSIX demands no paths to be encoded in archives.  We have
> +     # to avoid creating archives with duplicate basenames if we
> +     # might have to extract them afterwards, e.g., when creating a
> +     # static archive out of a convenience library, or when linking
> +     # the entirety of a libtool archive into another (currently
> +     # not supported by libtool).
> +     if (for obj in $oldobjs
> +         do
> +           $ECHO "X$obj" | $Xsed -e 's%^.*/%%'

Please do the Xsed outside the loop right before the first sort.
Since Xsed then does the wrong thing, please use
  $SED 's%X%%; s%.*/%%' 
instead.  No need to be slower than necessary here.

> +         done | sort | sort -uc >/dev/null 2>&1); then
> +       :
> +     else
> +       $ECHO "copying selected object files to avoid basename conflicts..."

Erm.  I think that should be func_echo.  I also think I missed this in
HEAD as well.

> +
> +       
> +       gentop="$output_objdir/${outputname}x"
> +       generated="$generated $gentop"
> +       func_mkdir_p "$gentop"
> +       save_oldobjs=$oldobjs
> +       oldobjs=
> +       counter=1
> +       for obj in $save_oldobjs
> +       do
> +         objbase=`$ECHO "X$obj" | $Xsed -e 's%^.*/%%'`
> +         case " $oldobjs " in
> +         " ") oldobjs=$obj ;;
> +         *[[\ /]]"$objbase "*)
> +           while :; do
> +             # Make sure we don't pick an alternate name that also
> +             # overlaps.
> +             newobj=lt$counter-$objbase
> +             counter=`expr $counter + 1`
> +             case " $oldobjs " in
> +             *[[\ /]]"$newobj "*) ;;
> +             *) if test ! -f "$gentop/$newobj"; then break; fi ;;
> +             esac
> +           done
> +           $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
> +           $run ln "$obj" "$gentop/$newobj" ||
> +           $run cp "$obj" "$gentop/$newobj"
> +           oldobjs="$oldobjs $gentop/$newobj"
> +           ;;
> +         *) oldobjs="$oldobjs $obj" ;;
> +         esac
> +       done
> +     fi
>       eval cmds=\"$old_archive_cmds\"
>  
>       if len=`expr "X$cmds" : ".*"` &&
> @@ -6275,20 +6296,6 @@
>         objlist=
>         concat_cmds=
>         save_oldobjs=$oldobjs
> -       # GNU ar 2.10+ was changed to match POSIX; thus no paths are
> -       # encoded into archives.  This makes 'ar r' malfunction in
> -       # this piecewise linking case whenever conflicting object
> -       # names appear in distinct ar calls; check, warn and compensate.
> -         if (for obj in $save_oldobjs
> -         do
> -           $ECHO "X$obj" | $Xsed -e 's%^.*/%%'
> -         done | sort | sort -uc >/dev/null 2>&1); then
> -         :
> -       else
> -         func_warning "object name conflicts; overriding AR_FLAGS to 'cq'"
> -         func_warning "to ensure that POSIX-compatible ar will work"
> -         AR_FLAGS=cq
> -       fi
>         # Is there a better way of finding the last object in the list?
>         for obj in $save_oldobjs
>         do
> Index: tests/duplicate_members.test
> ===================================================================
> RCS file: tests/duplicate_members.test
> diff -N tests/duplicate_members.test
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ tests/duplicate_members.test 5 May 2005 12:59:16 -0000
> @@ -0,0 +1,55 @@
> +#! /bin/sh
> +# duplicate members
> +
> +. tests/defs || exit 1
> +
> +test -d duplicate_members.dir && rm -rf duplicate_members.dir
> +
> +mkdir duplicate_members.dir
> +# we don't want to use whole_archive_flag_spec, even if available
> +sed -e 's|^whole_archive_flag_spec=.*|whole_archive_flag_spec=|g' < $LIBTOOL 
> > duplicate_members.dir/libtool
> +
> +cd duplicate_members.dir
> +chmod +x ./libtool
> +
> +for a in 1 2 3 4 5 6
> +do
> +  mkdir $a
> +  echo "int foo$a() {return $a;}" > $a/a.c
> +done
> +eval `./libtool --config | grep ^CC`
> +
> +for a in 1 2 3 4 5 6
> +do
> +  ./libtool --mode=compile --tag=CC $CC -c $CFLAGS -o $a/a.lo $a/a.c
> +done
> +./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libc0.la 6/a.lo
> +./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libconv.la 1/a.lo 
> 2/a.lo 3/a.lo 4/a.lo 5/a.lo libc0.la
> +
> +exit 1

You most certainly don't want this in here!  :-)

> +
> +cat <<EOF > bar.c
> +int bar() {
> +    int result=foo1() +foo2() +foo3() +foo4() +foo5() +foo6();
> +    return result;
> +}
> +EOF
> +
> +./libtool --mode=compile --tag=CC $CC -c $CFLAGS -o bar.lo bar.c
> +./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libbar.la bar.lo 
> libconv.la -rpath /notexist
> +
> +cat <<EOF > main.c

Really minor nit: I am used to the here doc delimiter being at the end
of the line (applies here and above).  Besides consistency my editor
also highlights it better.  No strong preference though.

> +int bar();
> +int main()
> +{
> +if (bar() == 21) return 0;
> +return 1;
> +}
> +EOF
> +./libtool --mode=compile --tag=CC $CC -c $CFLAGS -o main.lo main.c
> +./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o main main.lo 
> ./libbar.la
> +./main
> +retcode=$?
> +cd ..
> +rm -rf duplicate_members.dir
> +exit $retcode





reply via email to

[Prev in Thread] Current Thread [Next in Thread]