Subject: bug#33573: Patch to replace symlinks with files

From: Bogdan <[email-masked]>
Date: Wed, 28 Dec 2022 22:02:47 +0100

Hello, Automake gurus.

Another simple patch from my side: when '--copy' given to 
'--add-missing', copy the standard files even if symlinks already exist.

Basically, the patch adds "if --copy given and a link exists, do NOT 
exit" (+ a double-check of the object type if that would be needed on 
some systems).

This may simplify the things for some users, although you may as well 
update the documentation to say that giving "--force-missing" would 
produce the same result.

Regards,
Bogdan Drozdowski

-- 
Regards - Bogdan ('bogdro') D.                 (GNU/Linux & FreeDOS)
X86 assembly (DOS, GNU/Linux):    http://bogdro.evai.pl/index-en.php
Soft(EN): http://bogdro.evai.pl/soft  http://bogdro.evai.pl/soft4asm
www.Xiph.org  www.TorProject.org  www.LibreOffice.org  www.GnuPG.org

From d67b858d0254e3252f0a63270d2621317c512127 Mon Sep 17 00:00:00 2001
From: Bogdan Drozdowski <>
Date: Mon, 26 Dec 2022 18:26:28 +0100
Subject: [PATCH] Copy missing files if --copy given but a link exists (bug
 33573)

---
 bin/automake.in           |  4 ++--
 t/list-of-tests.mk        |  1 +
 t/missing-link-to-file.sh | 42 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 t/missing-link-to-file.sh

diff --git a/bin/automake.in b/bin/automake.in
index c094234bc..dc4717f0f 100644
--- a/bin/automake.in
+++ b/bin/automake.in
@@ -7647,7 +7647,7 @@ sub required_file_check_or_copy
   # '--force-missing' only has an effect if '--add-missing' is
   # specified.
   return
-    if $found_it && (! $add_missing || ! $force_missing);
+    if $found_it && (! $add_missing || (! $force_missing && ! ($copy_missing && -l $fullfile)));
 
   # If we've already looked for it, we're done.  You might wonder why we
   # don't do this before searching for the file.  If we do that, then
@@ -7693,7 +7693,7 @@ sub required_file_check_or_copy
 
           # Windows Perl will hang if we try to delete a
           # file that doesn't exist.
-          unlink ($fullfile) if -f $fullfile;
+          unlink ($fullfile) if (-f $fullfile or -l $fullfile);
           if ($symlink_exists && ! $copy_missing)
             {
               if (! symlink ("$libdir/$file", $fullfile)
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index d82cf9c4d..395c8689a 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -712,6 +712,7 @@ t/mdate3.sh \
 t/mdate4.sh \
 t/mdate5.sh \
 t/mdate6.sh \
+t/missing-link-to-file.sh \
 t/missing-version-mismatch.sh \
 t/missing3.sh \
 t/am-missing-prog.sh \
diff --git a/t/missing-link-to-file.sh b/t/missing-link-to-file.sh
new file mode 100644
index 000000000..23d6d2cde
--- /dev/null
+++ b/t/missing-link-to-file.sh
@@ -0,0 +1,42 @@
+#! /bin/sh
+# Copyright (C) 2002-2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# Make sure Automake will install real files when --copy is given even
+# if symlinks already exist.
+
+. test-init.sh
+
+cat >> configure.ac <<EOF
+AC_OUTPUT
+EOF
+
+cat > Makefile.am << 'END'
+info_TEXINFOS = foo.texi
+END
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE --add-missing
+
+#ls -l
+
+$AUTOMAKE --add-missing --copy
+
+#ls -l
+
+test ! -h texinfo.tex || exit 1
+
+:
-- 
2.35.1