On 31 May 2023, at 01:07, Enji Cooper <yaneurab...@gmail.com> wrote:
> 
>> On May 28, 2023, at 3:53 AM, Dimitry Andric <d...@freebsd.org> wrote:
>> On 28 May 2023, at 07:18, Enji Cooper <yaneurab...@gmail.com> wrote:
>>> 
>>> I just tried to run “make hierarchy” from a main tree on a 13.2-RELEASE 
>>> system, and doing so completely broke my headers.
>>> It took me about 30 minutes to figure out what happened… 
>>> /usr/include/c++/v1/__string was a header, whereas on :main it’s a 
>>> directory?!
>> 
>> Yes, upstream libc++ has split up large headers into multiple components, in 
>> particular __string and __type_traits.
>> 
>> Since we had a file named __string, it had to be somehow replaced by a 
>> directory. This is what the distrib-cleanup target in the top-level Makefile 
>> does:
>> 
>> https://github.com/DimitryAndric/freebsd-src/commit/6b13b4a095e3
>> 
>> Afterwards, the replacement directory named __string is created as part of 
>> the regular mtree commands.
>> 
>> 
>> ...
>>> I reinstalled the headers by going to lib/libc++ in my releng/13.2 tree, 
>>> building, and installing all of the 13.2-RELEASE headers.
>>> This change has been live for almost a year now on :main — is this a known 
>>> caveat when doing a source-based upgrade from 13.2-RELEASE* to 
>>> 14.0-CURRENT, i.e., that the installworld (if interrupted) could break the 
>>> c++ compiler?
>> 
>> I think it should already be quite clear that interrupting installworld is 
>> risky. If you were just in the middle of replacing libc or rtld, and those 
>> were half-written, your system will be completely hosed. (I am speaking from 
>> experience. :) The same goes for any system headers or libraries, not only 
>> the C++ ones. If you have a half-installed tree, it should not be used for 
>> anything except attempting another installworld.
> 
> That’s a fair point, however, given that this follows the standard 
> installation workflow…
> 1. etcupdate pre-run.
> 2. install kernel
> 3. reboot
> 4. make installworld
> 5. etcupdate post-run
> … this could surprise end-users. In particular, the C++ compiler will be 
> broken between step 1 and step 4.

How so? The deletion of the old __string file is done as part of installworld, 
i.e. in step 4, not in any of the earlier steps. The only case where you can 
have problems is when you start installworld, let it run until it has completed 
its distrib-cleanup target, and then interrupt it before it can install the new 
headers.

-Dimitry

Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to