libtool-patches
[Top][All Lists]
Advanced

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

[PATCH 1/4] libtoolize: simplify file-copying and -linking call-graph.


From: Gary V. Vaughan
Subject: [PATCH 1/4] libtoolize: simplify file-copying and -linking call-graph.
Date: Mon, 14 Nov 2011 18:04:52 +0700

This series of changesets are either necessary for, or at least
make the application of the directory move patches coming in the
next set as straight forward as possible.

It turns out that we haven't needed to fork a tar process for
every file-copy for about 4 years now.  With that knowledge it's
easy to reduce the complexity of the surrounding functions
somewhat.

I'll apply in 72 hours, along with addressing any feedback I
get in the mean time.

* libtoolize.m4sh (TAR): Remove.
(func_copy_some_files, func_copy_cb): Remove.
(func_copy): Refactor from all of the above, and simplify. No
need to use $TAR to preserve timestamps when copying, since
we've been running touch right afterwards anyway. Adjust all
callers to use the new argument footprint.
(func_serial_update, func_keyword_update): Delete any pre-
existing destination file when used with `--force' before
calling func_copy, now that the hardcoded special cases are not
in there any more.
(func_install_pkgmacro_subproject)
(func_install_pkgaux_subproject): Use our own file loop -
func_copy subsumes all the checks previously in
func_copy_some_files, but operates on only one file at a time.
(func_install_pkgltdl_files): Similarly, handle aclocal.m4 and
configure special cases here, before calling func_copy.
* tests/libtoolize.at: Make sure we match corrected "copying
`configure.ac'" output.

Signed-off-by: Gary V. Vaughan <address@hidden>
---
 libtoolize.m4sh     |  186 ++++++++++++++++++--------------------------------
 tests/libtoolize.at |    4 +-
 2 files changed, 69 insertions(+), 121 deletions(-)

diff --git a/libtoolize.m4sh b/libtoolize.m4sh
index c920248..8fc2042 100644
--- a/libtoolize.m4sh
+++ b/libtoolize.m4sh
@@ -67,8 +67,6 @@ AS_INIT[]m4_divert_push([HEADER-COPYRIGHT])
 # GNU @PACKAGE@ home page: <@PACKAGE_URL@>.
 # General help using GNU software: <http://www.gnu.org/gethelp/>.
 
-: ${TAR=tar}
-
 PROGRAM=libtoolize
 
 m4_divert_pop
@@ -112,8 +110,7 @@ M4SH_GETOPTS(
        CP="func_echo_all $CP"
        test -n "$LN_S" && LN_S="func_echo_all $LN_S"
        MKDIR="func_echo_all $MKDIR"
-       RM="func_echo_all $RM"
-       TAR="func_echo_all $TAR"],
+       RM="func_echo_all $RM"],
   [q],         [--quiet|--automake],           [],                     [],
   [v],         [--verbose],                    [],                     [],
   [],          [--no-warning|--no-warn],       [],                     [],
@@ -211,134 +208,73 @@ func_whisper_error_hdr ()
 
     func_whisper_once "$my_msg_var"
     func_error "$*"
-}
-
-
-# func_copy srcfile destfile [msg_var]
-# A wrapper for func_copy_cb that accepts arguments in the same order
-# as the cp(1) shell command.
-func_copy ()
-{
-    $debug_cmd
-
-    test -f "$1" || \
-      { func_error "\`$1' not copied:  not a regular file"; return 1; }
-
-    func_dirname_and_basename "$1"
-    my_f1=$func_basename_result
-
-    if test -d "$2"; then
-
-      func_copy_cb "$my_f1" \
-       `$ECHO "$1" | $SED "$dirname"` "$2" "$3"
-
-    else
 
-      # Supporting this would mean changing the timestamp:
-      func_dirname_and_basename "$2"
-      my_tname=$func_basename_result
-      test "X$my_f1" = "X$my_tname" \
-        || func_fatal_error "func_copy() cannot change filename on copy"
-
-      func_copy_cb "$my_f1" \
-        `$ECHO "$1" | $SED "$dirname"` \
-        `$ECHO "$2" | $SED "$dirname"` \
-       "$3"
-
-    fi
-
-    return $copy_return_status # set in func_copy_cb
+    exit_status=$EXIT_FAILURE
 }
 
 
-# func_copy_cb filename srcdir destdir [msg_var]
+# func_copy filename srcdir destdir [msg_var]
 # If option `--copy' was specified, or soft-linking SRCFILE to DESTFILE
 # fails, then try to copy SRCFILE to DESTFILE (making sure to update the
 # timestamp so that a series of files with dependencies can be copied
 # in the right order that their timestamps won't trigger rebuilds).
