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
This commit is contained in:
Mark Johnston
2025-08-21 14:06:34 +00:00
parent 3a239e46c4
commit 4f81c42fbd
2 changed files with 23 additions and 0 deletions
+22
View File
@@ -13,6 +13,28 @@ CFLAGS+= -DNDEBUG
MK_WERROR= no MK_WERROR= no
.endif .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) .if defined(DEBUG_FLAGS)
CFLAGS+=${DEBUG_FLAGS} CFLAGS+=${DEBUG_FLAGS}
CXXFLAGS+=${DEBUG_FLAGS} CXXFLAGS+=${DEBUG_FLAGS}
+1
View File
@@ -78,6 +78,7 @@ __DEFAULT_NO_OPTIONS = \
CCACHE_BUILD \ CCACHE_BUILD \
CTF \ CTF \
INSTALL_AS_USER \ INSTALL_AS_USER \
REPRODUCIBLE_BUILD \
RETPOLINE \ RETPOLINE \
RUN_TESTS \ RUN_TESTS \
STALE_STAGED \ STALE_STAGED \