On Tue, 2 Apr 2024, Jakub Jelinek wrote:

> On Wed, Mar 13, 2024 at 10:13:37AM +0100, Jakub Jelinek wrote:
> > While the first Makefile.tpl hunk looks obviously ok, the others look
> > completely wrong to me.
> > There is nothing special about libgo vs. libbacktrace/libatomic
> > compared to any other target library which is not bootstrapped vs. any
> > of its dependencies which are in the bootstrapped set.
> > So, Makefile.tpl shouldn't hardcode such dependencies.
> 
> Here is my version of the fix.
> The dependencies in the toplevel Makefile simply didn't take into account
> that some target modules could be in a bootstrapped build built in some
> configurations as bootstrap modules (typically as dependencies of other
> target bootstrap modules), while in other configurations just as
> dependencies of non-bootstrap target modules and so not built during the
> bootstrap, but after it.
> Makefile.tpl arranges for those postboot target module -> target module
> dependencies to be emitted only inside of an @unless gcc-bootstrap block,
> while for @if gcc-bootstrap it just emits
> configure-target-whatever: stage_last
> dependencies which ensure those postbootstrap target modules are only built
> after everything that is bootstrapped has been.
> 
> Now, the libbacktrace/libatomic target modules have bootstrap=true
> target_modules = { module= libbacktrace; bootstrap=true; };
> target_modules = { module= libatomic; bootstrap=true; lib_path=.libs; };
> because those modules are dependencies of libphobos target module, so
> when d is included among bootstrapped languages, those are all bootstrapped
> and everything works correctly.
> While if d is not included, libphobos target module is disabled,
> libbacktrace/libatomic target modules aren't bootstrapped, nothing during
> bootstrap needs them, but post bootstrap libgo target module depends on
> the libatomic and libbacktrace target modules, libgfortran target module
> depends on the libbacktrace target module and libgm2 target module depends
> on the libatomic target module, but those dependencies were emitted only
> @unless gcc-bootstrap.  There is a similar theoretical problem for zlib
> target module if GCJ would be ressurected, libphobos as bootstrap target
> module depends on the zlib target module, but if d is not configured,
> fastjar also depends on it.
> 
> The following patch arranges for the @if gcc-bootstrap case to emit also
> target module -> target module dependencies, but conditionally on the
> on dependency not being bootstrapped.
> 
> In the generated Makefile.in you can see what the Makefile.tpl change
> produces and that it just adds extra dependencies which weren't there
> before in the @if gcc-bootstrap case.
> 
> I've bootstrapped without this patch with
> ../configure --enable-languages=c,c++,go; make
> on x86_64-linux (note, make -j2 or higher usually worked) which failed
> as described in the PR, then with this patch with the same command which
> built fine and the Makefile difference between the two builds being
> diff -up obj40{a,b}/Makefile
> --- obj40a/Makefile   2024-03-31 00:35:22.243791499 +0100
> +++ obj40b/Makefile   2024-03-31 22:40:38.143299144 +0200
> @@ -29376,6 +29376,14 @@ configure-bison: stage_last
>  configure-flex: stage_last
>  configure-m4: stage_last
>  
> +configure-target-fastjar: maybe-configure-target-zlib
> +all-target-fastjar: maybe-all-target-zlib
> +all-target-libgo: maybe-all-target-libbacktrace
> +all-target-libgo: maybe-all-target-libatomic
> +all-target-libgm2: maybe-all-target-libatomic
> +configure-target-libgfortran: maybe-all-target-libbacktrace
> +configure-target-libgo: maybe-all-target-libbacktrace
> +
>  
>  # Dependencies for target modules on other target modules are
>  # described by lang_env_dependencies; the defaults apply to anything
> 
> which I believe are exactly the extra dependencies we want.
> Plus I've done normal x86_64-linux and i686-linux bootstraps/regtests
> which in my case include 
> --enable-languages=default,ada,obj-c++,lto,go,d,rust,m2
> for x86_64 and the same except ada for i686; those with my usual make -j32.
> The Makefile difference in those builds vs. unpatched case
> is just an extra empty line.
> 
> Ok for trunk?

OK.

Richard.

