Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 02 Jan 2026 20:52:06 +0000
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 908ca4f6af8a - stable/14 - src.conf: Add WITH_LLVM_LINK_STATIC_LIBRARIES build knob
Message-ID:  <69582ff6.a075.491e9700@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/14 has been updated by dim:

URL: https://cgit.FreeBSD.org/src/commit/?id=908ca4f6af8a95d6c6ae65caed4371f96afb6409

commit 908ca4f6af8a95d6c6ae65caed4371f96afb6409
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2025-06-18 10:06:25 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2026-01-02 20:44:10 +0000

    src.conf: Add WITH_LLVM_LINK_STATIC_LIBRARIES build knob
    
    In commit 2e47f35be5dc libllvm, libclang and liblldb were converted into
    private shared libraries. This allowed clang, lld, lldb, and other llvm
    tools to be linked against these shared libraries, which makes them
    smaller and avoids duplication.
    
    However, this also comes at the cost of some performance, since the
    dynamic libraries are quite large, and contain lots of long symbols
    (mangled C++ identifiers).
    
    Add a WITH_LLVM_LINK_STATIC_LIBRARIES build knob that can be used to go
    back to the previous behavior: libllvm, libclang and liblldb are built
    as internal static libraries, i.e. only available during buildworld, and
    fully linked into the various executables such as clang, lld, etc.
    
    PR:             287447
    Reviewed by:    emaste
    MFC after:      1 week
    Differential Revision: https://reviews.freebsd.org/D50956
    
    (cherry picked from commit 8d5a11cd0137d3ad70f6b06e063ea91a776d510a)
---
 lib/clang/libclang/Makefile                         |  9 ++++-----
 lib/clang/liblldb/Makefile                          | 14 ++++++++++++--
 lib/clang/libllvm/Makefile                          | 10 ++++------
 share/man/man5/src.conf.5                           |  9 ++++++++-
 share/mk/src.opts.mk                                |  1 +
 tools/build/mk/OptionalObsoleteFiles.inc            | 11 ++++++++---
 tools/build/options/WITH_LLVM_LINK_STATIC_LIBRARIES |  6 ++++++
 usr.bin/clang/Makefile.inc                          |  2 +-
 usr.bin/clang/clang.prog.mk                         |  2 +-
 usr.bin/clang/lld/Makefile                          |  2 +-
 usr.bin/clang/lldb-server/Makefile                  |  5 +++++
 usr.bin/clang/lldb/Makefile                         |  5 +++++
 usr.bin/clang/llvm.prog.mk                          |  5 +++++
 13 files changed, 61 insertions(+), 20 deletions(-)

diff --git a/lib/clang/libclang/Makefile b/lib/clang/libclang/Makefile
index 9b9e0cbadcd7..56f6fd374fe5 100644
--- a/lib/clang/libclang/Makefile
+++ b/lib/clang/libclang/Makefile
@@ -1,9 +1,8 @@
-
-.include <bsd.init.mk>
+.include <src.opts.mk>
 .include "../clang.pre.mk"
 
-.if defined(TOOLS_PREFIX)
-# Build static library during cross-tools stage
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+# Build static library during cross-tools stage, or when explicitly requested.
 LIB=		clang
 INTERNALLIB=
 .else
@@ -873,7 +872,7 @@ SRCS+=		${SRCS_ALL:O}
 
 LIBDEPS+=	llvm
 
-.if defined(TOOLS_PREFIX)
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
 LIBPRIV=
 LIBEXT=		a
 .else
diff --git a/lib/clang/liblldb/Makefile b/lib/clang/liblldb/Makefile
index 408ebc440686..aa9e90b2f6f2 100644
--- a/lib/clang/liblldb/Makefile
+++ b/lib/clang/liblldb/Makefile
@@ -1,11 +1,16 @@
-
-.include <bsd.init.mk>
+.include <src.opts.mk>
 .include "../lldb.pre.mk"
 
+.if ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+# Build static library when explicitly requested.
+LIB=		lldb
+INTERNALLIB=
+.else
 PACKAGE=	lldb
 SHLIB_CXX=	lldb
 SHLIB_MAJOR=	19
 PRIVATELIB=
+.endif
 
 SHARED_CXXFLAGS+=	-UPIC # To avoid compile errors
 
@@ -754,8 +759,13 @@ SRCS+=		Version/Version.cpp
 LIBDEPS+=	clang
 LIBDEPS+=	llvm
 
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+LIBPRIV=
+LIBEXT=		a
+.else
 LIBPRIV=	private
 LIBEXT=		so
+.endif
 
 .for lib in ${LIBDEPS}
 DPADD+=		${OBJTOP}/lib/clang/lib${lib}/lib${LIBPRIV}${lib}.${LIBEXT}
