Re: "make hierarchy" from main tree breaks c++ headers on older branches with unclear errors if "make install world" is interrupted
- Reply: Enji Cooper : "Re: "make hierarchy" from main tree breaks c++ headers on older branches with unclear errors if "make install world" is interrupted"
- In reply to: Enji Cooper : "Re: "make hierarchy" from main tree breaks c++ headers on older branches with unclear errors if "make install world" is interrupted"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 31 May 2023 09:06:54 UTC
On 31 May 2023, at 01:07, Enji Cooper <yaneurabeya@gmail.com> wrote: > >> On May 28, 2023, at 3:53 AM, Dimitry Andric <dim@FreeBSD.org> wrote: >> On 28 May 2023, at 07:18, Enji Cooper <yaneurabeya@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