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