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