• Alexandre Oliva's avatar
    Introduce @unless/@endunless and postbootstrap Makefile targets · 3127effc
    Alexandre Oliva authored
    This patch turns dependencies of non-bootstrap targets on bootstrap
    targets for bootstrap builds into dependencies on stage_last.  This
    arrangement gets stage1-bubble to run from stage_last if we haven't
    started a bootstrap yet, and to use the current stage otherwise.  This
    was already the case of target libs, just not of non-bootstrapped host
    In order to retain preexisting dependencies in non-bootstrap builds,
    or in gcc-less builds, this introduces support for @unless/@endunless
    pairs in Makefile.in.
    There is a remaining possibility of problem if activating, in a tree
    configured for bootstrap, a parallel build of two or more modules, at
    least one bootstrapped and one not.  In this case, make might decide
    to build stage_current and stage_last in parallel, the latter will
    start a submake to build stage1 while the initial make, having
    satisfied stage_current, proceeds to build the bootstrapped module in
    non-bootstrapped configurations.  The two builds will overlap and will
    likely conflict.  This situation does NOT arise in normal settings,
    however: a post-bootstrap build of all-host all-target will indeed
    activate such targets concurrently, but only after building all
    bootstrapped modules successfully, and it will have both stage_last
    and stage_current targets already satisfied, so the potential race
    between builds will not arise.
    Another remaining problem, that is slightly expanded with this patch,
    is that of an interrupted build in a tree configured for bootstrap,
    continued with a non-bootstrapped target.  Target modules that were
    not bootstrapped would already fail to complete the current stage when
    activated explicitly in the command line for a retry; host modules,
    however, would attempt to build their bootstrapped dependencies, which
    is what led to the problem of concurrent builds addressed with this
    patch.  An interrupted or failed build might still recover correctly,
    if the non-bootstrapped target is activated in both builds, because
    then make will remove stage_last when its build command is
    interrupted, so that it will attempt to recreate it with stage1-bubble
    in the second try.  A bootstrap build, however, will not be attempting
    to build stage_last, so the file will remain and the retry won't go
    through stage1-bubble.  We have lived with that for target modules, so
    we can probably live with that for host modules too.
    Another undesirable consequence of this change is that non-boostrapped
    host modules, in a tree configured for bootstrap, when activated as
    make all-<module>, will build all of stage1 instead of only the
    module's usual dependencies.  This is intentional and necessary to fix
    the parallel-build problem.  If it's not desirable, disabling the
    unnecessary bootstrap configuration will suffice to restore the
    original set of dependencies.
    for  ChangeLog
    	* configure.ac: Introduce support for @unless/@endunless.
    	* Makefile.tpl (dep-kind): Rewrite with cond; return
    	postbootstrap in some cases.
    	(make-postboot-dep, postboot-targets): New.
    	(dependencies): Do not output postbootstrap dependencies at
    	first.  Output non-target ones changed for configure to depend
    	on stage_last @if gcc-bootstrap, and the original deps @unless
    	* configure.in, Makefile.in: Rebuilt.
configure 476 KB