> 2024-04-02  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR bootstrap/106472
>       * Makefile.tpl (make-postboot-target-dep): New lambda.
>       Use it to add --enable-bootstrap dependencies of target modules
>       on other target modules if the latter aren't bootstrapped.
>       * Makefile.in: Regenerate.
> 
> --- Makefile.tpl.jj   2024-01-09 22:40:16.812824317 +0100
> +++ Makefile.tpl      2024-03-30 14:23:51.985398859 +0100
> @@ -2013,6 +2013,25 @@ configure-target-[+module+]: maybe-all-g
>        (unless (=* target "target-")
>             (string-append "configure-" target ": " dep "\n"))))))
>  
> +   ;; Dependencies in between target modules if the dependencies
> +   ;; are bootstrap target modules and the target modules which
> +   ;; depend on them are emitted inside of @unless gcc-bootstrap.
> +   ;; Unfortunately, some target modules like libatomic or libbacktrace
> +   ;; have bootstrap flag set, but whether they are actually built
> +   ;; during bootstrap or after bootstrap depends on e.g. enabled languages;
> +   ;; if d is enabled, libphobos is built as target module and depends
> +   ;; on libatomic and libbacktrace, which are therefore also built as
> +   ;; bootstrap modules.  If d is not enabled but go is, libatomic and
> +   ;; libbacktrace are just dependencies of libgo which is not a bootstrap
> +   ;; target module, but we need dependencies on libatomic and libbacktrace
> +   ;; in that case even when gcc-bootstrap.  This lambda emits those.
> +   (define make-postboot-target-dep (lambda ()
> +     (let ((target (dep-module "module")) (on (dep-module "on")))
> +       (when (=* on "target-")
> +      (when (=* target "target-")
> +        (string-append "@unless " on "-bootstrap\n" (make-dep "" "")
> +                       "\n@endunless " on "-bootstrap\n"))))))
> +
>     ;; We now build the hash table that is used by dep-kind.
>     (define boot-modules (make-hash-table 113))
>     (define postboot-targets (make-hash-table 113))
> @@ -2045,6 +2064,11 @@ configure-target-[+module+]: maybe-all-g
>  [+ == "postbootstrap" +][+ (make-postboot-dep) +][+ ESAC +][+
>  ENDFOR dependencies +]@endif gcc-bootstrap
>  
> +@if gcc-bootstrap
> +[+ FOR dependencies +][+ CASE (dep-kind) +]
> +[+ == "postbootstrap" +][+ (make-postboot-target-dep) +][+ ESAC +][+
> +ENDFOR dependencies +]@endif gcc-bootstrap
> +
>  @unless gcc-bootstrap
>  [+ FOR dependencies +][+ CASE (dep-kind) +]
>  [+ == "postbootstrap" +][+ (make-dep "" "") +]
> --- Makefile.in.jj    2024-01-16 22:51:10.233410651 +0100
> +++ Makefile.in       2024-03-29 15:50:34.676632723 +0100
> @@ -68677,6 +68677,39 @@ configure-flex: stage_last
>  configure-m4: stage_last
>  @endif gcc-bootstrap
>  
> +@if gcc-bootstrap
> +@unless target-zlib-bootstrap
> +configure-target-fastjar: maybe-configure-target-zlib
> +@endunless target-zlib-bootstrap
> +@unless target-zlib-bootstrap
> +all-target-fastjar: maybe-all-target-zlib
> +@endunless target-zlib-bootstrap
> +@unless target-libstdc++-v3-bootstrap
> +configure-target-libgo: maybe-all-target-libstdc++-v3
> +@endunless target-libstdc++-v3-bootstrap
> +@unless target-libbacktrace-bootstrap
> +all-target-libgo: maybe-all-target-libbacktrace
> +@endunless target-libbacktrace-bootstrap
> +@unless target-libatomic-bootstrap
> +all-target-libgo: maybe-all-target-libatomic
> +@endunless target-libatomic-bootstrap
> +@unless target-libstdc++-v3-bootstrap
> +configure-target-libgm2: maybe-all-target-libstdc++-v3
> +@endunless target-libstdc++-v3-bootstrap
> +@unless target-libatomic-bootstrap
> +all-target-libgm2: maybe-all-target-libatomic
> +@endunless target-libatomic-bootstrap
> +@unless target-libstdc++-v3-bootstrap
> +configure-target-libgrust: maybe-all-target-libstdc++-v3
> +@endunless target-libstdc++-v3-bootstrap
> +@unless target-libbacktrace-bootstrap
> +configure-target-libgfortran: maybe-all-target-libbacktrace
> +@endunless target-libbacktrace-bootstrap
> +@unless target-libbacktrace-bootstrap
> +configure-target-libgo: maybe-all-target-libbacktrace
> +@endunless target-libbacktrace-bootstrap
> +@endif gcc-bootstrap
> +
>  @unless gcc-bootstrap
>  all-gnattools: maybe-all-target-libstdc++-v3
>  configure-libcc1: maybe-configure-gcc
> 
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to