Re: WITHOUT_CLANG + WITH_CLANG_BOOTSTRAP seems to be broken

From: Andriy Gapon <avg_at_FreeBSD.org>
Date: Wed, 16 Apr 2025 21:14:24 UTC

I am going to open a PR for this, but I wonder if no one else is seeing this or 
if no one else cares.  I'd imagine that a build configuration like mine is not 
so exotic.  E.g., likes of nanobsd could be using something like it.

For me, reproducing the issue is very trivial.

E.g., I do this on a recently upgraded host built from main, in a source tree 
for releng/14.2 branch:

$ env MAKEOBJDIRPREFIX=/usr/obj/test make -s -j12 toolchain 
__MAKE_CONF=/dev/null SRCCONF=/dev/null WITHOUT_CLANG=t
make[1]: 
"/usr/home/avg/devel/freebsd-src-new/upstream/releng/14.2/Makefile.inc1" line 
339: SYSTEM_COMPILER: libclang will be built for bootstrapping a cross-compiler.
make[1]: 
"/usr/home/avg/devel/freebsd-src-new/upstream/releng/14.2/Makefile.inc1" line 
344: SYSTEM_LINKER: libclang will be built for bootstrapping a cross-linker.

--------------------------------------------------------------
 >>> Cleaning up the temporary build tree
--------------------------------------------------------------
--------------------------------------------------------------
 >>> Rebuilding the temporary build tree
--------------------------------------------------------------
Linking host tools into 
/usr/obj/test/usr/home/avg/devel/freebsd-src-new/upstream/releng/14.2/amd64.amd64/tmp/legacy/bin
--------------------------------------------------------------
 >>> stage 1.1: legacy release compatibility shims
--------------------------------------------------------------
===> tools/build (obj,includes,all,install)
         0.12 real         0.05 user         0.09 sys
--------------------------------------------------------------
 >>> stage 1.2: bootstrap tools
--------------------------------------------------------------
...
--------------------------------------------------------------
 >>> stage 2.1: cleaning up the object tree
--------------------------------------------------------------
...
--------------------------------------------------------------
 >>> stage 2.3: build tools
--------------------------------------------------------------
...
--------------------------------------------------------------
 >>> stage 3: cross tools
--------------------------------------------------------------
===> lib/clang (obj,all,install)
===> lib/clang/libllvm (all)
===> lib/clang/libllvm (install)
===> usr.bin/clang (obj,all,install)
===> usr.bin/clang/lld (obj,all,install)
===> lib/libelftc (obj,all,install)
===> lib/libpe (obj,all,install)
===> usr.bin/elfctl (obj,all,install)
===> usr.bin/elfdump (obj,all,install)
===> usr.bin/objcopy (obj,all,install)
===> usr.bin/nm (obj,all,install)
===> usr.bin/size (obj,all,install)
===> usr.bin/strings (obj,all,install)
===> usr.bin/addr2line (obj,all,install)
===> cddl/lib/libctf (obj,all,install)
===> cddl/lib/libspl (obj,all,install)
===> cddl/usr.bin/ctfconvert (obj,all,install)
===> cddl/usr.bin/ctfmerge (obj,all,install)
===> stand/usb/tools (obj,all,install)
       634.09 real      6925.37 user       229.17 sys
         0.04 real         0.00 user         0.04 sys

As you can see, usr.bin/clang/clan is missing from the output.
Also:
$ ls -l /usr/obj/test/.../releng/14.2/amd64.amd64/tmp/bin
total 0
$ ls -l /usr/obj/test/.../releng/14.2/amd64.amd64/tmp/usr/bin
total 40247
-rwxr-xr-x  1 avg wheel  2116760 16 Apr 23:48 addr2line
-rwxr-xr-x  1 avg wheel  2595200 16 Apr 23:48 ctfconvert
-rwxr-xr-x  1 avg wheel  1997104 16 Apr 23:48 ctfmerge
-rwxr-xr-x  1 avg wheel  1411856 16 Apr 23:48 elfctl
-rwxr-xr-x  1 avg wheel  1238064 16 Apr 23:48 elfdump
lrwxr-xr-x  1 avg wheel        6 16 Apr 23:48 ld -> ld.lld
-rwxr-xr-x  1 avg wheel 51724952 16 Apr 23:48 ld.lld
-rwxr-xr-x  1 avg wheel  2132480 16 Apr 23:48 nm
-rwxr-xr-x  1 avg wheel  2337048 16 Apr 23:48 objcopy
-rwxr-xr-x  1 avg wheel  1479664 16 Apr 23:48 size
-rwxr-xr-x  1 avg wheel  1425008 16 Apr 23:48 strings
lrwxr-xr-x  1 avg wheel      101 16 Apr 23:48 strip -> 
/usr/obj/test/.../releng/14.2/amd64.amd64/tmp/usr/bin/objcopy
-rwxr-xr-x  1 avg wheel  1220848 16 Apr 23:48 sysinit