-func_copy_cb ()
+# MSG_VAR names a variable for use with func_whisper_hdr.
+func_copy ()
 {
     $debug_cmd
 
-    my_file="$1"
-    my_srcdir="$2"
-    my_destdir="$3"
-    my_msg_var="$4"
-    copy_return_status=1
+    my_filename=$1
+    my_srcdir=$2
+    my_destdir=$3
+    my_msg_var=$4
+
+    my_srcfile=$my_srcdir/$my_filename
+    my_destfile=$my_destdir/$my_filename
 
     # Libtool is probably misinstalled if this happens:
-    test -f "$my_srcdir/$my_file" ||
-        func_fatal_error "\`$my_file' not found in \`$my_srcdir'"
+    test -f "$my_srcfile" || {
+      func_whisper_error_hdr "$my_msg_var" "\`$my_srcfile' not found"
+      return 1
+    }
 
-    case $opt_verbose in
-      false) my_copy_msg="file \`$my_destdir/$my_file'"     ;;
-      *)     my_copy_msg="file from \`$my_srcdir/$my_file'" ;;
-    esac
-    func_mkdir_p `$ECHO "$my_destdir/$my_file" | $SED "$dirname"`
+    # Require --force to remove existing $my_destfile.
+    $opt_force && $RM "$my_destfile"
+    test -f "$my_destfile" && {
+      func_whisper_error_hdr "$my_msg_var" \
+        "\`$my_destfile' exists: use \`--force' to overwrite"
+      return 1
+    }
+
+    # Be careful to support `func_copy dir/target srcbase destbase'.
+    func_dirname "$my_destfile"
+    func_mkdir_p "$func_dirname_result"
 
-    $RM "$my_destdir/$my_file"
+    # Copy or link according to `--copy' option.
     if $opt_copy; then
-      if { ( cd "$my_srcdir" && $TAR chf - "$my_file" ) 2>/dev/null \
-           | ( umask 0 && cd "$my_destdir" && $TAR xf - ) >/dev/null 2>&1; } \
-        && touch "$my_destdir/$my_file"; then
-       func_whisper_hdr "$my_msg_var" "copying $my_copy_msg"
-       copy_return_status=0
-      fi
+      my_copycmd=$CP
+      my_copy_type=copying
     else
-      if test "$my_file" = "aclocal.m4"; then
-       if { ( cd "$my_srcdir" && $TAR chf - "$my_file" ) 2>/dev/null \
-            | ( umask 0 && cd "$my_destdir" && $TAR xf - ) >/dev/null 2>&1 ; }
-       then
-         func_whisper_hdr "$my_msg_var" "copying $my_copy_msg"
-         copy_return_status=0
-       fi
-      else
-       if $LN_S "$my_srcdir/$my_file" "$my_destdir/$my_file"; then
-         func_whisper_hdr "$my_msg_var" "linking $my_copy_msg"
-         copy_return_status=0
-       fi
-      fi
+      my_copycmd=$LN_S
+      my_copy_type=linking
     fi
-    if test "$copy_return_status" != 0; then
+    my_copy_msg="$my_copy_type file \`$my_destfile'"
+    $opt_verbose && my_copy_msg="$my_copycmd $my_srcfile $my_destdir"
+
+    if $opt_dry_run || {
+        ( umask 0
+          $my_copycmd "$my_srcfile" "$my_destfile"
+        ) >/dev/null 2>&1
+      }
+    then
+      func_whisper_hdr "$my_msg_var" "$my_copy_msg"
+    else
       func_whisper_error_hdr "$my_msg_var" \
-          "can not copy \`$my_srcdir/$my_file' to \`$my_destdir/'"
-      exit_status=$EXIT_FAILURE
+        "$my_copy_type \`$my_srcdir/$my_filename' to \`$my_destdir/' failed"
+      return 1
     fi
 }
 
 
