+ # func_dest_tmpfilename file
+ # determines the name of a temporary file (file is relative to destdir).
+ # Sets variable:
+ # - tmpfile absolute filename of the temporary file
+ func_dest_tmpfilename ()
+ {
+ if $doit; then
+ # Put the new contents of $file in a file in the same directory (needed
+ # to guarantee that an 'mv' to "$destdir/$file" works).
+ tmpfile="$destdir/$1.tmp"
+ else
+ # Put the new contents of $file in a file in a temporary directory
+ # (because the directory of "$file" might not exist).
+ tmpfile="$tmp"/`basename "$1"`.tmp
+ fi
+ }
+
+ # Copy files or make symbolic links. Remove obsolete files.
+ delimiter=' '
+ sed_rewrite_old_files="\
+ s,^build-aux/,$auxdir/,
+ s,^doc/,$cached_docbase/,
+ s,^lib/,$cached_sourcebase/,
+ s,^m4/,$cached_m4base/,
+ s,^tests/,$cached_testsbase/,"
+ sed_rewrite_new_files="\
+ s,^build-aux/,$auxdir/,
+ s,^doc/,$docbase/,
+ s,^lib/,$sourcebase/,
+ s,^m4/,$m4base/,
+ s,^tests/,$testsbase/,"
+ # Construct a table with 2 columns: rewritten-file-name original-file-name,
+ # representing the files according to the last gnulib-tool invocation.
+ for f in $old_files; do echo $f; done \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_old_files" \
+ | LC_ALL=C sort \
+ > "$tmp"/old-files
+ # Construct a table with 2 columns: rewritten-file-name original-file-name,
+ # representing the files after this gnulib-tool invocation.
+ for f in $new_files; do echo $f; done \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" \
+ | LC_ALL=C sort \
+ > "$tmp"/new-files
+ # First the files that are in old-files, but not in new-files:
+ sed_take_first_column='s,'"$delimiter"'.*,,'
+ for g in `LC_ALL=C join -t"$delimiter" -v1 "$tmp"/old-files "$tmp"/new-files | sed -e "$sed_take_first_column"`; do
+ # Remove the file. Do nothing if the user already removed it.
+ if test -f "$destdir/$g"; then
+ if $doit; then
+ echo "Removing file $g (backup in ${g}~)"
+ mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
+ else
+ echo "Remove file $g (backup in ${g}~)"
+ fi
+ fi
+ done
+ # func_add_or_update handles a file that ought to be present afterwards.
+ # Uses parameters
+ # - f the original file name
+ # - g the rewritten file name
+ # - already_present nonempty if the file already exists, empty otherwise
+ func_add_or_update ()
+ {
+ func_dest_tmpfilename "$g"
+ func_lookup_file "$f"
+ cp "$lookedup_file" "$tmpfile" || func_fatal_error "failed"
+ if test -n "$sed_transform_lib_file"; then
+ case "$f" in
+ lib/*)
+ sed -e "$sed_transform_lib_file" \
+ < "$lookedup_file" > "$tmpfile" || func_fatal_error "failed"
+ ;;
+ esac
+ fi
+ if test -f "$destdir/$g"; then
+ # The file already exists.
+ if cmp "$destdir/$g" "$tmpfile" > /dev/null; then
+ : # The file has not changed.
+ else
+ # Replace the file.
+ if $doit; then
+ if test -n "$already_present"; then
+ echo "Updating file $g (backup in ${g}~)"
+ else
+ echo "Replacing file $g (non-gnulib code backuped in ${g}~) !!"
+ fi
+ mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed"
+ if test -n "$symbolic" && test -z "$lookedup_tmp" \
+ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+ func_ln_if_changed "$lookedup_file" "$destdir/$g"
+ else
+ mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+ fi
+ else
+ if test -n "$already_present"; then
+ echo "Update file $g (backup in ${g}~)"
+ else
+ echo "Replace file $g (non-gnulib code backuped in ${g}~) !!"
+ fi
+ fi
+ fi
+ else
+ # Install the file.
+ # Don't protest if the file should be there but isn't: it happens
+ # frequently that developers don't put autogenerated files into CVS.
+ if $doit; then
+ echo "Copying file $g"
+ if test -n "$symbolic" && test -z "$lookedup_tmp" \
+ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then
+ func_ln_if_changed "$lookedup_file" "$destdir/$g"
+ else
+ mv -f "$tmpfile" "$destdir/${g}" || func_fatal_error "failed"
+ fi
+ else
+ echo "Copy file $g"
+ fi
+ fi
+ rm -f "$tmpfile"
+ }
+ # Then the files that are in new-files, but not in old-files:
+ sed_take_last_column='s,^.*'"$delimiter"',,'
+ already_present=
+ LC_ALL=C join -t"$delimiter" -v2 "$tmp"/old-files "$tmp"/new-files \
+ | sed -e "$sed_take_last_column" \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" > "$tmp"/added-files
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/added-files
+ while read g f; do
+ func_add_or_update
+ done
+ exec 0<&5 5<&-
+ }
+ # Then the files that are in new-files and in old-files:
+ already_present=true
+ LC_ALL=C join -t"$delimiter" "$tmp"/old-files "$tmp"/new-files \
+ | sed -e "$sed_take_last_column" \
+ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_new_files" > "$tmp"/kept-files
+ { # Rearrange file descriptors. Needed because "while ... done < ..."
+ # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh.
+ exec 5<&0 < "$tmp"/kept-files
+ while read g f; do
+ func_add_or_update
+ done
+ exec 0<&5 5<&-
+ }
+
+ # Command-line invocation printed in a comment in generated gnulib-cache.m4.
+ actioncmd="gnulib-tool --import"
+ func_append actioncmd " --dir=$destdir"
+ if test -n "$local_gnulib_dir"; then
+ func_append actioncmd " --local-dir=$local_gnulib_dir"