xref: /freebsd/share/mk/src.sys.obj.mk (revision a40d73475b1d716142dd32c29a16d5f9fc418f7d)
1#
2# Early setup of MAKEOBJDIR
3#
4# Default format is: /usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]bin/sh
5#  MAKEOBJDIRPREFIX is	/usr/obj
6#  OBJROOT is		/usr/obj/usr/src/
7#  OBJTOP is		/usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]
8#  MAKEOBJDIR is	/usr/obj/usr/src/[${TARGET}.${TARGET_ARCH}/]bin/sh
9#
10#  MAKEOBJDIRPREFIX will override the default pattern above and internally
11#  set MAKEOBJDIR.  If OBJROOT is set then MAKEOBJDIRPREFIX is rooted inside
12#  of there.
13#
14#  If MK_UNIFIED_OBJDIR is no then OBJROOT will always match OBJTOP.
15#
16#  If .MAKE.LEVEL == 0 then the TARGET.TARGET_ARCH is potentially added on.
17#  If .MAKE.LEVEL >  0 and MAKEOBJDIRPREFIX is set then it will not get
18#  TARGET.TARGET_ARCH added in as it assumes that MAKEOBJDIRPREFIX is
19#  nested in the existing OBJTOP with TARGET.TARGET_ARCH in it.
20#
21#  The expected OBJDIR is stored in __objdir for auto.obj.mk to use.
22#
23#  AUTO_OBJ is opportunistically enabled if the computed .OBJDIR is writable
24#  by the current user.  Some top-level targets disable this behavior in
25#  Makefile.sys.inc.
26#
27
28_default_makeobjdirprefix?=	/usr/obj
29_default_makeobjdir=	$${.CURDIR:S,^$${SRCTOP},$${OBJTOP},}
30
31.include <bsd.mkopt.mk>
32
33.if ${.MAKE.LEVEL} == 0 || empty(OBJROOT)
34.if ${MK_UNIFIED_OBJDIR} == "no" && ${MK_DIRDEPS_BUILD} == "no"
35# Fall back to historical behavior.
36# We always want to set a default MAKEOBJDIRPREFIX...
37MAKEOBJDIRPREFIX?=	${_default_makeobjdirprefix}
38# but don't enforce TARGET.TARGET_ARCH unless we're at the top-level directory.
39.if ${.CURDIR} == ${SRCTOP} && \
40    !(defined(TARGET) && defined(TARGET_ARCH) && \
41    ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && \
42    !defined(CROSS_BUILD_TESTING))
43MAKEOBJDIRPREFIX:=	${MAKEOBJDIRPREFIX}${TARGET:D/${TARGET}.${TARGET_ARCH}}
44.endif
45.endif	# ${MK_UNIFIED_OBJDIR} == "no"
46
47.if !empty(MAKEOBJDIRPREFIX)
48# put things approximately where they want
49OBJROOT:=	${MAKEOBJDIRPREFIX}${SRCTOP}/
50MAKEOBJDIRPREFIX=
51# export but do not track
52.export-env MAKEOBJDIRPREFIX
53.endif
54.if empty(MAKEOBJDIR)
55# OBJTOP set below
56MAKEOBJDIR=	${_default_makeobjdir}
57# export but do not track
58.export-env MAKEOBJDIR
59# Expand for our own use
60MAKEOBJDIR:=	${MAKEOBJDIR}
61.endif
62# SB documented at http://www.crufty.net/sjg/docs/sb-tools.htm
63.if !empty(SB)
64SB_OBJROOT?=	${SB}/obj/
65# this is what we use below
66OBJROOT?=	${SB_OBJROOT}
67.endif
68OBJROOT?=	${_default_makeobjdirprefix}${SRCTOP}/
69.if ${OBJROOT:M*/} != ""
70OBJROOT:=	${OBJROOT:H:tA}/
71.else
72OBJROOT:=	${OBJROOT:H:tA}/${OBJROOT:T}
73.endif
74# Must export since OBJDIR will dynamically be based on it
75.export OBJROOT SRCTOP
76# if we didn't get SB_OBJROOT from env,
77# it is handy to set it now, so we can remember it
78.if empty(SB_OBJROOT)
79SB_OBJROOT:= ${OBJROOT}
80.export SB_OBJROOT
81.endif
82.endif
83
84.if ${MK_DIRDEPS_BUILD} == "no"
85.if empty(OBJTOP)
86# SRCTOP == OBJROOT only happens with clever MAKEOBJDIRPREFIX=/.  Don't
87# append TARGET.TARGET_ARCH for that case since the user wants to build
88# in the source tree.
89.if ${MK_UNIFIED_OBJDIR} == "yes" && ${SRCTOP} != ${OBJROOT:tA}
90.if defined(TARGET) && defined(TARGET_ARCH)
91OBJTOP:=	${OBJROOT}${TARGET}.${TARGET_ARCH}
92.elif defined(TARGET) && ${.CURDIR} == ${SRCTOP}
93# Not enough information, just use basic OBJDIR.  This can happen with some
94# 'make universe' targets or if TARGET is not being used as expected.
95OBJTOP:=	${OBJROOT:H}
96.else
97OBJTOP:=	${OBJROOT}${MACHINE}.${MACHINE_ARCH}
98.endif
99.else
100# TARGET.TARGET_ARCH handled in OBJROOT already.
101OBJTOP:=	${OBJROOT:H}
102.endif	# ${MK_UNIFIED_OBJDIR} == "yes"
103.endif	# empty(OBJTOP)
104
105# Fixup OBJROOT/OBJTOP if using MAKEOBJDIRPREFIX.
106# This intenionally comes after adding TARGET.TARGET_ARCH so that is truncated
107# away for nested objdirs.  This logic also will not trigger if the OBJROOT
108# block above unsets MAKEOBJDIRPREFIX.
109.if !empty(MAKEOBJDIRPREFIX)
110OBJTOP:=	${MAKEOBJDIRPREFIX}${SRCTOP}
111OBJROOT:=	${OBJTOP}/
112.endif
113
114# Wait to validate MAKEOBJDIR until OBJTOP is set.
115.if defined(MAKEOBJDIR)
116.if ${MAKEOBJDIR:M/*} == ""
117.error Cannot use MAKEOBJDIR=${MAKEOBJDIR}${.newline}Unset MAKEOBJDIR to get default:  MAKEOBJDIR='${_default_makeobjdir}'
118.endif
119.endif
120
121# __objdir is the expected .OBJDIR we want to use and that auto.obj.mk will
122# try to create.
123.if !empty(MAKEOBJDIRPREFIX)
124.if ${.CURDIR:M${MAKEOBJDIRPREFIX}/*} != ""
125# we are already in obj tree!
126__objdir=	${.CURDIR}
127.else
128__objdir:=	${MAKEOBJDIRPREFIX}${.CURDIR}
129.endif
130.elif !empty(MAKEOBJDIR)
131__objdir:=	${MAKEOBJDIR}
132.endif
133
134# Try to enable MK_AUTO_OBJ by default if we can write to the __objdir.  Only
135# do this if AUTO_OBJ is not disabled by the user, and this is the first make
136# ran.
137.if ${.MAKE.LEVEL} == 0 && \
138    ${MK_AUTO_OBJ} == "no" && empty(.MAKEOVERRIDES:MMK_AUTO_OBJ) && \
139    !defined(WITHOUT_AUTO_OBJ) && !make(showconfig) && !make(print-dir) && \
140    !make(test-system-*) && \
141    !defined(NO_OBJ) && \
142    empty(RELDIR:Msys/*/compile/*)
143# Find the last existing directory component and check if we can write to it.
144# If the last component is a symlink then recurse on the new path.
145CheckAutoObj= \
146DirIsCreatable() { \
147	if [ -w "$${1}" ]; then \
148		[ -d "$${1}" ] || return 1; \
149		return 0; \
150	fi; \
151	d="$${1}"; \
152	IFS=/; \
153	set -- $${d}; \
154	unset dir; \
155	while [ $$\# -gt 0 ]; do \
156		d="$${1}"; \
157		shift; \
158		if [ ! -d "$${dir}$${d}/" ]; then \
159			if [ -L "$${dir}$${d}" ]; then \
160				dir="$$(readlink "$${dir}$${d}")/"; \
161				for d in "$${@}"; do \
162					dir="$${dir}$${d}/"; \
163				done; \
164				ret=0; \
165				DirIsCreatable "$${dir%/}" || ret=$$?; \
166				return $${ret}; \
167			elif [ -e "/$${dir}$${d}" ]; then \
168				return 1; \
169			else \
170				break; \
171			fi; \
172		fi; \
173		dir="$${dir}$${d}/"; \
174	done; \
175	[ -w "$${dir}" ] && [ -d "$${dir}" ] && return 0; \
176	return 1; \
177}; \
178CheckAutoObj() { \
179	if DirIsCreatable "$${1}"; then \
180		echo yes; \
181	else \
182		echo no; \
183	fi; \
184}
185.if !empty(__objdir)
186.if ${.CURDIR} == ${__objdir} || \
187    (exists(${__objdir}) && ${.TARGETS:M*install*} == ${.TARGETS})
188__objdir_writable?= yes
189.elif empty(__objdir_writable)
190__objdir_writable!= \
191	${CheckAutoObj}; CheckAutoObj "${__objdir}" || echo no
192.endif
193.endif
194__objdir_writable?= no
195# Export the decision to sub-makes.
196MK_AUTO_OBJ:=	${__objdir_writable}
197.export MK_AUTO_OBJ
198.elif make(showconfig)
199# Need to export for showconfig internally running make -dg1.  It is enabled
200# in sys.mk by default.
201.export MK_AUTO_OBJ
202.endif	# ${MK_AUTO_OBJ} == "no" && ...
203
204# Assign this directory as .OBJDIR if possible.
205#
206# The expected OBJDIR already exists, set it as .OBJDIR.
207.if !empty(__objdir) && exists(${__objdir})
208.OBJDIR: ${__objdir}
209.else
210# The OBJDIR we wanted does not yet exist, ensure we default to safe .CURDIR
211# in case make started with a bogus MAKEOBJDIR, that expanded before OBJTOP
212# was set, that happened to match some unexpected directory.  Either
213# auto.obj.mk or bsd.obj.mk will create the directory and fix .OBJDIR later.
214.OBJDIR: ${.CURDIR}
215.endif
216
217# Ensure .OBJDIR=.CURDIR cases have a proper OBJTOP and .OBJDIR
218.if defined(NO_OBJ) || ${__objdir_writable:Uunknown} == "no" || \
219    ${__objdir} == ${.CURDIR}
220OBJTOP=		${SRCTOP}
221OBJROOT=	${SRCTOP}/
222# Compare only to avoid an unneeded chdir(2), :tA purposely left out.
223.if ${.OBJDIR} != ${.CURDIR}
224.OBJDIR:	${.CURDIR}
225.endif
226.endif	# defined(NO_OBJ)
227
228HOST_OBJTOP?=	${OBJROOT}${HOST_TARGET}
229
230.endif	# ${MK_DIRDEPS_BUILD} == "no"
231