bug-autoconf
[Top][All Lists]
Advanced

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

[sr #110521] autom4te does not always update cache, breaks if change hap


From: Sergei Trofimovich
Subject: [sr #110521] autom4te does not always update cache, breaks if change happens within 1 second
Date: Sun, 1 Aug 2021 14:55:17 -0400 (EDT)
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0

URL:
  <https://savannah.gnu.org/support/?110521>

                 Summary: autom4te does not always update cache, breaks if
change happens within 1 second
                 Project: Autoconf
            Submitted by: slyfox
            Submitted on: Вс 01 авг 2021 18:55:15
                Category: None
                Priority: 5 - Normal
                Severity: 3 - Normal
                  Status: None
                 Privacy: Public
             Assigned to: None
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
        Operating System: None

    _______________________________________________________

Details:

It's an upstream formward of downstream https://bugs.gentoo.org/782985 bug
reported by Ionen Wolkens.

There `automake` run against outdated autoconf fails with version mismatch
error. Here is full minimal reproducer:


$ cat Makefile.am
# empty



cat configure.ac
AC_INIT(bug, 0.0.0)
AM_INIT_AUTOMAKE([1.6])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT



cat torture.bash
#!/bin/bash

die() {
        echo "FATAL: can't continue"
        exit 1
}

artificial_delay() {
        # https://bugs.gentoo.org/782985#c0
        [[ -n $ARTIFICIAL_DELAY ]] && sleep $ARTIFICIAL_DELAY
}

while :; do
        # remove all intermediate files from previous runs
        rm -fr -- aclocal.m4 autom4te.cache configure configure~ install-sh
Makefile.in missing

        # generate aclocal and friends with older autoconf-2.69/automake-1.13
        aclocal-1.13 --force && autoconf-2.69 --force && automake-1.13
--add-missing --copy --force-missing --foreign || die

        # generate a trace (Gentoo does a bit of introspection for existing
build system before a major update to new autoconf/automake)
        autoconf-2.71 --trace=AC_DOES_NOT_EXIST || die
        artificial_delay

        # a workaround
        #rm -rfv -- autom4te.cache

        # move to a new version of autoconf-2.71/automake-1.16
        aclocal-1.16 --force && /usr/bin/autoconf-2.71 --force &&
automake-1.16 --add-missing --copy --force-missing --foreign || die
done


The output:

bad:

+vebatim+
$ bash -x ./torture.bash
+ :
+ rm -fr -- aclocal.m4 autom4te.cache configure configure~ install-sh
Makefile.in missing
+ aclocal-1.13 --force
+ autoconf-2.69 --force
aclocal.m4:17: warning: this file was generated for autoconf 2.71.
You have another version of autoconf.  It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically
'autoreconf'.
+ automake-1.13 --add-missing --copy --force-missing --foreign
configure.ac:2: installing './install-sh'
configure.ac:2: installing './missing'
+ autoconf-2.71 --trace=AC_DOES_NOT_EXIST
+ artificial_delay
+ [[ -n '' ]]
+ aclocal-1.16 --force
+ /usr/bin/autoconf-2.71 --force
+ automake-1.16 --add-missing --copy --force-missing --foreign
configure.ac:2: error: version mismatch.  This is Automake 1.16.4,
configure.ac:2: but the definition used by this AM_INIT_AUTOMAKE
configure.ac:2: comes from Automake 1.13.4.  You should recreate
configure.ac:2: aclocal.m4 with aclocal and run automake again.
+ die
+ echo 'FATAL: can'\''t continue'
FATAL: can't continue
+ exit 1


good:

+vebatim+
$ ARTIFICIAL_DELAY=1 bash -x ./torture.bash
+ :
+ rm -fr -- aclocal.m4 autom4te.cache configure configure~ install-sh
Makefile.in missing
+ aclocal-1.13 --force
+ autoconf-2.69 --force
aclocal.m4:17: warning: this file was generated for autoconf 2.71.
You have another version of autoconf.  It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically
'autoreconf'.
+ automake-1.13 --add-missing --copy --force-missing --foreign
configure.ac:2: installing './install-sh'
configure.ac:2: installing './missing'
+ autoconf-2.71 --trace=AC_DOES_NOT_EXIST
+ artificial_delay
+ [[ -n 1 ]]
+ sleep 1
+ aclocal-1.16 --force
+ /usr/bin/autoconf-2.71 --force
+ automake-1.16 --add-missing --copy --force-missing --foreign
+ :
+ rm -fr -- aclocal.m4 autom4te.cache configure configure~ install-sh
Makefile.in missing
+ aclocal-1.13 --force
+ autoconf-2.69 --force
aclocal.m4:17: warning: this file was generated for autoconf 2.71.
You have another version of autoconf.  It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically
'autoreconf'.
+ automake-1.13 --add-missing --copy --force-missing --foreign
configure.ac:2: installing './install-sh'
configure.ac:2: installing './missing'
+ autoconf-2.71 --trace=AC_DOES_NOT_EXIST
+ artificial_delay
+ [[ -n 1 ]]
+ sleep 1
+ aclocal-1.16 --force
+ /usr/bin/autoconf-2.71 --force
+ automake-1.16 --add-missing --copy --force-missing --foreign
+ :
+ rm -fr -- aclocal.m4 autom4te.cache configure configure~ install-sh
Makefile.in missing
+ aclocal-1.13 --force
+ autoconf-2.69 --force
aclocal.m4:17: warning: this file was generated for autoconf 2.71.
You have another version of autoconf.  It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically
'autoreconf'.
+ automake-1.13 --add-missing --copy --force-missing --foreign
configure.ac:2: installing './install-sh'
configure.ac:2: installing './missing'
+ autoconf-2.71 --trace=AC_DOES_NOT_EXIST
+ artificial_delay
+ [[ -n 1 ]]
+ sleep 1
...


Explanation of `torture.bash`:

The script emulates Gentoo's behaviour of introspectinf existiong build system
before safely regenerating `./configure` and all of it's depends to more
recent `autoconf`/`automake`.

To do it the script runs `autoconf --trace=...` and then runs everything
else.

Explanation of failure:

When `autoconf-${new} --trace=...` / `aclocal-${new}` / `automake ...` is
executed within one second it tricks `autom4te` to consider traces up to date
and does not regenerate traces (and breaks). `autom4te` has the following
comment:
https://git.savannah.gnu.org/cgit/autoconf.git/tree/bin/autom4te.in#n913


  # The youngest of the cache files must be older than the oldest of
  # the dependencies.
  # FIXME: These timestamps have only 1-second resolution.
  # Time::HiRes fixes this, but assumes Perl 5.8 or later.
  my $tmtime = mtime ($tfile);
  my $omtime = mtime ($ofile);
  my ($file, $mtime) = ($tmtime < $omtime
                        ? ($ofile, $omtime) : ($tfile, $tmtime));


`sleep 1` introduces enough delay to notice cache staleness between
`autoconf-${new} --trace=...` / `aclocal-${new}`.

Thanks!




    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/support/?110521>

_______________________________________________
  Сообщение отправлено по Savannah
  https://savannah.gnu.org/




reply via email to

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