3 # Early setup of MAKEOBJDIR
5 # Default format is: /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]bin/sh
6 # MAKEOBJDIRPREFIX is /usr/obj
7 # OBJROOT is /usr/obj/usr/src/
8 # OBJTOP is /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]
9 # MAKEOBJDIR is /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]bin/sh
11 # MAKEOBJDIRPREFIX will override the default pattern above and internally
12 # set MAKEOBJDIR. If OBJROOT is set then MAKEOBJDIRPREFIX is rooted inside
15 # If MK_UNIFIED_OBJDIR is no then OBJROOT will always match OBJTOP.
17 # If .MAKE.LEVEL == 0 then the TARGET.TARGET_ARCH is potentially added on.
18 # If .MAKE.LEVEL > 0 and MAKEOBJDIRPREFIX is set then it will not get
19 # TARGET.TARGET_ARCH added in as it assumes that MAKEOBJDIRPREFIX is
20 # nested in the existing OBJTOP with TARGET.TARGET_ARCH in it.
23 _default_makeobjdirprefix?= /usr/obj
24 _default_makeobjdir= $${.CURDIR:S,^$${SRCTOP},$${OBJTOP},}
26 .include <bsd.mkopt.mk>
28 .if ${.MAKE.LEVEL} == 0 || empty(OBJROOT)
29 .if ${MK_UNIFIED_OBJDIR} == "no"
30 # Fall back to historical behavior.
31 # We always want to set a default MAKEOBJDIRPREFIX...
32 MAKEOBJDIRPREFIX?= ${_default_makeobjdirprefix}
33 # but don't enforce TARGET.TARGET_ARCH unless we're at the top-level directory.
34 .if ${.CURDIR} == ${SRCTOP} && \
35 !(defined(TARGET) && defined(TARGET_ARCH) && \
36 ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && \
37 !defined(CROSS_BUILD_TESTING))
38 MAKEOBJDIRPREFIX:= ${MAKEOBJDIRPREFIX}${TARGET:D/${TARGET}.${TARGET_ARCH}}
40 .endif # ${MK_UNIFIED_OBJDIR} == "no"
42 .if !empty(MAKEOBJDIRPREFIX)
43 # put things approximately where they want
44 OBJROOT:= ${MAKEOBJDIRPREFIX}${SRCTOP}/
46 # export but do not track
47 .export-env MAKEOBJDIRPREFIX
51 MAKEOBJDIR= ${_default_makeobjdir}
52 # export but do not track
53 .export-env MAKEOBJDIR
54 # Expand for our own use
55 MAKEOBJDIR:= ${MAKEOBJDIR}
57 # SB documented at http://www.crufty.net/sjg/docs/sb-tools.htm
59 SB_OBJROOT?= ${SB}/obj/
60 # this is what we use below
61 OBJROOT?= ${SB_OBJROOT}
63 OBJROOT?= ${_default_makeobjdirprefix}${SRCTOP}/
64 .if ${OBJROOT:M*/} != ""
65 OBJROOT:= ${OBJROOT:H:tA}/
67 OBJROOT:= ${OBJROOT:H:tA}/${OBJROOT:T}
69 # Must export since OBJDIR will dynamically be based on it
70 .export OBJROOT SRCTOP
73 .if ${MK_UNIFIED_OBJDIR} == "yes"
74 OBJTOP:= ${OBJROOT}${TARGET:D${TARGET}.${TARGET_ARCH}:U${MACHINE}.${MACHINE_ARCH}}
76 # TARGET.TARGET_ARCH handled in OBJROOT already.
78 .endif # ${MK_UNIFIED_OBJDIR} == "yes"
80 # Fixup OBJROOT/OBJTOP if using MAKEOBJDIRPREFIX but leave it alone
81 # for DIRDEPS_BUILD which really wants to know the absolute top at
82 # all times. This intenionally comes after adding TARGET.TARGET_ARCH
83 # so that is truncated away for nested objdirs. This logic also
84 # will not trigger if the OBJROOT block above unsets MAKEOBJDIRPREFIX.
85 .if !empty(MAKEOBJDIRPREFIX) && ${MK_DIRDEPS_BUILD} == "no"
86 OBJTOP:= ${MAKEOBJDIRPREFIX}${SRCTOP}
90 # Wait to validate MAKEOBJDIR until OBJTOP is set.
91 .if defined(MAKEOBJDIR)
92 .if ${MAKEOBJDIR:M/*} == ""
93 .error Cannot use MAKEOBJDIR=${MAKEOBJDIR}${.newline}Unset MAKEOBJDIR to get default: MAKEOBJDIR='${_default_makeobjdir}'
97 # __objdir is the expected .OBJDIR we want to use and that auto.obj.mk will
99 .if !empty(MAKEOBJDIRPREFIX)
100 __objdir:= ${MAKEOBJDIRPREFIX}${.CURDIR}
101 .elif !empty(MAKEOBJDIR)
102 __objdir:= ${MAKEOBJDIR}
105 # Try to enable MK_AUTO_OBJ by default if we can write to the __objdir. Only
106 # do this if AUTO_OBJ is not disabled by the user, not cleaning, and this is
107 # the first make ran.
108 .if ${.MAKE.LEVEL} == 0 && \
109 ${MK_AUTO_OBJ} == "no" && empty(.MAKEOVERRIDES:MMK_AUTO_OBJ) && \
110 !defined(WITHOUT_AUTO_OBJ) && !make(showconfig) && !make(print-dir) && \
111 !defined(NO_OBJ) && \
112 (${.TARGETS} == "" || ${.TARGETS:Nclean*:N*clean:Ndestroy*} != "")
113 # Find the last existing directory component and check if we can write to it.
114 # If the last component is a symlink then recurse on the new path.
117 [ -w "$${1}" ] && return 0; \
122 while [ $$\# -gt 0 ]; do \
125 if [ ! -d "$${dir}$${d}/" ]; then \
126 if [ -L "$${dir}$${d}" ]; then \
127 dir="$$(readlink "$${dir}$${d}")/"; \
128 for d in "$${@}"; do \
129 dir="$${dir}$${d}/"; \
132 DirIsCreatable "$${dir%/}" || ret=$$?; \
138 dir="$${dir}$${d}/"; \
143 if DirIsCreatable "$${1}"; then \
150 __objdir_writable!= \
151 ${CheckAutoObj}; CheckAutoObj "${__objdir}" || echo no
153 __objdir_writable?= no
154 # Export the decision to sub-makes.
155 MK_AUTO_OBJ:= ${__objdir_writable}
157 .elif make(showconfig)
158 # Need to export for showconfig internally running make -dg1. It is enabled
159 # in sys.mk by default.
161 .endif # ${MK_AUTO_OBJ} == "no" && ...
163 # Assign this directory as .OBJDIR if possible.
165 # The expected OBJDIR already exists, set it as .OBJDIR.
166 .if !empty(__objdir) && exists(${__objdir})
168 # Special case to work around bmake bug. If the top-level .OBJDIR does not yet
169 # exist and MAKEOBJDIR is passed into environment and yield a blank value,
170 # bmake will incorrectly set .OBJDIR=${SRCTOP}/ rather than the expected
171 # ${SRCTOP} to match ${.CURDIR}.
172 .elif ${MAKE_VERSION} <= 20170720 && \
173 ${.CURDIR} == ${SRCTOP} && ${.OBJDIR} == ${SRCTOP}/
176 # The OBJDIR we wanted does not yet exist, ensure we default to safe .CURDIR
177 # in case make started with a bogus MAKEOBJDIR, that expanded before OBJTOP
178 # was set, that happened to match some unexpected directory. Either
179 # auto.obj.mk or bsd.obj.mk will create the directory and fix .OBJDIR later.