-# func_copy_some_files srcfile_list srcdir destdir [msg_var] [cb=func_copy_cb]
-# Call COPY_CB for each regular file in SRCDIR named by the space delimited
-# names in SRCFILE_LIST.
-func_copy_some_files ()
-{
-    $debug_cmd
-
-    my_srcfile_list="$1"
-    my_srcdir="$2"
-    my_destdir="$3"
-    my_msg_var="$4"
-    my_copy_cb="${5-func_copy_cb}"
-
-    for my_filename in $my_srcfile_list; do
-      if test -f "$my_srcdir/$my_filename"; then
-        if test "X$my_copy_cb" = Xfunc_copy_cb; then
-         $opt_force || if test -f "$my_destdir/$my_filename"; then
-           func_whisper_error_hdr "$my_msg_var" \
-             "\`$my_destdir/$my_filename' exists: use \`--force' to overwrite"
-           continue
-         fi
-        fi
-      else
-       func_whisper_error_hdr "$my_msg_var" \
-         "\`$my_filename' not found in \`$my_srcdir'"
-      fi
-
-      $my_copy_cb "$my_filename" "$my_srcdir" "$my_destdir" "$my_msg_var"
-    done
-}
-
-
 # func_fixup_Makefile srcfile srcdir destdir
 func_fixup_Makefile ()
 {
@@ -647,7 +583,8 @@ func_serial_update ()
     fi
 
     if $my_serial_update_p || $opt_force; then
-      func_copy "$my_srcfile" "$my_destfile" "$my_msg_var"
+      $RM "$my_destfile"
+      func_copy "$my_filename" "$my_srcdir" "$my_destdir" "$my_msg_var"
       my_return_status=$?
     elif $opt_force && test "X$my_dest_serial" = "X$my_src_serial"; then
       func_whisper_hdr "$my_msg_var" "\`$my_destfile' is already up to date."
@@ -719,7 +656,8 @@ func_keyword_update ()
     fi
 
     if $my_keyword_update_p || $opt_force; then
-      func_copy "$my_srcfile" "$my_destfile" "$my_msg_var"
+      $RM "$my_destfile"
+      func_copy "$my_filename" "$my_srcdir" "$my_destdir" "$my_msg_var"
     elif $opt_verbose || $opt_force && test "X$my_dest_serial" = 
"X$my_src_serial"; then
       func_whisper_hdr "$my_msg_var" "\`$my_destfile' is already up to date."
     fi
@@ -816,8 +754,9 @@ func_install_pkgmacro_subproject ()
       pkgmacro_header="putting macros in AC_CONFIG_MACRO_DIR, 
\`$subproject_macro_dir'."
     fi
 
-    func_copy_some_files "$pkgmacro_files" \
-      "$aclocaldir" "$subproject_macro_dir" pkgmacro_header
+    for file in $pkgmacro_files; do
+      func_copy "$file" "$aclocaldir" "$subproject_macro_dir" pkgmacro_header
+    done
 }
 
 
@@ -948,18 +887,26 @@ func_install_pkgltdl_files ()
           test recursive = "$ltdl_mode" \
             && func_fixup_Makefile "$file" "$pkgltdldir" "$ltdl_dir"
           test subproject = "$ltdl_mode" \
-            && func_copy "$pkgltdldir/$file" "$ltdl_dir/$file" pkgltdl_header
+            && func_copy "$file" "$pkgltdldir" "$ltdl_dir" pkgltdl_header
           ;;
         Makefile.inc)
           test nonrecursive = "$ltdl_mode" \
             && func_fixup_Makefile "$file" "$pkgltdldir" "$ltdl_dir"
           ;;
-        aclocal.m4|config-h.in|configure|configure.ac)
+        aclocal.m4|configure)
+          # Always copy aclocal.m4 and configure, otherwise regenerating
+         # them can overwrite the destination if they are symlinked.
+          test subproject = "$ltdl_mode" || continue
+          ( opt_copy=:
+            func_copy "$file" "$pkgltdldir" "$ltdl_dir" pkgltdl_header
+          )
+         ;;
+        config-h.in|configure.ac)
           test subproject = "$ltdl_mode" \
-            && func_copy "$pkgltdldir/$file" "$ltdl_dir/$file" pkgltdl_header
+            && func_copy "$file" "$pkgltdldir" "$ltdl_dir" pkgltdl_header
           ;;
         *)
-          func_copy "$pkgltdldir/$file" "$ltdl_dir/$file" pkgltdl_header
+          func_copy "$file" "$pkgltdldir" "$ltdl_dir" pkgltdl_header
           ;;
       esac
     done
@@ -994,8 +941,9 @@ func_install_pkgaux_subproject ()
       pkgaux_header="putting auxiliary files in \`$subproject_aux_dir'."
     fi
 
-    func_copy_some_files "$pkgaux_files" \
-      "$pkgdatadir/config" "$ltdl_dir/config" pkgaux_header
+    for file in $pkgaux_files; do
+      func_copy "$file" "$pkgdatadir/config" "$ltdl_dir/config" pkgaux_header
+    done
 }
 
 
diff --git a/tests/libtoolize.at b/tests/libtoolize.at
index 748cd4d..fdd76fb 100644
--- a/tests/libtoolize.at
+++ b/tests/libtoolize.at
@@ -377,7 +377,7 @@ libtoolize: copying file `ltdl/aclocal.m4'
 libtoolize: linking file `ltdl/argz_.h'
 libtoolize: linking file `ltdl/argz.c'
 libtoolize: linking file `ltdl/config-h.in'
-libtoolize: linking file `ltdl/configure'
+libtoolize: copying file `ltdl/configure'
 libtoolize: linking file `ltdl/libltdl/lt__alloc.h'
 libtoolize: linking file `ltdl/libltdl/lt__dirent.h'
 libtoolize: linking file `ltdl/libltdl/lt__glibc.h'
@@ -971,7 +971,7 @@ libtoolize: copying file `ltdl/aclocal.m4'
 libtoolize: linking file `ltdl/argz_.h'
 libtoolize: linking file `ltdl/argz.c'
 libtoolize: linking file `ltdl/config-h.in'
-libtoolize: linking file `ltdl/configure'
+libtoolize: copying file `ltdl/configure'
 libtoolize: linking file `ltdl/libltdl/lt__alloc.h'
 libtoolize: linking file `ltdl/libltdl/lt__dirent.h'
 libtoolize: linking file `ltdl/libltdl/lt__glibc.h'
-- 
1.7.7.3

Cheers,
-- 
Gary V. Vaughan (gary AT gnu DOT org)



reply via email to

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