Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F140120712
D12840.id34569.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
20 KB
Referenced Files
None
Subscribers
None
D12840.id34569.diff
View Options
Index: Makefile.inc1
===================================================================
--- Makefile.inc1
+++ Makefile.inc1
@@ -78,18 +78,11 @@
MK_GCC_BOOTSTRAP= no
.endif
-MAKEOBJDIRPREFIX?= /usr/obj
-.if ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && !defined(CROSS_BUILD_TESTING)
-OBJTREE= ${MAKEOBJDIRPREFIX}
-.else
-OBJTREE= ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}
-.endif
-
# Pull in compiler metadata from buildworld/toolchain if possible to avoid
# running CC from bsd.compiler.mk.
.if make(installworld) || make(install) || make(distributeworld) || \
make(stageworld)
-.-include "${OBJTREE}${.CURDIR}/compiler-metadata.mk"
+.-include "${OBJTOP}/compiler-metadata.mk"
.endif
# Pull in COMPILER_TYPE and COMPILER_FREEBSD_VERSION early.
@@ -450,7 +443,7 @@
.error To cross-build, set TARGET_ARCH.
.endif
.endif
-WORLDTMP= ${OBJTREE}${.CURDIR}/tmp
+WORLDTMP?= ${OBJTOP}/tmp
BPATH= ${CCACHE_WRAPPER_PATH_PFX}${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/bin
XPATH= ${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin
STRICTTMPPATH= ${BPATH}:${XPATH}
@@ -508,7 +501,7 @@
MINIMUM_SUPPORTED_REL?= 9.1
# Common environment for world related stages
-CROSSENV+= MAKEOBJDIRPREFIX=${OBJTREE} \
+CROSSENV+= \
MACHINE_ARCH=${TARGET_ARCH} \
MACHINE=${TARGET} \
CPUTYPE=${TARGET_CPUTYPE}
@@ -543,7 +536,7 @@
${BSARGS}
# build-tools stage
-TMAKE= MAKEOBJDIRPREFIX=${OBJTREE} \
+TMAKE= \
${BMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 \
TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
DESTDIR= \
@@ -670,10 +663,10 @@
META_MODE_BAD_ABI_VERS+= 1200031
.if !defined(OBJDIR_HOST_OSRELDATE)
-.if exists(${OBJTREE}${.CURDIR}/host-osreldate.h)
+.if exists(${OBJTOP}/host-osreldate.h)
OBJDIR_HOST_OSRELDATE!= \
awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
- ${OBJTREE}${.CURDIR}/host-osreldate.h
+ ${OBJTOP}/host-osreldate.h
.elif exists(${WORLDTMP}/usr/include/osreldate.h)
OBJDIR_HOST_OSRELDATE= 0
.endif
@@ -778,36 +771,36 @@
# 20160829 r305012 ptrace
# 20170624 r320278 fstat fstatat fstatfs getdirentries getfsstat statfs
.for f in fstat fstatat fstatfs getdirentries getfsstat ptrace statfs
-.if exists(${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.o)
+.if exists(${OBJTOP}/lib/libc/.depend.${f}.o)
@if egrep -qw '${f}\.[sS]' \
- ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.o; then \
+ ${OBJTOP}/lib/libc/.depend.${f}.o; then \
echo Removing stale dependencies for ${f} syscall wrappers; \
- rm -f ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.* \
- ${LIBCOMPAT:D${LIBCOMPAT_OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.*}; \
+ rm -f ${OBJTOP}/lib/libc/.depend.${f}.* \
+ ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}; \
fi
.endif
.endfor
# 20170607 remove stale dependencies for utimens* wrappers removed in r319663
.for f in futimens utimensat
-.if exists(${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.o)
+.if exists(${OBJTOP}/lib/libc/.depend.${f}.o)
@if egrep -q '/${f}.c' \
- ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.o; then \
+ ${OBJTOP}/lib/libc/.depend.${f}.o; then \
echo Removing stale dependencies for ${f} syscall wrappers; \
- rm -f ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.* \
- ${LIBCOMPAT:D${LIBCOMPAT_OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.*}; \
+ rm -f ${OBJTOP}/lib/libc/.depend.${f}.* \
+ ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}; \
fi
.endif
.endfor
# 20170523 remove stale generated asm files for functions which are no longer
# syscalls after r302092 (pipe) and r318736 (others)
.for f in getdents lstat mknod pipe stat
-.if exists(${OBJTREE}${.CURDIR}/lib/libc/${f}.s) || \
- exists(${OBJTREE}${.CURDIR}/lib/libc/${f}.S)
+.if exists(${OBJTOP}/lib/libc/${f}.s) || \
+ exists(${OBJTOP}/lib/libc/${f}.S)
@echo Removing stale generated ${f} syscall files
- @rm -f ${OBJTREE}${.CURDIR}/lib/libc/${f}.* \
- ${OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.* \
- ${LIBCOMPAT:D${LIBCOMPAT_OBJTREE}${.CURDIR}/lib/libc/${f}.*} \
- ${LIBCOMPAT:D${LIBCOMPAT_OBJTREE}${.CURDIR}/lib/libc/.depend.${f}.*}
+ @rm -f ${OBJTOP}/lib/libc/${f}.* \
+ ${OBJTOP}/lib/libc/.depend.${f}.* \
+ ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/${f}.*} \
+ ${LIBCOMPAT:D${LIBCOMPAT_OBJTOP}/lib/libc/.depend.${f}.*}
.endif
.endfor
@@ -899,7 +892,7 @@
@echo "--------------------------------------------------------------"
@echo ">>> stage 3: cross tools"
@echo "--------------------------------------------------------------"
- @rm -f ${OBJTREE}${.CURDIR}/compiler-metadata.mk
+ @rm -f ${OBJTOP}/compiler-metadata.mk
${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
${_+_}cd ${.CURDIR}; ${XMAKE} kernel-tools
_build-metadata:
@@ -1067,7 +1060,7 @@
(empty(DESTDIR) || ${DESTDIR} == "/") && empty(BYPASS_INSTALLCHECK_SH)
_installcheck_world: __installcheck_sh_check
__installcheck_sh_check: .PHONY
- @if [ "`${OBJTREE}${.CURDIR}/rescue/rescue/rescue sh -c 'echo OK'`" != \
+ @if [ "`${OBJTOP}/rescue/rescue/rescue sh -c 'echo OK'`" != \
OK ]; then \
echo "rescue/sh check failed, installation aborted" >&2; \
false; \
@@ -1329,7 +1322,7 @@
KERNSRCDIR?= ${.CURDIR}/sys
KRNLCONFDIR= ${KERNSRCDIR}/${TARGET}/conf
-KRNLOBJDIR= ${OBJTREE}${KERNSRCDIR}
+KRNLOBJDIR= ${OBJTOP}${KERNSRCDIR:C,^${.CURDIR},,}
KERNCONFDIR?= ${KRNLCONFDIR}
BUILDKERNELS=
@@ -1537,9 +1530,9 @@
${_+_}${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} distributekernel
PORTSDIR?= /usr/ports
-WSTAGEDIR?= ${MAKEOBJDIRPREFIX}${.CURDIR}/${TARGET}.${TARGET_ARCH}/worldstage
-KSTAGEDIR?= ${MAKEOBJDIRPREFIX}${.CURDIR}/${TARGET}.${TARGET_ARCH}/kernelstage
-REPODIR?= ${MAKEOBJDIRPREFIX}${.CURDIR}/repo
+WSTAGEDIR?= ${OBJTOP}/worldstage
+KSTAGEDIR?= ${OBJTOP}/kernelstage
+REPODIR?= ${OBJROOT}repo
PKGSIGNKEY?= # empty
.ORDER: stage-packages create-packages
@@ -1802,10 +1795,10 @@
${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,all,install)"; \
cd ${.CURDIR}/${_tool}; \
if [ -z "${NO_OBJ}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
- ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy includes; \
+ ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP}/legacy includes; \
${MAKE} DIRPRFX=${_tool}/ MK_INCLUDES=no all; \
${MAKE} DIRPRFX=${_tool}/ MK_INCLUDES=no \
- DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
+ DESTDIR=${WORLDTMP}/legacy install
.endfor
#
@@ -1949,7 +1942,7 @@
cd ${.CURDIR}/${_tool}; \
if [ -z "${NO_OBJ}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
${MAKE} DIRPRFX=${_tool}/ all; \
- ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
+ ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP}/legacy install
bootstrap-tools: ${_bt}-${_tool}
.endfor
@@ -2007,9 +2000,9 @@
# kernel-tools: Build kernel-building tools
#
kernel-tools: .PHONY
- mkdir -p ${MAKEOBJDIRPREFIX}/usr
+ mkdir -p ${WORLDTMP}/usr
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
- -p ${MAKEOBJDIRPREFIX}/usr >/dev/null
+ -p ${WORLDTMP}/usr >/dev/null
#
# cross-tools: All the tools needed to build the rest of the system after
@@ -2085,7 +2078,7 @@
cd ${.CURDIR}/${_tool}; \
if [ -z "${NO_OBJ}" ]; then ${MAKE} DIRPRFX=${_tool}/ obj; fi; \
${MAKE} DIRPRFX=${_tool}/ all; \
- ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
+ ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${WORLDTMP} install
.endfor
#
@@ -2096,7 +2089,8 @@
# already built. It then installs the static tools to NXBDESTDIR for Poudriere
# to pickup.
#
-NXBOBJDIR= ${MAKEOBJDIRPREFIX}/nxb/${TARGET}.${TARGET_ARCH}
+NXBOBJROOT= ${OBJROOT}nxb/
+NXBOBJTOP= ${NXBOBJROOT}${TARGET}.${TARGET_ARCH}
NXTP?= /nxb-bin
.if ${NXTP:N/*}
.error NXTP variable should be an absolute path
@@ -2177,11 +2171,11 @@
NXBDIRS+= gnu/usr.bin/binutils
.endif
-NXBMAKEENV+= \
- MAKEOBJDIRPREFIX=${NXBOBJDIR:Q}
+NXBMAKEENV+=
NXBMAKEARGS+= \
- OBJTREE=${NXBOBJDIR:Q} \
+ OBJTOP=${NXBOBJTOP:Q} \
+ OBJROOT=${NXBOBJROOT:Q} \
-DNO_SHARED \
-DNO_CPU_CFLAGS \
-DNO_PIC \
@@ -2755,7 +2749,7 @@
# in this makefile. We don't do a cleandir walk if MK_AUTO_OBJ is yes
# since it is not possible for files to land in the wrong place.
#
-BW_CANONICALOBJDIR:=${OBJTREE}${.CURDIR}
+BW_CANONICALOBJDIR:=${OBJTOP}
cleanworld: .PHONY
.if exists(${BW_CANONICALOBJDIR}/)
-rm -rf ${BW_CANONICALOBJDIR}/*
@@ -2787,7 +2781,7 @@
.error XDTP variable should be an absolute path
.endif
-CDBENV=MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/${XDDIR} \
+CDBENV=MAKEOBJDIRPREFIX=${OBJTOP}/${XDDIR} \
INSTALL="sh ${.CURDIR}/tools/install.sh"
CDENV= ${CDBENV} \
TOOLS_PREFIX=${XDTP}
@@ -2812,7 +2806,7 @@
CPP="${CPP} ${CD2CFLAGS}" \
MACHINE=${TARGET} MACHINE_ARCH=${TARGET_ARCH}
-CDTMP= ${MAKEOBJDIRPREFIX}/${XDDIR}/${.CURDIR}/tmp
+CDTMP= ${OBJTOP}/${XDDIR}/tmp
CDMAKE=${CDENV} PATH=${CDTMP}/usr/bin:${PATH} ${MAKE} ${NOFUN}
CD2MAKE=${CD2ENV} PATH=${CDTMP}/usr/bin:${XDDESTDIR}/usr/bin:${PATH} ${MAKE} ${NOFUN}
.if ${MK_META_MODE} != "no"
Index: Makefile.libcompat
===================================================================
--- Makefile.libcompat
+++ Makefile.libcompat
@@ -70,7 +70,7 @@
# Generic code for each type.
# Set defaults based on type.
libcompat= ${LIBCOMPAT:tl}
-_LIBCOMPAT_MAKEVARS= _OBJTREE TMP CPUFLAGS CFLAGS CXXFLAGS WMAKEENV \
+_LIBCOMPAT_MAKEVARS= _OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS WMAKEENV \
WMAKEFLAGS WMAKE
.for _var in ${_LIBCOMPAT_MAKEVARS}
.if !empty(LIB${LIBCOMPAT}${_var})
@@ -79,8 +79,8 @@
.endfor
# Shared flags
-LIBCOMPAT_OBJTREE?= ${OBJTREE}${.CURDIR}/obj-lib${libcompat}
-LIBCOMPATTMP?= ${LIBCOMPAT_OBJTREE}/tmp
+LIBCOMPAT_OBJTOP?= ${OBJTOP}/obj-lib${libcompat}
+LIBCOMPATTMP?= ${LIBCOMPAT_OBJTOP}/tmp
LIBCOMPATCFLAGS+= ${LIBCOMPATCPUFLAGS} \
-L${LIBCOMPATTMP}/usr/lib${libcompat} \
@@ -107,7 +107,8 @@
.endif
# Yes, the flags are redundant.
-LIBCOMPATWMAKEENV+= MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTREE} \
+LIBCOMPATWMAKEENV+= \
+ MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTOP} \
INSTALL="sh ${.CURDIR}/tools/install.sh" \
PATH=${TMPPATH} \
SYSROOT=${LIBCOMPATTMP} \
@@ -183,7 +184,8 @@
${_+_}cd ${.CURDIR}/${_dir}; \
WORLDTMP=${WORLDTMP} \
MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" \
- MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTREE} ${MAKE} SSP_CFLAGS= DESTDIR= \
+ MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTOP} \
+ ${MAKE} SSP_CFLAGS= DESTDIR= \
DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
build-tools
.endfor
Index: UPDATING
===================================================================
--- UPDATING
+++ UPDATING
@@ -51,6 +51,17 @@
****************************** SPECIAL WARNING: ******************************
+20171028:
+ The default MAKEOBJDIR has changed from /usr/obj/<srcdir> for native
+ builds, and /usr/obj/<arch>/<srcdir> for cross-builds, to a unified
+ /usr/obj/<srcdir>/<arch>. This behavior can be changed to the old
+ format by setting WITHOUT_UNIFIED_OBJDIR=yes in /etc/src-env.conf,
+ the environment, or with -DWITHOUT_UNIFIED_OBJDIR when building.
+ The UNIFIED_OBJDIR option is intended to be a temporary feature;
+ please migrate to the new format for any tools by looking up the
+ OBJDIR used by 'make -V .OBJDIR' means rather than hardcoding
+ paths.
+
20171028:
The native-xtools target no longer installs the files by default to the
OBJDIR. Use the native-xtools-install target with a DESTDIR to install
Index: release/arm64/RPI3.conf
===================================================================
--- release/arm64/RPI3.conf
+++ release/arm64/RPI3.conf
@@ -42,13 +42,11 @@
"${DTB_REPO}/overlays/${_OL}?raw=true"
done
- _OBJDIR="$(chroot ${CHROOTDIR} make -C ${WORLDDIR} -V .OBJDIR)"
- _OBJDIR="$(realpath ${_OBJDIR})"
- if [ -d "${CHROOTDIR}/${_OBJDIR%%/usr/src}/${EMBEDDED_TARGET}.${EMBEDDED_TARGET_ARCH}" ]; then
- BOOTFILES="/${_OBJDIR%%/usr/src}/${EMBEDDED_TARGET}.${EMBEDDED_TARGET_ARCH}/usr/src/sys/boot"
- else
- BOOTFILES="/${_OBJDIR}/sys/boot"
- fi
+ BOOTFILES="$(chroot ${CHROOTDIR} \
+ env TARGET=${EMBEDDED_TARGET} TARGET_ARCH=${EMBEDDED_TARGET_ARCH} \
+ WITH_UNIFIED_OBJDIR=yes \
+ make -C ${WORLDDIR}/sys/boot -V .OBJDIR)"
+ BOOTFILES="$(realpath ${BOOTFILES})"
chroot ${CHROOTDIR} mkdir -p ${FATMOUNT}/EFI/BOOT
chroot ${CHROOTDIR} cp -p ${BOOTFILES}/efi/boot1/boot1.efi \
Index: release/tools/vmimage.subr
===================================================================
--- release/tools/vmimage.subr
+++ release/tools/vmimage.subr
@@ -14,13 +14,10 @@
SWAPOPT="-p freebsd-swap/swapfs::${SWAPSIZE}"
fi
- _OBJDIR="$(make -C ${WORLDDIR} -V .OBJDIR)"
- _OBJDIR="$(realpath ${_OBJDIR})"
- if [ -d "${_OBJDIR%%/usr/src}/${TARGET}.${TARGET_ARCH}" ]; then
- BOOTFILES="/${_OBJDIR%%/usr/src}/${TARGET}.${TARGET_ARCH}/usr/src/sys/boot"
- else
- BOOTFILES="/${_OBJDIR}/sys/boot"
- fi
+ BOOTFILES="$(env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
+ WITH_UNIFIED_OBJDIR=yes \
+ make -C ${WORLDDIR}/sys/boot -V .OBJDIR)"
+ BOOTFILES="$(realpath ${BOOTFILES})"
case "${TARGET}:${TARGET_ARCH}" in
amd64:amd64 | i386:i386)
Index: share/man/man7/build.7
===================================================================
--- share/man/man7/build.7
+++ share/man/man7/build.7
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 11, 2017
+.Dd October 26, 2017
.Dt BUILD 7
.Os
.Sh NAME
@@ -82,18 +82,7 @@
if variable
.Va MAKEOBJDIRPREFIX
is not set.
-For a given source directory, its canonical object directory
-would be
-.Pa ${MAKEOBJDIRPREFIX}${.CURDIR}
-if
-.Xr make 1
-variable
-.Va MAKEOBJDIRPREFIX
-is set, or
-.Pa /usr/obj${.CURDIR}
-if this variable is not set.
-Cross-builds set the object directory as described in the
-documentation for the
+The canonical object directory is described in the documentation for the
.Cm buildworld
target below.
.Pp
@@ -201,10 +190,18 @@
.Pa MAKEOBJDIRPREFIX
.Xr make 1
variable.
-The actual build location prefix used is
+The actual build location prefix used
+depends on the
+.Va WITH_UNIFIED_OBJDIR
+option from
+.Xr src.conf 5 .
+If enabled it is
+.Pa ${MAKEOBJDIRPREFIX}${.CURDIR}/${TARGET}.${TARGET_ARCH}
+for all builds.
+If disabled it is
.Pa ${MAKEOBJDIRPREFIX}${.CURDIR}
for native builds, and
-.Pa ${MAKEOBJDIRPREFIX}/${TARGET}${.CURDIR}
+.Pa ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}${.CURDIR}
for cross builds and native builds with variable
.Va CROSS_BUILD_TESTING
set.
@@ -460,8 +457,12 @@
Defaults to
.Pa /usr/obj
if not defined.
-This variable should only be set in the environment and not via
+This variable should only be set in the environment or
+.Pa /etc/src-env.conf
+and not via
.Pa /etc/make.conf
+or
+.Pa /etc/src.conf
or the command line.
.It Va NO_WERROR
If defined, compiler warnings will not cause the build to halt,
Index: share/mk/bsd.obj.mk
===================================================================
--- share/mk/bsd.obj.mk
+++ share/mk/bsd.obj.mk
@@ -75,7 +75,7 @@
done
.endif
.endif # !empty(SRCS:M*/*) || !empty(DPSRCS:M*/*)
-.elif defined(MAKEOBJDIRPREFIX)
+.elif !empty(MAKEOBJDIRPREFIX)
CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
.elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != ""
CANONICALOBJDIR:=${MAKEOBJDIR}
Index: share/mk/local.meta.sys.mk
===================================================================
--- share/mk/local.meta.sys.mk
+++ share/mk/local.meta.sys.mk
@@ -8,7 +8,6 @@
MK_INSTALL_AS_USER= yes
# Default OBJROOT/MAKEOBJDIR handled in local.sys.obj.mk
-.include <src.sys.obj.mk>
.if !defined(HOST_TARGET)
# we need HOST_TARGET etc below.
Index: share/mk/src.sys.env.mk
===================================================================
--- share/mk/src.sys.env.mk
+++ share/mk/src.sys.env.mk
@@ -43,3 +43,5 @@
MAKESYSPATH:= ${.PARSEDIR:tA}
.export MAKESYSPATH
.endif
+
+.include <src.sys.obj.mk>
Index: share/mk/src.sys.obj.mk
===================================================================
--- share/mk/src.sys.obj.mk
+++ share/mk/src.sys.obj.mk
@@ -1,9 +1,38 @@
# $FreeBSD$
+#
+# Early setup of MAKEOBJDIR
+#
+# Default format is: /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]bin/sh
+# MAKEOBJDIRPREFIX is /usr/obj
+# OBJROOT is /usr/obj/usr/src/
+# OBJTOP is /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]
+# MAKEOBJDIR is /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]bin/sh
+#
+# If MK_UNIFIED_OBJDIR is no then OBJROOT will always match OBJTOP.
+#
+# If .MAKE.LEVEL == 0 then the TARGET.TARGET_ARCH is potentially added on.
+# If .MAKE.LEVEL > 0 and MAKEOBJDIRPREFIX is set then it will not get
+# TARGET.TARGET_ARCH added in as it assumes that MAKEOBJDIRPREFIX is
+# nested in the existing OBJTOP with TARGET.TARGET_ARCH in it.
+#
+_default_makeobjdirprefix?= /usr/obj
_default_makeobjdir= $${.CURDIR:S,^$${SRCTOP},$${OBJTOP},}
-.if empty(OBJROOT) || ${.MAKE.LEVEL} == 0
-.if defined(MAKEOBJDIRPREFIX) && !empty(MAKEOBJDIRPREFIX)
+.include <bsd.mkopt.mk>
+
+.if ${MK_UNIFIED_OBJDIR} == "no"
+# Fall back to simpler/older behavior
+MAKEOBJDIRPREFIX?= ${_default_makeobjdirprefix}
+.if !(defined(TARGET) && defined(TARGET_ARCH) && \
+ ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && \
+ !defined(CROSS_BUILD_TESTING))
+MAKEOBJDIRPREFIX:= ${MAKEOBJDIRPREFIX}${TARGET:D/${TARGET}.${TARGET_ARCH}}
+.endif
+.endif # ${MK_UNIFIED_OBJDIR} == "no"
+
+.if ${.MAKE.LEVEL} == 0 || empty(OBJROOT)
+.if !empty(MAKEOBJDIRPREFIX)
# put things approximately where they want
OBJROOT:= ${MAKEOBJDIRPREFIX}${SRCTOP}/
MAKEOBJDIRPREFIX=
@@ -17,24 +46,58 @@
# Expand for our own use
MAKEOBJDIR:= ${MAKEOBJDIR}
.endif
+# XXX: Undocumented SB feature
.if !empty(SB)
SB_OBJROOT?= ${SB}/obj/
# this is what we use below
OBJROOT?= ${SB_OBJROOT}
.endif
-OBJROOT?= /usr/obj${SRCTOP}/
+OBJROOT?= ${_default_makeobjdirprefix}${SRCTOP}/
.if ${OBJROOT:M*/} != ""
OBJROOT:= ${OBJROOT:H:tA}/
.else
OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T}
.endif
+# Must export since OBJDIR will dynamically be based on it
.export OBJROOT SRCTOP
.endif
-.if 0
+.if ${MK_UNIFIED_OBJDIR} == "yes"
+OBJTOP:= ${OBJROOT}${TARGET:D${TARGET}.${TARGET_ARCH}:U${MACHINE}.${MACHINE_ARCH}}
+.else
+# TARGET.TARGET_ARCH handled in OBJROOT already.
+OBJTOP:= ${OBJROOT:H}
+.endif # ${MK_UNIFIED_OBJDIR} == "yes"
+
+# Wait to validate MAKEOBJDIR until OBJTOP is set.
.if defined(MAKEOBJDIR)
.if ${MAKEOBJDIR:M/*} == ""
.error Cannot use MAKEOBJDIR=${MAKEOBJDIR}${.newline}Unset MAKEOBJDIR to get default: MAKEOBJDIR='${_default_makeobjdir}'
.endif
.endif
+
+# Fixup OBJROOT/OBJTOP if using MAKEOBJDIRPREFIX but leave it alone
+# for DIRDEPS_BUILD which really wants to know the absolute top at
+# all times. This intenionally comes after adding TARGET.TARGET_ARCH
+# so that is truncated away for nested objdirs. This logic also
+# will not trigger if the OBJROOT block above unsets MAKEOBJDIRPREFIX.
+.if !empty(MAKEOBJDIRPREFIX) && ${MK_DIRDEPS_BUILD} == "no"
+OBJTOP:= ${MAKEOBJDIRPREFIX}${SRCTOP}
+OBJROOT:= ${OBJTOP}/
+.endif
+
+# Assign this directory as .OBJDIR if possible
+.if ${MK_AUTO_OBJ} == "no"
+# The expected OBJDIR already exists, set it as .OBJDIR.
+.if !empty(MAKEOBJDIRPREFIX) && exists(${MAKEOBJDIRPREFIX}${.CURDIR})
+.OBJDIR: ${MAKEOBJDIRPREFIX}${.CURDIR}
+.elif exists(${MAKEOBJDIR})
+.OBJDIR: ${MAKEOBJDIR}
+# Special case to work around bmake bug. If the top-level .OBJDIR does not yet
+# exist and MAKEOBJDIR is passed into environment and yield a blank value,
+# bmake will incorrectly set .OBJDIR=${SRCTOP}/ rather than the expected
+# ${SRCTOP} to match ${.CURDIR}.
+.elif ${.CURDIR} == ${SRCTOP}
+.OBJDIR: ${.CURDIR}
.endif
+.endif # ${MK_AUTO_OBJ} == "no"
Index: share/mk/sys.mk
===================================================================
--- share/mk/sys.mk
+++ share/mk/sys.mk
@@ -17,6 +17,8 @@
MACHINE_CPUARCH=${MACHINE_ARCH:${__TO_CPUARCH}}
.endif
+__DEFAULT_YES_OPTIONS+= \
+ UNIFIED_OBJDIR
# Some options we need now
__DEFAULT_NO_OPTIONS= \
Index: tools/build/options/WITHOUT_UNIFIED_OBJDIR
===================================================================
--- /dev/null
+++ tools/build/options/WITHOUT_UNIFIED_OBJDIR
@@ -0,0 +1,10 @@
+.\" $FreeBSD$
+Set to use the newer style unified object directory for
+.Xr build 7
+targets.
+For native-builds the format of
+.Pa ${MAKEOBJDIRPREFIX}/${.CURDIR}
+is used,
+while for cross-builds
+.Pa ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}/${.CURDIR}
+is used.
Index: tools/build/options/WITH_UNIFIED_OBJDIR
===================================================================
--- /dev/null
+++ tools/build/options/WITH_UNIFIED_OBJDIR
@@ -0,0 +1,7 @@
+.\" $FreeBSD$
+Set to use the newer style unified object directory format for
+.Xr build 7
+targets.
+For both cross-builds and native-builds the format of
+.Pa ${MAKEOBJDIRPREFIX}/${.CURDIR}/${TARGET}.${TARGET_ARCH}
+is used.
Index: tools/build/options/makeman
===================================================================
--- tools/build/options/makeman
+++ tools/build/options/makeman
@@ -217,12 +217,10 @@
Some examples that may only be set in this file are
.Va WITH_DIRDEPS_BUILD ,
and
-.Va WITH_META_MODE
-as they are environment-only variables.
-Note that
+.Va WITH_META_MODE ,
+and
.Va MAKEOBJDIRPREFIX
-may be set here only when using
-.Va WITH_DIRDEPS_BUILD .
+as they are environment-only variables.
.Pp
The values of variables are ignored regardless of their setting;
even if they would be set to
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 21, 12:38 PM (5 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27113087
Default Alt Text
D12840.id34569.diff (20 KB)
Attached To
Mode
D12840: Add option UNIFIED_OBJDIR, on by default, which moves the default build OBJDIR.
Attached
Detach File
Event Timeline
Log In to Comment