As you can see, clang binaries are not in the expected place.

Furthermore, the build just fails down the line.


On 11/04/2025 12:29, Andriy Gapon wrote:
> 
> I think that WITHOUT_CLANG + WITH_CLANG_BOOTSTRAP (the latter is the default and 
> doesn't need to be explicit) is supposed to work.
> 
> I think that the combination should result in building clang as a cross-tool for 
> the rest of the build, but not building clang for the target.
> 
> However, it seems that the combination is broken at the moment in that the 
> cross-tool clang is not getting built and the host clang gets used for the build.
> 
> I have recently discovered this issue while trying to build releng/14.2 on a 
> main (aka 15-CURRENT) host with WITHOUT_CLANG in src.conf.  Host and target 
> architectures are the same, amd64.
> 14.2 has clang 18 as a compiler, while main has clang 19.
> The same problem exists for WITHOUT_TOOLCHAIN as well.
> 
> I think that this used to work. Or maybe I was just lucky and the compilers were 
> either the same or sufficiently compatible that the host compiler could compile 
> the branch code.
> 
> I think that
>      .if ${MK_CLANG} != "no"
>      SUBDIR+=        clang
>      .endif
> in usr.bin/clang/Makefile is the reason why the cross-tool clang is not built 
> when WITHOUT_CLANG is set.
> 
> A bit more of info is in the forwarded message and the thread to which it belongs.
> 
> What's curious is that those lines are there since commit 8e1c989abbd1db4 "Don't 
> build and install {llvm,clang,lldb}-tblgen for the target", but I only noticed 
> the problem a few days ago.  And apparenlty nobody else has seen it.
> I'd imagine that the reported configuration is not too exotic.
> So, not sure what and when get broken.
> It could also be something with my build environment...
> 
> -------- Forwarded Message --------
> Subject: Re: c++ error when trying to build releng/14.2 on 'main' host
> Date: Thu, 10 Apr 2025 09:05:47 +0300
> From: Andriy Gapon <avg@FreeBSD.org>
> To: Dimitry Andric <dim@FreeBSD.org>
> CC: toolchain@freebsd.org
> 
> On 09/04/2025 8:28 pm, Andriy Gapon wrote:
>> What's interesting is that I saw this during the build (make with -s option):
>> --------------------------------------------------------------
>>  >>> stage 3: cross tools
>> --------------------------------------------------------------
>> ===> lib/clang (obj,all,install)
>> ===> lib/clang/libllvm (all)
>> ===> lib/clang/libllvm (install)
>> ===> usr.bin/clang (obj,all,install)
>> ===> usr.bin/clang/lld (obj,all,install)
> 
> When I compared this to other builds, I noticed a missing bit:
> ===> usr.bin/clang/clang (all)
> ===> usr.bin/clang/clang (install)
> 
> usr.bin/clang/Makefile has this near the top:
> .if ${MK_CLANG} != "no"
> SUBDIR+=        clang
> .endif
> 
> If I read this right, it means that the actual clang is not built/installed if 
> WITHOUT_CLANG is configured.
> Even in the cross-tools stage!
> 
> I am not sure how it worked before as I do not see any recent changes in that 
> direct area.  Not sure when and what went wrong.  Maybe it's something in one 
> of .mk include files, maybe something in my environment.
> 
> As hack I tried this change and it seems to have helped:
> --- a/Makefile.inc1
> +++ b/Makefile.inc1
> @@ -787,6 +787,7 @@
>   # TOOLS_PREFIX set in BMAKE
>   XMAKE=         ${BMAKE} \
>                  TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
> +               MK_CLANG=${MK_CLANG_BOOTSTRAP} \
>                  MK_LLDB=no \
>                  MK_LLVM_BINUTILS=no \
>                  MK_TESTS=no
> 
> I hope that more knowledgeable people can see what the problem could be, 
> wherever it is.
> 
>> ===> lib/libelftc (obj,all,install)
>> ===> lib/libpe (obj,all,install)
>> ===> usr.bin/elfctl (obj,all,install)
>> ===> usr.bin/elfdump (obj,all,install)
>> ===> usr.bin/objcopy (obj,all,install)
>> ===> usr.bin/nm (obj,all,install)
>> ===> usr.bin/size (obj,all,install)
>> ===> usr.bin/strings (obj,all,install)
>> ===> usr.bin/addr2line (obj,all,install)
>> ===> cddl/lib/libctf (obj,all,install)
>> ===> cddl/lib/libspl (obj,all,install)
>> ===> cddl/usr.bin/ctfconvert (obj,all,install)
>> ===> cddl/usr.bin/ctfmerge (obj,all,install)
>> ===> stand/usb/tools (obj,all,install)
> 
> 


-- 
Andriy Gapon