git: 4f81c42fbd76 - main - share/mk: Substitute reproducible prefixes in dwarf info
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 21 Aug 2025 15:58:18 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=4f81c42fbd76e25c9fe696fa08296b79c55fbf09
commit 4f81c42fbd76e25c9fe696fa08296b79c55fbf09
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-08-21 14:06:34 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-08-21 15:56:23 +0000
share/mk: Substitute reproducible prefixes in dwarf info
Ensure that worlds/releases built from different source paths are
reproducible. Currently they are not since src and obj paths are
embedded in DWARF info. There are some uses of __FILE__ in the src tree
as well, and they are similarly handled by this change.
Use /usr/src and /usr/obj as the canonical src and obj paths when
WITH_REPRODUCIBLE_BUILD is defined. Define a DEBUG_PREFIX variable
which is used to ask the compiler to substitute paths in output files
using -ffile-prefix-map.
Compat builds (i.e., lib32) complicate things since they override
OBJROOT to point to obj-${compat} but still refer to headers from the
native objroot (e.g., llvm headers).
MFC after: 1 month
Sponsored by: The FreeBSD Foundation
Sponsored by: Klara, Inc.
Differential Revision: https://reviews.freebsd.org/D50951
---
share/mk/bsd.debug.mk | 22 ++++++++++++++++++++++
share/mk/bsd.opts.mk | 1 +
2 files changed, 23 insertions(+)
diff --git a/share/mk/bsd.debug.mk b/share/mk/bsd.debug.mk
index fc80bc103061..cf2fb4356aef 100644
--- a/share/mk/bsd.debug.mk
+++ b/share/mk/bsd.debug.mk
@@ -13,6 +13,28 @@ CFLAGS+= -DNDEBUG
MK_WERROR= no
.endif
+# If reproducible build mode is enabled, map the root of the source
+# directory to /usr/src and the root of the object directory to
+# /usr/obj.
+.if ${MK_REPRODUCIBLE_BUILD} != "no" && !defined(DEBUG_PREFIX)
+.if defined(SRCTOP)
+DEBUG_PREFIX+= ${SRCTOP:S,/$,,}=/usr/src
+.endif
+.if defined(OBJROOT)
+# Strip off compat subdirectories, e.g., /usr/obj/usr/src/amd64.amd64/obj-lib32
+# becomes /usr/obj/usr/src/amd64.amd64, since object files compiled there might
+# refer to something outside the root.
+DEBUG_PREFIX+= ${OBJROOT:S,/$,,:C,/obj-[^/]*$,,}=/usr/obj
+.endif
+.endif
+
+.if defined(DEBUG_PREFIX)
+.for map in ${DEBUG_PREFIX}
+CFLAGS+= -ffile-prefix-map=${map}
+CXXFLAGS+= -ffile-prefix-map=${map}
+.endfor
+.endif
+
.if defined(DEBUG_FLAGS)
CFLAGS+=${DEBUG_FLAGS}
CXXFLAGS+=${DEBUG_FLAGS}
diff --git a/share/mk/bsd.opts.mk b/share/mk/bsd.opts.mk
index 85247d733a14..439924d0d596 100644
--- a/share/mk/bsd.opts.mk
+++ b/share/mk/bsd.opts.mk
@@ -78,6 +78,7 @@ __DEFAULT_NO_OPTIONS = \
CCACHE_BUILD \
CTF \
INSTALL_AS_USER \
+ REPRODUCIBLE_BUILD \
RETPOLINE \
RUN_TESTS \
STALE_STAGED \