diff --git a/lib/clang/libllvm/Makefile b/lib/clang/libllvm/Makefile
index 835da5545e81..05128550827a 100644
--- a/lib/clang/libllvm/Makefile
+++ b/lib/clang/libllvm/Makefile
@@ -1,9 +1,8 @@
-
-.include <bsd.init.mk>
+.include <src.opts.mk>
 .include "../llvm.pre.mk"
 
-.if defined(TOOLS_PREFIX)
-# Build static library during cross-tools stage
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+# Build static library during cross-tools stage, or when explicitly requested.
 LIB=		llvm
 INTERNALLIB=
 .else
@@ -15,6 +14,7 @@ PRIVATELIB=
 # Work around "relocation R_PPC_GOT16 out of range" errors
 PICFLAG=        -fPIC
 .endif
+CFLAGS+=	-DLLVM_BUILD_LLVM_DYLIB
 .endif
 
 SHARED_CXXFLAGS+=	-UPIC # To avoid compile errors
@@ -49,8 +49,6 @@ CFLAGS+=	-DBLAKE3_NO_AVX512 -DBLAKE3_NO_AVX2 -DBLAKE3_NO_SSE41 \
 CFLAGS+=	-DBLAKE3_USE_NEON=0
 .endif
 
-CFLAGS+=	-DLLVM_BUILD_LLVM_DYLIB
-
 SRCDIR=		llvm/lib
 
 # Explanation of different SRCS variants below:
diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index f7e523ea70bb..ad1ba48ffbab 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -1,5 +1,5 @@
 .\" DO NOT EDIT-- this file is @generated by tools/build/options/makeman.
-.Dd October 22, 2025
+.Dd December 21, 2025
 .Dt SRC.CONF 5
 .Os
 .Sh NAME
@@ -971,6 +971,13 @@ Install ELF Tool Chain's cxxfilt as c++filt, instead of LLVM's llvm-cxxfilt.
 .It Va WITH_LLVM_FULL_DEBUGINFO
 Generate full debug information for LLVM libraries and tools, which uses
 more disk space and build resources, but allows for easier debugging.
+.It Va WITH_LLVM_LINK_STATIC_LIBRARIES
+Link LLVM libraries (libllvm, libclang, liblldb) statically into each of
+the binaries that use them.
+
+This means that binaries linked against these libraries, such as clang,
+ld.lld and lldb will be much larger and position dependent, but will
+start more quickly.
 .It Va WITHOUT_LLVM_TARGET_AARCH64
 Do not build LLVM target support for AArch64.
 The
diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk
index 0c8eb737fa05..6395efc7469f 100644
--- a/share/mk/src.opts.mk
+++ b/share/mk/src.opts.mk
@@ -213,6 +213,7 @@ __DEFAULT_NO_OPTIONS = \
     LLVM_ASSERTIONS \
     LLVM_BINUTILS \
     LLVM_FULL_DEBUGINFO \
+    LLVM_LINK_STATIC_LIBRARIES \
     OFED_EXTRA \
     OPENLDAP \
     RPCBIND_WARMSTART_SUPPORT \
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 42514dc61b8c..1fed797b8f24 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -877,12 +877,14 @@ OLD_FILES+=usr/share/man/man4/ccd.4.gz
 OLD_FILES+=usr/share/man/man8/ccdconfig.8.gz
 .endif
 
-.if ${MK_CLANG} == no && ${MK_CLANG_FORMAT} == no && ${MK_LLDB} == no
+.if ${MK_CLANG} == no && ${MK_CLANG_FORMAT} == no && ${MK_LLDB} == no && \
+    ${MK_LLVM_LINK_STATIC_LIBRARIES} == no
 OLD_LIBS+=usr/lib/libprivateclang.so.19
 .endif
 
 .if ${MK_CLANG_EXTRAS} == no && ${MK_CLANG} == no && ${MK_LLDB} == no && \
-    ${MK_LLD} == no && ${MK_LLVM_BINUTILS} == no && ${MK_LLVM_COV} == no
+    ${MK_LLD} == no && ${MK_LLVM_BINUTILS} == no && ${MK_LLVM_COV} == no && \
+    ${MK_LLVM_LINK_STATIC_LIBRARIES} == no
 OLD_LIBS+=usr/lib/libprivatellvm.so.19
 .endif
 
@@ -3704,10 +3706,13 @@ OLD_LIBS+=${DEBUG_LIB${LIBCOMPAT}_LIBS}
 OLD_FILES+=usr/bin/ld.lld
 .endif
 
+.if ${MK_LLDB} == no && ${MK_LLVM_LINK_STATIC_LIBRARIES} == no
+OLD_LIBS+=usr/lib/libprivatelldb.so.19
+.endif
+
 .if ${MK_LLDB} == no
 OLD_FILES+=usr/bin/lldb
 OLD_FILES+=usr/bin/lldb-server
