configure, make: Fix up --enable-link-serialization
authorJakub Jelinek <jakub@redhat.com>
Tue, 12 Jan 2021 10:02:16 +0000 (11:02 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 12 Jan 2021 10:02:16 +0000 (11:02 +0100)
As reported by Matthias, --enable-link-serialization=1 can currently start
two concurrent links first (e.g. gnat1 and cc1).
The problem is that make var = value values seem to work differently between
dependencies and actual rules (where it was tested).
As the language make fragments can be in different order, we can have:
ada.prev = ... magic that will become $(c.serial) under --enable-link-serialization=1
gnat1$(exe): ..... $(ada.prev)
...
c.serial = cc1$(exe)
and while if I add echo $(ada.prev) in the gnat1 rule's command, it prints
cc1, the dependencies are actually evaluated during reading of the goal or
when.
The configure creates (and puts into Makefile) some serialization order of
the languages and in that order c always comes first, and the rest is
actually sorted the way the all_lang_makefrags are already sorted,
so just by forcing c/Make-lang.in first we achieve that X.serial variable
is always defined before some other Y.prev will use it in its goal
dependencies.

2021-01-12  Jakub Jelinek  <jakub@redhat.com>

* configure.ac: Ensure c/Make-lang.in comes first in @all_lang_makefrags@.
* configure: Regenerated.

gcc/configure
gcc/configure.ac

index 1a3154270cbb6e9a7ff34051d78f562829359496..41641c64395655f2741748e9e25adbc4fa301394 100755 (executable)
        $ok || continue
 
        all_lang_configurefrags="$all_lang_configurefrags \$(srcdir)/$gcc_subdir/config-lang.in"
-       all_lang_makefrags="$all_lang_makefrags \$(srcdir)/$gcc_subdir/Make-lang.in"
+       if test "x$language" = xc && test -n "$all_lang_makefrags"; then
+           # Put c/Make-lang.in fragment first to match serialization languages order.
+           all_lang_makefrags="\$(srcdir)/$gcc_subdir/Make-lang.in $all_lang_makefrags"
+       else
+           all_lang_makefrags="$all_lang_makefrags \$(srcdir)/$gcc_subdir/Make-lang.in"
+       fi
        if test -f $srcdir/$gcc_subdir/lang.opt; then
            lang_opt_files="$lang_opt_files $srcdir/$gcc_subdir/lang.opt"
            all_opt_files="$all_opt_files $srcdir/$gcc_subdir/lang.opt"
index f2ba3a3589d6061d9d654ee783022c6b69643729..ff4d3dc078bc85a805d9d2dad6ab649d4e8f9c25 100644 (file)
@@ -6975,7 +6975,12 @@ changequote([,])dnl
        $ok || continue
 
        all_lang_configurefrags="$all_lang_configurefrags \$(srcdir)/$gcc_subdir/config-lang.in"
-       all_lang_makefrags="$all_lang_makefrags \$(srcdir)/$gcc_subdir/Make-lang.in"
+       if test "x$language" = xc && test -n "$all_lang_makefrags"; then
+           # Put c/Make-lang.in fragment first to match serialization languages order.
+           all_lang_makefrags="\$(srcdir)/$gcc_subdir/Make-lang.in $all_lang_makefrags"
+       else
+           all_lang_makefrags="$all_lang_makefrags \$(srcdir)/$gcc_subdir/Make-lang.in"
+       fi
        if test -f $srcdir/$gcc_subdir/lang.opt; then
            lang_opt_files="$lang_opt_files $srcdir/$gcc_subdir/lang.opt"
            all_opt_files="$all_opt_files $srcdir/$gcc_subdir/lang.opt"