Index: Makefile.inc1 =================================================================== --- Makefile.inc1 +++ Makefile.inc1 @@ -1608,6 +1608,12 @@ KRNLOBJDIR= ${OBJTOP}${KERNSRCDIR:C,^${.CURDIR},,} KERNCONFDIR?= ${KRNLCONFDIR} +.if ${MK_REPRODUCIBLE_BUILD} != "no" +REPRODUCIBLE_KRNLOBJDIR= ${REPRODUCIBLE_OBJTOP}${KERNSRCDIR:C,^${.CURDIR},,} +.else +REPRODUCIBLE_KRNLOBJDIR= ${KRNLOBJDIR} +.endif + BUILDKERNELS= INSTALLKERNEL= .if defined(NO_INSTALLKERNEL) @@ -1690,7 +1696,8 @@ @echo "--------------------------------------------------------------" @echo ">>> stage 2.2: rebuilding the object tree" @echo "--------------------------------------------------------------" - ${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj + ${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj \ + REPRODUCIBLE_KOBJDIR=${REPRODUCIBLE_KRNLOBJDIR}/${_kernel} .endif @echo @echo "--------------------------------------------------------------" @@ -1701,7 +1708,8 @@ @echo "--------------------------------------------------------------" @echo ">>> stage 3.1: building everything" @echo "--------------------------------------------------------------" - ${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ + ${_+_}cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ \ + REPRODUCIBLE_KOBJDIR=${REPRODUCIBLE_KRNLOBJDIR}/${_kernel} @echo "--------------------------------------------------------------" @echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`" @echo "--------------------------------------------------------------" Index: sys/conf/kern.post.mk =================================================================== --- sys/conf/kern.post.mk +++ sys/conf/kern.post.mk @@ -346,6 +346,18 @@ .depend: .PRECIOUS ${SRCS} _MAP_DEBUG_PREFIX= yes +.if ${MK_REPRODUCIBLE_BUILD} != "no" +_sysroot=${CC:M--sysroot=*:[-1]:S,--sysroot=,,} +_map_sysdir=${REPRODUCIBLE_SYSDIR} +CFLAGS+= -ffile-prefix-map=${_sysroot}/=/ +CFLAGS+= -ffile-prefix-map=${SYSDIR}=${_map_sysdir} +.if defined(REPRODUCIBLE_KOBJDIR) && \ + "${REPRODUCIBLE_KOBJDIR}" != "${.OBJDIR}" +CFLAGS+= -ffile-prefix-map=${.OBJDIR}=${REPRODUCIBLE_KOBJDIR} +.endif +.else +_map_sysdir=${SYSDIR} +.endif _ILINKS= machine .if ${MACHINE} != ${MACHINE_CPUARCH} && ${MACHINE} != "arm64" @@ -363,9 +375,9 @@ .endif .if defined(_MAP_DEBUG_PREFIX) .if ${_link} == "machine" -CFLAGS+= -fdebug-prefix-map=./machine=${SYSDIR}/${MACHINE}/include +CFLAGS+= -ffile-prefix-map=./machine=${_map_sysdir}/${MACHINE}/include .else -CFLAGS+= -fdebug-prefix-map=./${_link}=${SYSDIR}/${_link}/include +CFLAGS+= -ffile-prefix-map=./${_link}=${_map_sysdir}/${_link}/include .endif .endif .endfor Index: sys/conf/kern.pre.mk =================================================================== --- sys/conf/kern.pre.mk +++ sys/conf/kern.pre.mk @@ -26,6 +26,8 @@ # The kernel build always expects .OBJDIR=.CURDIR. .OBJDIR: ${.CURDIR} +# This gets fed by Makefile.inc1 iff we're doing a reproducible build. +REPRODUCIBLE_KOBJDIR?= ${.CURDIR} .if defined(NO_OBJWALK) || ${MK_AUTO_OBJ} == "yes" NO_OBJWALK= t @@ -345,6 +347,9 @@ # them. MKMODULESENV+= MAKEOBJDIRPREFIX=${.OBJDIR}/modules KMODDIR=${KODIR} +.if ${MK_REPRODUCIBLE_BUILD} != "no" +MKMODULESENV+= REPRODUCIBLE_MODOBJDIR=${REPRODUCIBLE_KOBJDIR}/modules +.endif MKMODULESENV+= MACHINE_CPUARCH=${MACHINE_CPUARCH} MKMODULESENV+= MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} MKMODULESENV+= MODULES_EXTRA="${MODULES_EXTRA}" WITHOUT_MODULES="${WITHOUT_MODULES}" Index: sys/conf/kmod.mk =================================================================== --- sys/conf/kmod.mk +++ sys/conf/kmod.mk @@ -272,6 +272,18 @@ .endif _MAP_DEBUG_PREFIX= yes +.if ${MK_REPRODUCIBLE_BUILD} != "no" +_sysroot=${CC:M--sysroot=*:[-1]:S,--sysroot=,,} +_map_sysdir=${REPRODUCIBLE_SYSDIR} +CFLAGS+= -ffile-prefix-map=${_sysroot}/=/ +CFLAGS+= -ffile-prefix-map=${SYSDIR}=${_map_sysdir} +.if defined(REPRODUCIBLE_MODOBJDIR) && \ + "${REPRODUCIBLE_MODOBJDIR}${REPRODUCIBLE_SYSDIR}" != "${MAKEOBJDIRPREFIX}${SYSDIR}" +CFLAGS+= -ffile-prefix-map=${MAKEOBJDIRPREFIX}${SYSDIR}=${REPRODUCIBLE_MODOBJDIR}${REPRODUCIBLE_SYSDIR} +.endif +.else +_map_sysdir=${SYSDIR} +.endif _ILINKS=machine .if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" @@ -293,9 +305,9 @@ .endif .if defined(_MAP_DEBUG_PREFIX) .if ${_link} == "machine" -CFLAGS+= -fdebug-prefix-map=./machine=${SYSDIR}/${MACHINE}/include +CFLAGS+= -ffile-prefix-map=./machine=${_map_sysdir}/${MACHINE}/include .else -CFLAGS+= -fdebug-prefix-map=./${_link}=${SYSDIR}/${_link}/include +CFLAGS+= -ffile-prefix-map=./${_link}=${_map_sysdir}/${_link}/include .endif .endif .endfor