On 11/12/2015 3:42 PM, Simon J. Gerraty wrote:
> Bryan Drewery <bdrew...@freebsd.org> wrote:
> 
>> On 9/3/2015 11:46 AM, Simon J. Gerraty wrote:
>>> Anyway, bootstrap-toolchain leverages src/Makefile.inc1 to build an
>>> initial set of tools.  It then attempts to use that to build toolchain
>>> for MACHINE=host which is currently failing because in-tree libelf and
>>> libdwarf are needed and libelf needs sys/sys/elf_common.h but but that
>>> doesn't currently get staged for host (we try to minimize what we put in
>>> host stage tree).
>>
>> Using the special hack you came up with for lib/libelf, and a lot of
>> other fixes for replacing binutils with elftoolchain, I've managed to
>> get the targets/pseduo/bootstrap-tools build working again. I will
>> commit this likely today or tomorrow.
> 
> Cool - thanks
>  
>> However...
> 
>>> It may be better to simply skip targets/pseudo/toolchain.host
>>> that will work so long as we set TOOLSDIR to point to the stuff built by
>>> Makefile.inc1 
>>>
>>> Depending on where we are with external toolchian support that would
>>> make sense - might be able to skip bootstrap-toolchain completely
>>> which would be nice.
>>
>> I think this is more right because there's many more people thinking
>> about, testing daily, and maintaining the bootstrap logic in
>> Makefile.inc1. The way targets/pseudo/bootstrap-tools works currently
>> lead to bitrot and breakage with the elftoolchain replacement. It will
>> very easily happen again.
> 
> I'd be favor of removing the need completely.
> 
> All that is required is *some* means of producing a viable toolchain in
> such a way that you can point a variable at it.
> 
>> What I plan to do is make pseudo/targets/bootstrap-tools always build
>> all of cross-tools,etc, from Makefile.inc1 respecting its own internal
>> logic for when to bootstrap the compiler (without us telling it to skip
>> the bootstrap compiler) and then add pseudo/targets/bootstrap-tools as a
>> global DIRDEP. Given the use of cookies, this will only be done once per
>> meta build, but it at least won't be a manual step anymore. For the
> 
> That can still add a lot of time to build, and IIRC building clang alone
> poses problems for smaller machines (though using a mutex for linking
> clang bits could at least serialize the huge linker steps so as to avoid
> exhausting memory).
> 
> I quite like the way NetBSD allow separating the tools from the rest of
> the build.  I do the equivalent of 'make tools' very rarely - and so
> do not care how [in]efficient it is.
> IIRC it will throw an error if your tools are incompatible - prompting
> an update.
> 
> I would suggest if you want to be able to hook bootstrap-tools in
> always, that you do it via a knob so it can be disabled.

I would just add some knob like WITH_BOOTSTRAP_TOOLCHAIN or
WITH_EXTERNAL_TOOLCHAIN to make this and the clang bootstrap just be
skipped and resort to the way the meta build works now.

> 
>> record, I do plan to extend .MAKE.MODE=meta to buildworld and its
>> bootstrapping as well, which will give a lot of incremental build
>> improvements to it.
> 
> WITH_META_FILES should give you improvements already in that regard.

Yes, it's a step. We'll need cookies in a lot of places too. I wish
WITH_META_MODE had been WITH_META_BUILD or WITH_DIRDEPS_BUILD so I could
check for "META_MODE" in the buildworld world and for discussion sake.
It seems I can use ${.MAKE.MODE:M*meta*} but that :U is needed in all
the uses. I'm not sure yet if :U really is needed. We have some
${MK_META_MODE} checks now around some cookies that would need to change
for what I'm planning.

> 
>> This means that the meta build will then default to bootstrapping the
>> compiler, which we really must do to build the source tree reliably.
> 
>> There's really no reason the meta build should default to not
>> bootstrapping the compiler. Setting WITHOUT_CROSS_COMPILER or
>> WITHOUT_CLANG_BOOTSTRAP will avoid this and use just the host compiler
>> as the meta build does now. So there's no real problem for those people
>> who want to skip the clang bootstrap.
> 
> Ok, so long as there is a way to do so.
> Otherwise we'd need to add it locally for our own builds - where we need
> to use the toolchains provided by our compiler team.

Yes for sure. As noted above. At Isilon when a developer is building
they have no interest in building the toolchain 99% of the time. This is
why I am so committed to making this automatically skip the toolchain if
possible. As for having an external compiler from a team, that's kind of
already in the "external compiler" realm, so a WITH_EXTERNAL_COMPILER
would make sense to short-circuit all of what I'm wanting. Then you can
add it to your local make.conf or local.sys.mk and not have any change
in behavior.

> 
>> Then, I will work on the project of "building clang less" which will
>> avoid building the bootstrap compiler for both the meta mode build and
>> the buildworld build (and universe eventually) if /usr/bin/cc satisfies
>> the needs (can cross compile the TARGET and is "new enough" compared to
>> the version we want). This is not trivial but I think it is possible and
>> it will make everyone happy!
> 
> Indeed.  As I say, NetBSD have this reasonably sorted.
> But of course they have 2k line shell script driving a lot of it ;-)

Yes the NetBSD build, behavior wise, really impresses me.

> 
>> Related tidbit, using WITHOUT_CROSS_COMPILER (or WITHOUT_*_BOOTSTRAP)
>> with buildworld leads to a broken build currently since it is the user
>> basically asking to use their default external toolchain of /usr/bin/*,
>> but the logic does not kick in to use --sysroot against WORLDTMP. I plan
>> to fix this soon as well.
> 
> Assuming that you have previously built the correct toolchain
> it should be valid to have something like -DWITH_TOOLSDIR
> -DWITHOUT_BOOTSTRAP_TOOLSDIR (or -DWITHOUT_TOOLSDIR_BOOTSTRAP)
> Such that the build logic is identical - all that is being skipped is
> the expense of re-generating the toolchain
> 


-- 
Regards,
Bryan Drewery

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to