-OLD_LIBS+=usr/lib/libprivatelldb.so.19
 OLD_FILES+=usr/share/man/man1/lldb-server.1.gz
 OLD_FILES+=usr/share/man/man1/lldb.1.gz
 .endif
diff --git a/tools/build/options/WITH_LLVM_LINK_STATIC_LIBRARIES b/tools/build/options/WITH_LLVM_LINK_STATIC_LIBRARIES
new file mode 100644
index 000000000000..7860ee862b1d
--- /dev/null
+++ b/tools/build/options/WITH_LLVM_LINK_STATIC_LIBRARIES
@@ -0,0 +1,6 @@
+Link LLVM libraries (libllvm, libclang, liblldb) statically into each of
+the binaries that use them.
+
+This means that binaries linked against these libraries, such as clang,
+ld.lld and lldb will be much larger and position dependent, but will
+start more quickly.
diff --git a/usr.bin/clang/Makefile.inc b/usr.bin/clang/Makefile.inc
index 68e749ef131d..169958a9ea32 100644
--- a/usr.bin/clang/Makefile.inc
+++ b/usr.bin/clang/Makefile.inc
@@ -1,7 +1,7 @@
 
 .include <src.opts.mk>
 
-.if defined(TOOLS_PREFIX)
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
 MK_PIE:=	no	# Explicit libXXX.a references
 .endif
 
diff --git a/usr.bin/clang/clang.prog.mk b/usr.bin/clang/clang.prog.mk
index 36c601bcbe36..cf4e5e0ce47a 100644
--- a/usr.bin/clang/clang.prog.mk
+++ b/usr.bin/clang/clang.prog.mk
@@ -18,7 +18,7 @@ LIBADD+=	z
 LIBADD+=	zstd
 .endif
 
-.if defined(TOOLS_PREFIX)
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
 LIBPRIV=
 LIBEXT=		a
 .else
diff --git a/usr.bin/clang/lld/Makefile b/usr.bin/clang/lld/Makefile
index 6403835b10b6..240061610a58 100644
--- a/usr.bin/clang/lld/Makefile
+++ b/usr.bin/clang/lld/Makefile
@@ -82,7 +82,7 @@ SRCS+=		tools/lld/lld.cpp
 
 LIBDEPS+=	llvm
 
-.if defined(TOOLS_PREFIX)
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
 LIBPRIV=
 LIBEXT=		a
 .else
diff --git a/usr.bin/clang/lldb-server/Makefile b/usr.bin/clang/lldb-server/Makefile
index e51923545956..b6df20a07d74 100644
--- a/usr.bin/clang/lldb-server/Makefile
+++ b/usr.bin/clang/lldb-server/Makefile
@@ -23,8 +23,13 @@ LIBDEPS+=	lldb
 LIBDEPS+=	clang
 LIBDEPS+=	llvm
 
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+LIBPRIV=
+LIBEXT=		a
+.else
 LIBPRIV=	private
 LIBEXT=		so
+.endif
 
 .for lib in ${LIBDEPS}
 DPADD+=		${OBJTOP}/lib/clang/lib${lib}/lib${LIBPRIV}${lib}.${LIBEXT}
diff --git a/usr.bin/clang/lldb/Makefile b/usr.bin/clang/lldb/Makefile
index b7668c03e6e5..bab8e332a152 100644
--- a/usr.bin/clang/lldb/Makefile
+++ b/usr.bin/clang/lldb/Makefile
@@ -16,8 +16,13 @@ LIBDEPS+=	lldb
 LIBDEPS+=	clang
 LIBDEPS+=	llvm
 
+.if defined(TOOLS_PREFIX) || ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+LIBPRIV=
+LIBEXT=		a
+.else
 LIBPRIV=	private
 LIBEXT=		so
+.endif
 
 .for lib in ${LIBDEPS}
 DPADD+=		${OBJTOP}/lib/clang/lib${lib}/lib${LIBPRIV}${lib}.${LIBEXT}
diff --git a/usr.bin/clang/llvm.prog.mk b/usr.bin/clang/llvm.prog.mk
index f702082e31bd..bded98007542 100644
--- a/usr.bin/clang/llvm.prog.mk
+++ b/usr.bin/clang/llvm.prog.mk
@@ -14,8 +14,13 @@ LIBPRIV=
 LIBEXT=		a
 .else
 LIBDEPS+=	llvm
+.if ${MK_LLVM_LINK_STATIC_LIBRARIES} == "yes"
+LIBPRIV=
+LIBEXT=		a
+.else
 LIBPRIV=	private
 LIBEXT=		so
+.endif
 LIBADD+=	z
 LIBADD+=	zstd
 .endif


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69582ff6.a075.491e9700>