Makefile.inc1 revision 243322
1169689Skan#
2169689Skan# $FreeBSD: head/Makefile.inc1 243322 2012-11-20 03:21:26Z marcel $
3169689Skan#
4169689Skan# Make command line options:
5169689Skan#	-DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
6169689Skan#	-DNO_CLEAN do not clean at all
7169689Skan#	-DNO_SHARE do not go into share subdir
8169689Skan#	-DKERNFAST define NO_KERNEL{CONFIG,CLEAN,DEPEND,OBJ}
9169689Skan#	-DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
10169689Skan#	-DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
11169689Skan#	-DNO_KERNELDEPEND do not run ${MAKE} depend in ${MAKE} buildkernel
12169689Skan#	-DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel
13169689Skan#	-DNO_PORTSUPDATE do not update ports in ${MAKE} update
14169689Skan#	-DNO_DOCUPDATE do not update doc in ${MAKE} update
15169689Skan#	-DNO_WWWUPDATE do not update www in ${MAKE} update
16169689Skan#	-DNO_CTF do not run the DTrace CTF conversion tools on built objects
17169689Skan#	LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
18169689Skan#	LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target
19169689Skan#	LOCAL_MTREE="list of mtree files" to process to allow local directories
20169689Skan#	    to be created before files are installed
21169689Skan#	LOCAL_TOOL_DIRS="list of dirs" to add additional dirs to the build-tools
22169689Skan#	    list
23169689Skan#	TARGET="machine" to crossbuild world for a different machine type
24169689Skan#	TARGET_ARCH= may be required when a TARGET supports multiple endians
25169689Skan#	BUILDENV_SHELL= shell to launch for the buildenv target (def:/bin/sh)
26169689Skan
27169689Skan#
28169689Skan# The intended user-driven targets are:
29169689Skan# buildworld  - rebuild *everything*, including glue to help do upgrades
30169689Skan# installworld- install everything built by "buildworld"
31169689Skan# doxygen     - build API documentation of the kernel
32169689Skan# update      - convenient way to update your source tree (eg: cvsup/cvs)
33169689Skan#
34169689Skan# Standard targets (not defined here) are documented in the makefiles in
35169689Skan# /usr/share/mk.  These include:
36169689Skan#		obj depend all install clean cleandepend cleanobj
37169689Skan
38169689Skan# You are supposed to define both of these when calling Makefile.inc1
39169689Skan# directly.  However, some old scripts don't.  Cope for the moment, but
40169689Skan# issue a new warning for a transition period.
41169689Skan.if defined(TARGET) && !defined(TARGET_ARCH)
42169689Skan.warning "You must pass both TARGET and TARGET_ARCH to Makefile.inc1.  Setting TARGET_ARCH=${TARGET}."
43169689SkanTARGET_ARCH=${TARGET}
44169689Skan.endif
45169689Skan.if !defined(TARGET) || !defined(TARGET_ARCH)
46169689Skan.error "Both TARGET and TARGET_ARCH must be defined."
47169689Skan.endif
48169689Skan
49169689Skan.include <bsd.own.mk>
50169689Skan.include <bsd.arch.inc.mk>
51169689Skan.include <bsd.compiler.mk>
52169689Skan
53169689Skan# We must do share/info early so that installation of info `dir'
54169689Skan# entries works correctly.  Do it first since it is less likely to
55169689Skan# grow dependencies on include and lib than vice versa.
56169689Skan#
57169689Skan# We must do lib/ and libexec/ before bin/, because if installworld
58169689Skan# installs a new /bin/sh, the 'make' command will *immediately*
59169689Skan# use that new version.  And the new (dynamically-linked) /bin/sh
60169689Skan# will expect to find appropriate libraries in /lib and /libexec.
61169689Skan#
62169689SkanSUBDIR=	share/info lib libexec
63169689SkanSUBDIR+=bin
64169689Skan.if ${MK_GAMES} != "no"
65169689SkanSUBDIR+=games
66169689Skan.endif
67169689Skan.if ${MK_CDDL} != "no"
68169689SkanSUBDIR+=cddl
69169689Skan.endif
70169689SkanSUBDIR+=gnu include
71169689Skan.if ${MK_KERBEROS} != "no"
72169689SkanSUBDIR+=kerberos5
73169689Skan.endif
74169689Skan.if ${MK_RESCUE} != "no"
75169689SkanSUBDIR+=rescue
76169689Skan.endif
77169689SkanSUBDIR+=sbin
78169689Skan.if ${MK_CRYPT} != "no"
79169689SkanSUBDIR+=secure
80169689Skan.endif
81169689Skan.if !defined(NO_SHARE)
82169689SkanSUBDIR+=share
83169689Skan.endif
84169689SkanSUBDIR+=sys usr.bin usr.sbin
85169689Skan.if ${MK_OFED} != "no"
86169689SkanSUBDIR+=contrib/ofed
87169689Skan.endif
88169689Skan#
89169689Skan# We must do etc/ last for install/distribute to work.
90169689Skan#
91169689SkanSUBDIR+=etc
92169689Skan
93169689Skan# These are last, since it is nice to at least get the base system
94169689Skan# rebuilt before you do them.
95169689Skan.for _DIR in ${LOCAL_LIB_DIRS} ${LOCAL_DIRS}
96169689Skan.if exists(${.CURDIR}/${_DIR}/Makefile)
97169689SkanSUBDIR+= ${_DIR}
98169689Skan.endif
99169689Skan.endfor
100169689Skan
101169689Skan.if defined(SUBDIR_OVERRIDE)
102169689SkanSUBDIR=		${SUBDIR_OVERRIDE}
103169689Skan.endif
104169689Skan
105169689Skan.if defined(NOCLEAN)
106169689SkanNO_CLEAN=	${NOCLEAN}
107169689Skan.endif
108169689Skan.if defined(NO_CLEANDIR)
109169689SkanCLEANDIR=	clean cleandepend
110169689Skan.else
111169689SkanCLEANDIR=	cleandir
112169689Skan.endif
113169689Skan
114169689SkanLOCAL_TOOL_DIRS?=
115169689Skan
116169689SkanBUILDENV_SHELL?=/bin/sh
117169689Skan
118169689SkanCVS?=		cvs
119169689SkanCVSFLAGS?=	-A -P -d -I!
120169689SkanSVN?=		svn
121169689SkanSVNFLAGS?=	-r HEAD
122169689SkanSUP?=		/usr/bin/csup
123169689SkanSUPFLAGS?=	-g -L 2
124169689Skan.if defined(SUPHOST)
125169689SkanSUPFLAGS+=	-h ${SUPHOST}
126169689Skan.endif
127169689Skan
128169689SkanMAKEOBJDIRPREFIX?=	/usr/obj
129169689Skan.if !defined(OSRELDATE)
130169689Skan.if exists(/usr/include/osreldate.h)
131169689SkanOSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
132169689Skan		/usr/include/osreldate.h
133169689Skan.else
134169689SkanOSRELDATE=	0
135169689Skan.endif
136169689Skan.endif
137169689Skan
138169689Skan.if !defined(VERSION)
139169689SkanVERSION!=	uname -srp
140169689SkanVERSION+=	${OSRELDATE}
141169689Skan.endif
142169689Skan
143169689SkanKNOWN_ARCHES?=	amd64 arm armeb/arm armv6/arm armv6eb/arm i386 i386/pc98 ia64 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc sparc64
144169689Skan.if ${TARGET} == ${TARGET_ARCH}
145169689Skan_t=		${TARGET}
146169689Skan.else
147169689Skan_t=		${TARGET_ARCH}/${TARGET}
148169689Skan.endif
149169689Skan.for _t in ${_t}
150169689Skan.if empty(KNOWN_ARCHES:M${_t})
151169689Skan.error Unknown target ${TARGET_ARCH}:${TARGET}.
152169689Skan.endif
153169689Skan.endfor
154169689Skan
155169689Skan.if ${TARGET} == ${MACHINE}
156169689SkanTARGET_CPUTYPE?=${CPUTYPE}
157169689Skan.else
158169689SkanTARGET_CPUTYPE?=
159169689Skan.endif
160169689Skan
161169689Skan.if !empty(TARGET_CPUTYPE)
162169689Skan_TARGET_CPUTYPE=${TARGET_CPUTYPE}
163169689Skan.else
164169689Skan_TARGET_CPUTYPE=dummy
165169689Skan.endif
166169689Skan_CPUTYPE!=	MAKEFLAGS= CPUTYPE=${_TARGET_CPUTYPE} ${MAKE} \
167169689Skan		-f /dev/null -m ${.CURDIR}/share/mk -V CPUTYPE
168169689Skan.if ${_CPUTYPE} != ${_TARGET_CPUTYPE}
169169689Skan.error CPUTYPE global should be set with ?=.
170169689Skan.endif
171169689Skan.if make(buildworld)
172169689SkanBUILD_ARCH!=	uname -p
173169689Skan.if ${MACHINE_ARCH} != ${BUILD_ARCH}
174169689Skan.error To cross-build, set TARGET_ARCH.
175169689Skan.endif
176169689Skan.endif
177169689Skan.if ${MACHINE} == ${TARGET} && ${MACHINE_ARCH} == ${TARGET_ARCH} && !defined(CROSS_BUILD_TESTING)
178169689SkanOBJTREE=	${MAKEOBJDIRPREFIX}
179169689Skan.else
180169689SkanOBJTREE=	${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}
181169689Skan.endif
182169689SkanWORLDTMP=	${OBJTREE}${.CURDIR}/tmp
183169689Skan# /usr/games added for fortune which depend on strfile
184169689SkanBPATH=		${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/usr/games
185169689SkanXPATH=		${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin:${WORLDTMP}/usr/games
186169689SkanSTRICTTMPPATH=	${BPATH}:${XPATH}
187169689SkanTMPPATH=	${STRICTTMPPATH}:${PATH}
188169689Skan
189169689Skan#
190169689Skan# Avoid running mktemp(1) unless actually needed.
191169689Skan# It may not be functional, e.g., due to new ABI
192169689Skan# when in the middle of installing over this system.
193169689Skan#
194169689Skan.if make(distributeworld) || make(installworld)
195169689SkanINSTALLTMP!=	/usr/bin/mktemp -d -u -t install
196169689Skan.endif
197169689Skan
198169689Skan#
199169689Skan# Building a world goes through the following stages
200169689Skan#
201169689Skan# 1. legacy stage [BMAKE]
202169689Skan#	This stage is responsible for creating compatibility
203169689Skan#	shims that are needed by the bootstrap-tools,
204169689Skan#	build-tools and cross-tools stages.
205169689Skan# 1. bootstrap-tools stage [BMAKE]
206169689Skan#	This stage is responsible for creating programs that
207169689Skan#	are needed for backward compatibility reasons. They
208169689Skan#	are not built as cross-tools.
209169689Skan# 2. build-tools stage [TMAKE]
210169689Skan#	This stage is responsible for creating the object
211169689Skan#	tree and building any tools that are needed during
212169689Skan#	the build process.
213169689Skan# 3. cross-tools stage [XMAKE]
214169689Skan#	This stage is responsible for creating any tools that
215169689Skan#	are needed for cross-builds. A cross-compiler is one
216169689Skan#	of them.
217169689Skan# 4. world stage [WMAKE]
218169689Skan#	This stage actually builds the world.
219169689Skan# 5. install stage (optional) [IMAKE]
220169689Skan#	This stage installs a previously built world.
221169689Skan#
222169689Skan
223169689SkanBOOTSTRAPPING?=	0
224169689Skan
225169689Skan# Common environment for world related stages
226169689SkanCROSSENV=	MAKEOBJDIRPREFIX=${OBJTREE} \
227169689Skan		MACHINE_ARCH=${TARGET_ARCH} \
228169689Skan		MACHINE=${TARGET} \
229169689Skan		CPUTYPE=${TARGET_CPUTYPE}
230169689Skan.if ${MK_GROFF} != "no"
231169689SkanCROSSENV+=	GROFF_BIN_PATH=${WORLDTMP}/legacy/usr/bin \
232169689Skan		GROFF_FONT_PATH=${WORLDTMP}/legacy/usr/share/groff_font \
233169689Skan		GROFF_TMAC_PATH=${WORLDTMP}/legacy/usr/share/tmac
234169689Skan.endif
235169689Skan
236169689Skan# bootstrap-tools stage
237169689SkanBMAKEENV=	INSTALL="sh ${.CURDIR}/tools/install.sh" \
238169689Skan		PATH=${BPATH}:${PATH} \
239169689Skan		WORLDTMP=${WORLDTMP} \
240169689Skan		VERSION="${VERSION}" \
241169689Skan		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" \
242169689Skan		COMPILER_TYPE=${COMPILER_TYPE}
243169689SkanBMAKE=		MAKEOBJDIRPREFIX=${WORLDTMP} \
244169689Skan		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
245169689Skan		DESTDIR= \
246169689Skan		BOOTSTRAPPING=${OSRELDATE} \
247169689Skan		SSP_CFLAGS= \
248169689Skan		-DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT -DWITHOUT_MAN \
249169689Skan		-DNO_PIC -DNO_PROFILE -DNO_SHARED \
250169689Skan		-DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF -DEARLY_BUILD
251169689Skan
252169689Skan# build-tools stage
253169689SkanTMAKE=		MAKEOBJDIRPREFIX=${OBJTREE} \
254169689Skan		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
255169689Skan		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
256169689Skan		DESTDIR= \
257169689Skan		BOOTSTRAPPING=${OSRELDATE} \
258169689Skan		SSP_CFLAGS= \
259169689Skan		-DNO_LINT \
260169689Skan		-DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF -DEARLY_BUILD
261169689Skan
262169689Skan# cross-tools stage
263169689SkanXMAKE=		TOOLS_PREFIX=${WORLDTMP} ${BMAKE} \
264169689Skan		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
265169689Skan		-DWITHOUT_GDB
266169689Skan
267169689Skan# world stage
268169689SkanWMAKEENV=	${CROSSENV} \
269169689Skan		_SHLIBDIRPREFIX=${WORLDTMP} \
270169689Skan		_LDSCRIPTROOT= \
271169689Skan		VERSION="${VERSION}" \
272169689Skan		INSTALL="sh ${.CURDIR}/tools/install.sh" \
273169689Skan		PATH=${TMPPATH}
274169689Skan.if ${MK_CDDL} == "no"
275169689SkanWMAKEENV+=	NO_CTF=1
276169689Skan.endif
277169689Skan.if ${CC:T:Mgcc} == "gcc"
278169689SkanWMAKE_COMPILER_TYPE=	gcc
279169689Skan.elif ${CC:T:Mclang} == "clang"
280169689SkanWMAKE_COMPILER_TYPE=	clang
281169689Skan.elif ${MK_CLANG_IS_CC} == "no"
282169689SkanWMAKE_COMPILER_TYPE=	gcc
283169689Skan.else
284169689SkanWMAKE_COMPILER_TYPE=	clang
285169689Skan.endif
286169689SkanWMAKEENV+=	COMPILER_TYPE=${WMAKE_COMPILER_TYPE}
287169689SkanWMAKE=		${WMAKEENV} ${MAKE} -f Makefile.inc1 DESTDIR=${WORLDTMP}
288169689Skan
289169689Skan.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64"
290169689Skan# 32 bit world
291169689SkanLIB32TMP=	${OBJTREE}${.CURDIR}/lib32
292169689Skan
293169689Skan.if ${TARGET_ARCH} == "amd64"
294169689Skan.if empty(TARGET_CPUTYPE)
295169689SkanLIB32CPUFLAGS=	-march=i686 -mmmx -msse -msse2
296169689Skan.else
297169689SkanLIB32CPUFLAGS=	-march=${TARGET_CPUTYPE}
298169689Skan.endif
299169689SkanLIB32WMAKEENV=	MACHINE=i386 MACHINE_ARCH=i386 \
300169689Skan		MACHINE_CPU="i686 mmx sse sse2"
301169689SkanLIB32WMAKEFLAGS=	\
302169689Skan		AS="${AS} --32" \
303169689Skan		LD="${LD} -m elf_i386_fbsd -Y P,${LIB32TMP}/usr/lib32"
304169689Skan
305169689Skan.elif ${TARGET_ARCH} == "powerpc64"
306169689Skan.if empty(TARGET_CPUTYPE)
307169689SkanLIB32CPUFLAGS=	-mcpu=powerpc
308169689Skan.else
309169689SkanLIB32CPUFLAGS=	-mcpu=${TARGET_CPUTYPE}
310169689Skan.endif
311169689SkanLIB32WMAKEENV=	MACHINE=powerpc MACHINE_ARCH=powerpc
312169689SkanLIB32WMAKEFLAGS=	\
313169689Skan		LD="${LD} -m elf32ppc_fbsd"
314169689Skan.endif
315169689Skan
316169689Skan
317169689SkanLIB32FLAGS=	-m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \
318169689Skan		-isystem ${LIB32TMP}/usr/include/ \
319169689Skan		-L${LIB32TMP}/usr/lib32 \
320169689Skan		-B${LIB32TMP}/usr/lib32
321169689Skan
322169689Skan# Yes, the flags are redundant.
323169689SkanLIB32WMAKEENV+=	MAKEOBJDIRPREFIX=${OBJTREE}/lib32 \
324169689Skan		_SHLIBDIRPREFIX=${LIB32TMP} \
325169689Skan		_LDSCRIPTROOT=${LIB32TMP} \
326169689Skan		VERSION="${VERSION}" \
327169689Skan		INSTALL="sh ${.CURDIR}/tools/install.sh" \
328169689Skan		PATH=${TMPPATH} \
329169689Skan		LIBDIR=/usr/lib32 \
330169689Skan		SHLIBDIR=/usr/lib32 \
331169689Skan		COMPILER_TYPE=${WMAKE_COMPILER_TYPE}
332169689SkanLIB32WMAKEFLAGS+=	\
333169689Skan		CC="${CC} ${LIB32FLAGS}" \
334169689Skan		CXX="${CXX} ${LIB32FLAGS}" \
335169689Skan		DESTDIR=${LIB32TMP} \
336169689Skan		-DCOMPAT_32BIT \
337169689Skan		-DNO_CPU_CFLAGS \
338169689Skan		-DNO_CTF \
339169689Skan		-DNO_LINT
340169689Skan
341169689SkanLIB32WMAKE=	${LIB32WMAKEENV} ${MAKE} ${LIB32WMAKEFLAGS} \
342169689Skan		-DWITHOUT_BIND -DWITHOUT_MAN -DWITHOUT_INFO -DWITHOUT_HTML
343169689SkanLIB32IMAKE=	${LIB32WMAKE:NINSTALL=*:NDESTDIR=*:N_LDSCRIPTROOT=*} -DNO_INCS
344169689Skan.endif
345169689Skan
346169689Skan# install stage
347169689SkanIMAKEENV=	${CROSSENV:N_LDSCRIPTROOT=*}
348169689SkanIMAKE=		${IMAKEENV} ${MAKE} -f Makefile.inc1
349169689Skan.if empty(.MAKEFLAGS:M-n)
350169689SkanIMAKEENV+=	PATH=${STRICTTMPPATH}:${INSTALLTMP} \
351169689Skan		LD_LIBRARY_PATH=${INSTALLTMP} \
352169689Skan		PATH_LOCALE=${INSTALLTMP}/locale
353169689SkanIMAKE+=		__MAKE_SHELL=${INSTALLTMP}/sh
354169689Skan.else
355169689SkanIMAKEENV+=	PATH=${TMPPATH}:${INSTALLTMP}
356169689Skan.endif
357169689Skan
358169689Skan# kernel stage
359169689SkanKMAKEENV=	${WMAKEENV}
360169689SkanKMAKE=		${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME}
361169689Skan
362169689Skan#
363169689Skan# buildworld
364169689Skan#
365169689Skan# Attempt to rebuild the entire system, with reasonable chance of
366169689Skan# success, regardless of how old your existing system is.
367169689Skan#
368169689Skan_worldtmp:
369169689Skan.if ${.CURDIR:C/[^,]//g} != ""
370169689Skan#	The m4 build of sendmail files doesn't like it if ',' is used
371169689Skan#	anywhere in the path of it's files.
372169689Skan	@echo
373169689Skan	@echo "*** Error: path to source tree contains a comma ','"
374169689Skan	@echo
375169689Skan	false
376169689Skan.endif
377169689Skan	@echo
378169689Skan	@echo "--------------------------------------------------------------"
379169689Skan	@echo ">>> Rebuilding the temporary build tree"
380169689Skan	@echo "--------------------------------------------------------------"
381169689Skan.if !defined(NO_CLEAN)
382169689Skan	rm -rf ${WORLDTMP}
383169689Skan.if defined(LIB32TMP)
384169689Skan	rm -rf ${LIB32TMP}
385169689Skan.endif
386169689Skan.else
387169689Skan	rm -rf ${WORLDTMP}/legacy/usr/include
388169689Skan#	XXX - These three can depend on any header file.
389169689Skan	rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/ioctl.c
390169689Skan	rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/kdump_subr.c
391169689Skan	rm -f ${OBJTREE}${.CURDIR}/usr.bin/truss/ioctl.c
392169689Skan.endif
393169689Skan.for _dir in \
394169689Skan    lib usr legacy/usr
395169689Skan	mkdir -p ${WORLDTMP}/${_dir}
396169689Skan.endfor
397169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
398169689Skan	    -p ${WORLDTMP}/legacy/usr >/dev/null
399169689Skan.if ${MK_GROFF} != "no"
400169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.groff.dist \
401169689Skan	    -p ${WORLDTMP}/legacy/usr >/dev/null
402169689Skan.endif
403169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
404169689Skan	    -p ${WORLDTMP}/usr >/dev/null
405169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
406169689Skan	    -p ${WORLDTMP}/usr/include >/dev/null
407169689Skan	ln -sf ${.CURDIR}/sys ${WORLDTMP}
408169689Skan.if ${MK_BIND_LIBS} != "no"
409169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BIND.include.dist \
410169689Skan	    -p ${WORLDTMP}/usr/include >/dev/null
411169689Skan.endif
412169689Skan.for _mtree in ${LOCAL_MTREE}
413169689Skan	mtree -deU -f ${.CURDIR}/${_mtree} -p ${WORLDTMP} > /dev/null
414169689Skan.endfor
415169689Skan_legacy:
416169689Skan	@echo
417169689Skan	@echo "--------------------------------------------------------------"
418169689Skan	@echo ">>> stage 1.1: legacy release compatibility shims"
419169689Skan	@echo "--------------------------------------------------------------"
420169689Skan	${_+_}cd ${.CURDIR}; ${BMAKE} legacy
421169689Skan_bootstrap-tools:
422169689Skan	@echo
423169689Skan	@echo "--------------------------------------------------------------"
424169689Skan	@echo ">>> stage 1.2: bootstrap tools"
425169689Skan	@echo "--------------------------------------------------------------"
426169689Skan	${_+_}cd ${.CURDIR}; ${BMAKE} bootstrap-tools
427169689Skan_cleanobj:
428169689Skan.if !defined(NO_CLEAN)
429169689Skan	@echo
430169689Skan	@echo "--------------------------------------------------------------"
431169689Skan	@echo ">>> stage 2.1: cleaning up the object tree"
432169689Skan	@echo "--------------------------------------------------------------"
433169689Skan	${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR:S/^/par-/}
434169689Skan.if defined(LIB32TMP)
435169689Skan	${_+_}cd ${.CURDIR}; ${LIB32WMAKE} -f Makefile.inc1 ${CLEANDIR:S/^/par-/}
436169689Skan.endif
437169689Skan.endif
438169689Skan_obj:
439169689Skan	@echo
440169689Skan	@echo "--------------------------------------------------------------"
441169689Skan	@echo ">>> stage 2.2: rebuilding the object tree"
442169689Skan	@echo "--------------------------------------------------------------"
443169689Skan	${_+_}cd ${.CURDIR}; ${WMAKE} par-obj
444169689Skan_build-tools:
445169689Skan	@echo
446169689Skan	@echo "--------------------------------------------------------------"
447169689Skan	@echo ">>> stage 2.3: build tools"
448169689Skan	@echo "--------------------------------------------------------------"
449169689Skan	${_+_}cd ${.CURDIR}; ${TMAKE} build-tools
450169689Skan_cross-tools:
451169689Skan	@echo
452169689Skan	@echo "--------------------------------------------------------------"
453169689Skan	@echo ">>> stage 3: cross tools"
454169689Skan	@echo "--------------------------------------------------------------"
455169689Skan	${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
456169689Skan_includes:
457169689Skan	@echo
458169689Skan	@echo "--------------------------------------------------------------"
459169689Skan	@echo ">>> stage 4.1: building includes"
460169689Skan	@echo "--------------------------------------------------------------"
461169689Skan	${_+_}cd ${.CURDIR}; ${WMAKE} SHARED=symlinks par-includes
462169689Skan_libraries:
463169689Skan	@echo
464169689Skan	@echo "--------------------------------------------------------------"
465169689Skan	@echo ">>> stage 4.2: building libraries"
466169689Skan	@echo "--------------------------------------------------------------"
467169689Skan	${_+_}cd ${.CURDIR}; \
468169689Skan	    ${WMAKE} -DNO_FSCHG -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT \
469169689Skan	    -DWITHOUT_MAN -DNO_PROFILE libraries
470169689Skan_depend:
471169689Skan	@echo
472169689Skan	@echo "--------------------------------------------------------------"
473169689Skan	@echo ">>> stage 4.3: make dependencies"
474169689Skan	@echo "--------------------------------------------------------------"
475169689Skan	${_+_}cd ${.CURDIR}; ${WMAKE} par-depend
476169689Skaneverything:
477169689Skan	@echo
478169689Skan	@echo "--------------------------------------------------------------"
479169689Skan	@echo ">>> stage 4.4: building everything"
480169689Skan	@echo "--------------------------------------------------------------"
481169689Skan	${_+_}cd ${.CURDIR}; ${WMAKE} par-all
482169689Skan.if defined(LIB32TMP)
483169689Skanbuild32:
484169689Skan	@echo
485169689Skan	@echo "--------------------------------------------------------------"
486169689Skan	@echo ">>> stage 5.1: building 32 bit shim libraries"
487169689Skan	@echo "--------------------------------------------------------------"
488169689Skan	mkdir -p ${LIB32TMP}/usr/include
489169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
490169689Skan	    -p ${LIB32TMP}/usr >/dev/null
491169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
492169689Skan	    -p ${LIB32TMP}/usr/include >/dev/null
493169689Skan	mkdir -p ${WORLDTMP}
494169689Skan	ln -sf ${.CURDIR}/sys ${WORLDTMP}
495169689Skan.for _t in obj includes
496169689Skan	cd ${.CURDIR}/include; ${LIB32WMAKE} DIRPRFX=include/ ${_t}
497169689Skan	cd ${.CURDIR}/lib; ${LIB32WMAKE} DIRPRFX=lib/ ${_t}
498169689Skan.if ${MK_CDDL} != "no"
499169689Skan	cd ${.CURDIR}/cddl/lib; ${LIB32WMAKE} DIRPRFX=cddl/lib/ ${_t}
500169689Skan.endif
501169689Skan	cd ${.CURDIR}/gnu/lib; ${LIB32WMAKE} DIRPRFX=gnu/lib/ ${_t}
502169689Skan.if ${MK_CRYPT} != "no"
503169689Skan	cd ${.CURDIR}/secure/lib; ${LIB32WMAKE} DIRPRFX=secure/lib/ ${_t}
504169689Skan.endif
505169689Skan.if ${MK_KERBEROS} != "no"
506169689Skan	cd ${.CURDIR}/kerberos5/lib; ${LIB32WMAKE} DIRPRFX=kerberos5/lib ${_t}
507169689Skan.endif
508169689Skan.endfor
509169689Skan.for _dir in usr.bin/lex/lib
510169689Skan	cd ${.CURDIR}/${_dir}; ${LIB32WMAKE} DIRPRFX=${_dir}/ obj
511169689Skan.endfor
512169689Skan.for _dir in lib/ncurses/ncurses lib/ncurses/ncursesw lib/libmagic
513169689Skan	cd ${.CURDIR}/${_dir}; \
514169689Skan	    MAKEOBJDIRPREFIX=${OBJTREE}/lib32 ${MAKE} SSP_CFLAGS= DESTDIR= \
515169689Skan	    DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS -DNO_WARNS -DNO_CTF \
516169689Skan	    -DEARLY_BUILD build-tools
517169689Skan.endfor
518169689Skan	cd ${.CURDIR}; \
519169689Skan	    ${LIB32WMAKE} -f Makefile.inc1 libraries
520169689Skan.for _t in obj depend all
521169689Skan	cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIB32WMAKE} \
522169689Skan	    DIRPRFX=libexec/rtld-elf/ ${_t}
523169689Skan	cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32WMAKE} \
524169689Skan	    DIRPRFX=usr.bin/ldd ${_t}
525169689Skan.endfor
526169689Skan
527169689Skandistribute32 install32:
528169689Skan	cd ${.CURDIR}/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
529169689Skan.if ${MK_CDDL} != "no"
530169689Skan	cd ${.CURDIR}/cddl/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
531169689Skan.endif
532169689Skan	cd ${.CURDIR}/gnu/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
533169689Skan.if ${MK_CRYPT} != "no"
534169689Skan	cd ${.CURDIR}/secure/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
535169689Skan.endif
536169689Skan.if ${MK_KERBEROS} != "no"
537169689Skan	cd ${.CURDIR}/kerberos5/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
538169689Skan.endif
539169689Skan	cd ${.CURDIR}/libexec/rtld-elf; \
540169689Skan	    PROG=ld-elf32.so.1 ${LIB32IMAKE} ${.TARGET:S/32$//}
541169689Skan	cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32IMAKE} ${.TARGET:S/32$//}
542169689Skan.endif
543169689Skan
544169689SkanWMAKE_TGTS=
545169689Skan.if !defined(SUBDIR_OVERRIDE)
546169689SkanWMAKE_TGTS+=	_worldtmp _legacy _bootstrap-tools
547169689Skan.endif
548169689SkanWMAKE_TGTS+=	_cleanobj _obj _build-tools
549169689Skan.if !defined(SUBDIR_OVERRIDE)
550169689SkanWMAKE_TGTS+=	_cross-tools
551169689Skan.endif
552169689SkanWMAKE_TGTS+=	_includes _libraries _depend everything
553169689Skan.if defined(LIB32TMP) && ${MK_LIB32} != "no"
554169689SkanWMAKE_TGTS+=	build32
555169689Skan.endif
556169689Skan
557169689Skanbuildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
558169689Skan.ORDER: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
559169689Skan
560169689Skanbuildworld_prologue:
561169689Skan	@echo "--------------------------------------------------------------"
562169689Skan	@echo ">>> World build started on `LC_ALL=C date`"
563169689Skan	@echo "--------------------------------------------------------------"
564169689Skan
565169689Skanbuildworld_epilogue:
566169689Skan	@echo
567169689Skan	@echo "--------------------------------------------------------------"
568169689Skan	@echo ">>> World build completed on `LC_ALL=C date`"
569169689Skan	@echo "--------------------------------------------------------------"
570169689Skan
571169689Skan#
572169689Skan# We need to have this as a target because the indirection between Makefile
573169689Skan# and Makefile.inc1 causes the correct PATH to be used, rather than a
574169689Skan# modification of the current environment's PATH.  In addition, we need
575169689Skan# to quote multiword values.
576169689Skan#
577169689Skanbuildenvvars:
578169689Skan	@echo ${WMAKEENV:Q}
579169689Skan
580169689Skanbuildenv:
581169689Skan	@echo Entering world for ${TARGET_ARCH}:${TARGET}
582169689Skan	@cd ${.CURDIR} && env ${WMAKEENV} ${BUILDENV_SHELL} || true
583169689Skan
584169689SkanTOOLCHAIN_TGTS=	${WMAKE_TGTS:N_depend:Neverything:Nbuild32}
585169689Skantoolchain: ${TOOLCHAIN_TGTS}
586169689Skankernel-toolchain: ${TOOLCHAIN_TGTS:N_includes:N_libraries}
587169689Skan
588169689Skan#
589169689Skan# installcheck
590169689Skan#
591169689Skan# Checks to be sure system is ready for installworld/installkernel.
592169689Skan#
593169689Skaninstallcheck:
594169689Skan
595169689Skan#
596169689Skan# Require DESTDIR to be set if installing for a different architecture.
597169689Skan#
598169689Skan.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${TARGET} != ${MACHINE}
599169689Skan.if !make(distributeworld)
600169689Skaninstallcheck: installcheck_DESTDIR
601169689Skaninstallcheck_DESTDIR:
602169689Skan.if !defined(DESTDIR) || empty(DESTDIR)
603169689Skan	@echo "ERROR: Please set DESTDIR!"; \
604169689Skan	false
605169689Skan.endif
606169689Skan.endif
607169689Skan.endif
608169689Skan
609169689Skan#
610169689Skan# Check for missing UIDs/GIDs.
611169689Skan#
612169689SkanCHECK_UIDS=
613169689SkanCHECK_GIDS=	audit
614169689Skan.if ${MK_SENDMAIL} != "no"
615169689SkanCHECK_UIDS+=	smmsp
616169689SkanCHECK_GIDS+=	smmsp
617169689Skan.endif
618169689Skan.if ${MK_PF} != "no"
619169689SkanCHECK_UIDS+=	proxy
620169689SkanCHECK_GIDS+=	proxy authpf
621169689Skan.endif
622169689Skaninstallcheck: installcheck_UGID
623169689Skaninstallcheck_UGID:
624169689Skan.for uid in ${CHECK_UIDS}
625169689Skan	@if ! `id -u ${uid} >/dev/null 2>&1`; then \
626169689Skan		echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \
627169689Skan		false; \
628169689Skan	fi
629169689Skan.endfor
630169689Skan.for gid in ${CHECK_GIDS}
631169689Skan	@if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \
632169689Skan		echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \
633169689Skan		false; \
634169689Skan	fi
635169689Skan.endfor
636169689Skan
637169689Skan#
638169689Skan# Required install tools to be saved in a scratch dir for safety.
639169689Skan#
640169689Skan.if ${MK_INFO} != "no"
641169689Skan_install-info=	install-info
642169689Skan.endif
643169689Skan.if ${MK_ZONEINFO} != "no"
644169689Skan_zoneinfo=	zic tzsetup
645169689Skan.endif
646169689Skan
647169689SkanITOOLS=	[ awk cap_mkdb cat chflags chmod chown \
648169689Skan	date echo egrep find grep ${_install-info} \
649169689Skan	ln lockf make mkdir mtree mv pwd_mkdb rm sed sh sysctl \
650169689Skan	test true uname wc ${_zoneinfo}
651169689Skan
652169689Skan#
653169689Skan# distributeworld
654169689Skan#
655169689Skan# Distributes everything compiled by a `buildworld'.
656169689Skan#
657169689Skan# installworld
658169689Skan#
659169689Skan# Installs everything compiled by a 'buildworld'.
660169689Skan#
661169689Skan
662169689Skan# Non-base distributions produced by the base system
663169689SkanEXTRA_DISTRIBUTIONS=	doc
664169689Skan.if ${MK_GAMES} != "no"
665169689SkanEXTRA_DISTRIBUTIONS+=	games
666169689Skan.endif
667169689Skan.if defined(LIB32TMP) && ${MK_LIB32} != "no"
668169689SkanEXTRA_DISTRIBUTIONS+=	lib32
669169689Skan.endif
670169689Skan
671169689Skandistributeworld installworld: installcheck
672169689Skan	mkdir -p ${INSTALLTMP}
673169689Skan	progs=$$(for prog in ${ITOOLS}; do \
674169689Skan		if progpath=`which $$prog`; then \
675169689Skan			echo $$progpath; \
676169689Skan		else \
677169689Skan			echo "Required tool $$prog not found in PATH." >&2; \
678169689Skan			exit 1; \
679169689Skan		fi; \
680169689Skan	    done); \
681169689Skan	libs=$$(ldd -f "%o %p\n" -f "%o %p\n" $$progs 2>/dev/null | sort -u | \
682169689Skan	    while read line; do \
683169689Skan		set -- $$line; \
684169689Skan		if [ "$$2 $$3" != "not found" ]; then \
685169689Skan			echo $$2; \
686169689Skan		else \
687169689Skan			echo "Required library $$1 not found." >&2; \
688169689Skan			exit 1; \
689169689Skan		fi; \
690169689Skan	    done); \
691169689Skan	cp $$libs $$progs ${INSTALLTMP}
692169689Skan	cp -R $${PATH_LOCALE:-"/usr/share/locale"} ${INSTALLTMP}/locale
693169689Skan.if make(distributeworld)
694169689Skan.for dist in ${EXTRA_DISTRIBUTIONS}
695169689Skan	-mkdir ${DESTDIR}/${DISTDIR}/${dist}
696169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.root.dist \
697169689Skan	    -p ${DESTDIR}/${DISTDIR}/${dist} >/dev/null
698169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
699169689Skan	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
700169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
701169689Skan	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/include >/dev/null
702169689Skan.endfor
703169689Skan	-mkdir ${DESTDIR}/${DISTDIR}/base
704169689Skan	${_+_}cd ${.CURDIR}; ${IMAKE} distrib-dirs \
705169689Skan	    DESTDIR=${DESTDIR}/${DISTDIR}/base
706169689Skan.endif
707169689Skan	${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \
708169689Skan	    ${IMAKEENV} rm -rf ${INSTALLTMP}
709169689Skan.if make(distributeworld)
710169689Skan.for dist in ${EXTRA_DISTRIBUTIONS}
711169689Skan	find ${DESTDIR}/${DISTDIR}/${dist} -empty -delete
712169689Skan.endfor
713169689Skan.endif
714169689Skan
715169689Skanpackageworld:
716169689Skan.for dist in base ${EXTRA_DISTRIBUTIONS}
717169689Skan	${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
718169689Skan	    tar cvJf ${DESTDIR}/${DISTDIR}/${dist}.txz .
719169689Skan.endfor
720169689Skan
721169689Skan#
722169689Skan# reinstall
723169689Skan#
724169689Skan# If you have a build server, you can NFS mount the source and obj directories
725169689Skan# and do a 'make reinstall' on the *client* to install new binaries from the
726169689Skan# most recent server build.
727169689Skan#
728169689Skanreinstall:
729169689Skan	@echo "--------------------------------------------------------------"
730169689Skan	@echo ">>> Making hierarchy"
731169689Skan	@echo "--------------------------------------------------------------"
732169689Skan	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \
733169689Skan	    LOCAL_MTREE=${LOCAL_MTREE} hierarchy
734169689Skan	@echo
735169689Skan	@echo "--------------------------------------------------------------"
736169689Skan	@echo ">>> Installing everything"
737169689Skan	@echo "--------------------------------------------------------------"
738169689Skan	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
739169689Skan.if defined(LIB32TMP) && ${MK_LIB32} != "no"
740169689Skan	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install32
741169689Skan.endif
742169689Skan
743169689Skanredistribute:
744169689Skan	@echo "--------------------------------------------------------------"
745169689Skan	@echo ">>> Distributing everything"
746169689Skan	@echo "--------------------------------------------------------------"
747169689Skan	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
748169689Skan.if defined(LIB32TMP) && ${MK_LIB32} != "no"
749169689Skan	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute32 \
750169689Skan	    DISTRIBUTION=lib32
751169689Skan.endif
752169689Skan
753169689Skandistrib-dirs distribution:
754169689Skan	cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} ${.TARGET}
755169689Skan
756169689Skan#
757169689Skan# buildkernel and installkernel
758169689Skan#
759169689Skan# Which kernels to build and/or install is specified by setting
760169689Skan# KERNCONF. If not defined a GENERIC kernel is built/installed.
761169689Skan# Only the existing (depending TARGET) config files are used
762169689Skan# for building kernels and only the first of these is designated
763169689Skan# as the one being installed.
764169689Skan#
765169689Skan# Note that we have to use TARGET instead of TARGET_ARCH when
766169689Skan# we're in kernel-land. Since only TARGET_ARCH is (expected) to
767169689Skan# be set to cross-build, we have to make sure TARGET is set
768169689Skan# properly.
769169689Skan
770169689Skan.if defined(KERNFAST)
771169689SkanNO_KERNELCLEAN=	t
772169689SkanNO_KERNELCONFIG=	t
773169689SkanNO_KERNELDEPEND=	t
774169689SkanNO_KERNELOBJ=		t
775169689Skan# Shortcut for KERNCONF=Blah -DKERNFAST is now KERNFAST=Blah
776169689Skan.if !defined(KERNCONF) && ${KERNFAST} != "1"
777169689SkanKERNCONF=${KERNFAST}
778169689Skan.endif
779169689Skan.endif
780169689Skan.if !defined(KERNCONF) && defined(KERNEL)
781169689SkanKERNCONF=	${KERNEL}
782169689SkanKERNWARN=
783169689Skan.else
784169689Skan.if ${TARGET_ARCH} == "powerpc64"
785169689SkanKERNCONF?=	GENERIC64
786169689Skan.else
787169689SkanKERNCONF?=	GENERIC
788169689Skan.endif
789169689Skan.endif
790169689SkanINSTKERNNAME?=	kernel
791169689Skan
792169689SkanKERNSRCDIR?=	${.CURDIR}/sys
793169689SkanKRNLCONFDIR=	${KERNSRCDIR}/${TARGET}/conf
794169689SkanKRNLOBJDIR=	${OBJTREE}${KERNSRCDIR}
795169689SkanKERNCONFDIR?=	${KRNLCONFDIR}
796169689Skan
797169689SkanBUILDKERNELS=
798169689SkanINSTALLKERNEL=
799169689Skan.for _kernel in ${KERNCONF}
800169689Skan.if exists(${KERNCONFDIR}/${_kernel})
801169689SkanBUILDKERNELS+=	${_kernel}
802169689Skan.if empty(INSTALLKERNEL)
803169689SkanINSTALLKERNEL= ${_kernel}
804169689Skan.endif
805169689Skan.endif
806169689Skan.endfor
807169689Skan
808169689Skan#
809169689Skan# buildkernel
810169689Skan#
811169689Skan# Builds all kernels defined by BUILDKERNELS.
812169689Skan#
813169689Skanbuildkernel:
814169689Skan.if empty(BUILDKERNELS)
815169689Skan	@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF})."; \
816169689Skan	false
817169689Skan.endif
818169689Skan.if defined(KERNWARN)
819169689Skan	@echo "--------------------------------------------------------------"
820169689Skan	@echo ">>> WARNING: KERNEL= setting should be changed to KERNCONF="
821169689Skan	@echo "--------------------------------------------------------------"
822169689Skan	@sleep 3
823169689Skan.endif
824169689Skan	@echo
825169689Skan.for _kernel in ${BUILDKERNELS}
826169689Skan	@echo "--------------------------------------------------------------"
827169689Skan	@echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`"
828169689Skan	@echo "--------------------------------------------------------------"
829169689Skan	@echo "===> ${_kernel}"
830169689Skan	mkdir -p ${KRNLOBJDIR}
831169689Skan.if !defined(NO_KERNELCONFIG)
832169689Skan	@echo
833169689Skan	@echo "--------------------------------------------------------------"
834169689Skan	@echo ">>> stage 1: configuring the kernel"
835169689Skan	@echo "--------------------------------------------------------------"
836169689Skan	cd ${KRNLCONFDIR}; \
837169689Skan		PATH=${TMPPATH} \
838169689Skan		    config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \
839169689Skan			${KERNCONFDIR}/${_kernel}
840169689Skan.endif
841169689Skan.if !defined(NO_CLEAN) && !defined(NO_KERNELCLEAN)
842169689Skan	@echo
843169689Skan	@echo "--------------------------------------------------------------"
844169689Skan	@echo ">>> stage 2.1: cleaning up the object tree"
845169689Skan	@echo "--------------------------------------------------------------"
846169689Skan	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} ${CLEANDIR}
847169689Skan.endif
848169689Skan.if !defined(NO_KERNELOBJ)
849169689Skan	@echo
850169689Skan	@echo "--------------------------------------------------------------"
851169689Skan	@echo ">>> stage 2.2: rebuilding the object tree"
852169689Skan	@echo "--------------------------------------------------------------"
853169689Skan	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj
854169689Skan.endif
855169689Skan	@echo
856169689Skan	@echo "--------------------------------------------------------------"
857169689Skan	@echo ">>> stage 2.3: build tools"
858169689Skan	@echo "--------------------------------------------------------------"
859169689Skan	cd ${KRNLOBJDIR}/${_kernel}; \
860169689Skan	    PATH=${BPATH}:${PATH} \
861169689Skan	    MAKESRCPATH=${KERNSRCDIR}/dev/aic7xxx/aicasm \
862169689Skan	    ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF -DEARLY_BUILD \
863169689Skan	    -f ${KERNSRCDIR}/dev/aic7xxx/aicasm/Makefile
864169689Skan# XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case.
865169689Skan.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KERNSRCDIR}/modules)
866169689Skan.for target in obj depend all
867169689Skan	cd ${KERNSRCDIR}/modules/aic7xxx/aicasm; \
868169689Skan	    PATH=${BPATH}:${PATH} \
869169689Skan	    MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \
870169689Skan	    ${MAKE} SSP_CFLAGS= -DNO_CPU_CFLAGS -DNO_CTF -DEARLY_BUILD ${target}
871169689Skan.endfor
872169689Skan.endif
873169689Skan.if !defined(NO_KERNELDEPEND)
874169689Skan	@echo
875169689Skan	@echo "--------------------------------------------------------------"
876169689Skan	@echo ">>> stage 3.1: making dependencies"
877169689Skan	@echo "--------------------------------------------------------------"
878169689Skan	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} depend -DNO_MODULES_OBJ
879169689Skan.endif
880169689Skan	@echo
881169689Skan	@echo "--------------------------------------------------------------"
882169689Skan	@echo ">>> stage 3.2: building everything"
883169689Skan	@echo "--------------------------------------------------------------"
884169689Skan	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ
885169689Skan	@echo "--------------------------------------------------------------"
886169689Skan	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
887169689Skan	@echo "--------------------------------------------------------------"
888169689Skan.endfor
889169689Skan
890169689Skan#
891169689Skan# installkernel, etc.
892169689Skan#
893169689Skan# Install the kernel defined by INSTALLKERNEL
894169689Skan#
895169689Skaninstallkernel installkernel.debug \
896169689Skanreinstallkernel reinstallkernel.debug: installcheck
897169689Skan.if empty(INSTALLKERNEL)
898169689Skan	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
899169689Skan	false
900169689Skan.endif
901169689Skan	@echo "--------------------------------------------------------------"
902169689Skan	@echo ">>> Installing kernel ${INSTALLKERNEL}"
903169689Skan	@echo "--------------------------------------------------------------"
904169689Skan	cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
905169689Skan	    ${CROSSENV} PATH=${TMPPATH} \
906169689Skan	    ${MAKE} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel//}
907169689Skan
908169689Skandistributekernel distributekernel.debug:
909169689Skan.if empty(INSTALLKERNEL)
910169689Skan	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
911169689Skan	false
912169689Skan.endif
913169689Skan	cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
914169689Skan	    ${CROSSENV} PATH=${TMPPATH} ${MAKE} KERNEL=${INSTKERNNAME} \
915169689Skan	    DESTDIR=${DESTDIR}/${DISTDIR}/kernel \
916169689Skan	    ${.TARGET:S/distributekernel/install/}
917169689Skan.for _kernel in ${BUILDKERNELS:S/${INSTALLKERNEL}//}
918169689Skan	cd ${KRNLOBJDIR}/${_kernel}; \
919169689Skan	    ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
920169689Skan	    KERNEL=${INSTKERNNAME}.${_kernel} \
921169689Skan	    DESTDIR=${DESTDIR}/${DISTDIR}/kernel.${_kernel} \
922169689Skan	    ${.TARGET:S/distributekernel/install/}
923169689Skan.endfor
924169689Skan
925169689Skanpackagekernel:
926169689Skan	cd ${DESTDIR}/${DISTDIR}/kernel; \
927169689Skan	    tar cvJf ${DESTDIR}/${DISTDIR}/kernel.txz .
928169689Skan.for _kernel in ${BUILDKERNELS:S/${INSTALLKERNEL}//}
929169689Skan	cd ${DESTDIR}/${DISTDIR}/kernel.${_kernel}; \
930169689Skan	    tar cvJf ${DESTDIR}/${DISTDIR}/kernel.${_kernel}.txz .
931169689Skan.endfor
932169689Skan
933169689Skan#
934169689Skan# doxygen
935169689Skan#
936169689Skan# Build the API documentation with doxygen
937169689Skan#
938169689Skandoxygen:
939169689Skan	@if [ ! -x `/usr/bin/which doxygen` ]; then \
940169689Skan		echo "You need doxygen (devel/doxygen) to generate the API documentation of the kernel." | /usr/bin/fmt; \
941169689Skan		exit 1; \
942169689Skan	fi
943169689Skan	cd ${.CURDIR}/tools/kerneldoc/subsys && ${MAKE} obj all
944169689Skan
945169689Skan#
946169689Skan# update
947169689Skan#
948169689Skan# Update the source tree(s), by running cvsup/cvs/svn to update to the
949169689Skan# latest copy.
950169689Skan#
951169689Skanupdate:
952169689Skan.if defined(SUP_UPDATE)
953169689Skan	@echo "--------------------------------------------------------------"
954169689Skan	@echo ">>> Running ${SUP}"
955169689Skan	@echo "--------------------------------------------------------------"
956169689Skan.if defined(SUPFILE)
957169689Skan	@${SUP} ${SUPFLAGS} ${SUPFILE}
958169689Skan.endif
959169689Skan.if defined(SUPFILE1)
960169689Skan	@${SUP} ${SUPFLAGS} ${SUPFILE1}
961169689Skan.endif
962169689Skan.if defined(SUPFILE2)
963169689Skan	@${SUP} ${SUPFLAGS} ${SUPFILE2}
964169689Skan.endif
965169689Skan.if defined(PORTSSUPFILE) && !defined(NO_PORTSUPDATE)
966169689Skan	@${SUP} ${SUPFLAGS} ${PORTSSUPFILE}
967169689Skan.endif
968169689Skan.if defined(DOCSUPFILE) && !defined(NO_DOCUPDATE)
969169689Skan	@${SUP} ${SUPFLAGS} ${DOCSUPFILE}
970169689Skan.endif
971169689Skan.if defined(WWWSUPFILE) && !defined(NO_WWWUPDATE)
972169689Skan	@${SUP} ${SUPFLAGS} ${WWWSUPFILE}
973169689Skan.endif
974169689Skan.endif
975169689Skan.if defined(CVS_UPDATE)
976169689Skan	@cd ${.CURDIR} ; \
977169689Skan	if [ -d CVS ] ; then \
978169689Skan		echo "--------------------------------------------------------------" ; \
979169689Skan		echo ">>> Updating ${.CURDIR} from CVS repository" ${CVSROOT} ; \
980169689Skan		echo "--------------------------------------------------------------" ; \
981169689Skan		echo ${CVS} -R -q update ${CVSFLAGS} ; \
982169689Skan		${CVS} -R -q update ${CVSFLAGS} ; \
983169689Skan	fi
984169689Skan.endif
985169689Skan.if defined(SVN_UPDATE)
986169689Skan	@cd ${.CURDIR} ; \
987169689Skan	if [ -d .svn ] ; then \
988169689Skan		echo "--------------------------------------------------------------" ; \
989169689Skan		echo ">>> Updating ${.CURDIR} using Subversion" ; \
990169689Skan		echo "--------------------------------------------------------------" ; \
991169689Skan		echo ${SVN} update ${SVNFLAGS} ; \
992169689Skan		${SVN} update ${SVNFLAGS} ; \
993169689Skan	fi
994169689Skan.endif
995169689Skan
996169689Skan#
997169689Skan# ------------------------------------------------------------------------
998169689Skan#
999169689Skan# From here onwards are utility targets used by the 'make world' and
1000169689Skan# related targets.  If your 'world' breaks, you may like to try to fix
1001169689Skan# the problem and manually run the following targets to attempt to
1002169689Skan# complete the build.  Beware, this is *not* guaranteed to work, you
1003169689Skan# need to have a pretty good grip on the current state of the system
1004169689Skan# to attempt to manually finish it.  If in doubt, 'make world' again.
1005169689Skan#
1006169689Skan
1007169689Skan#
1008169689Skan# legacy: Build compatibility shims for the next three targets
1009169689Skan#
1010169689Skanlegacy:
1011169689Skan.if ${BOOTSTRAPPING} < 700055 && ${BOOTSTRAPPING} != 0
1012169689Skan	@echo "ERROR: Source upgrades from versions prior to 7.0 not supported."; \
1013169689Skan	false
1014169689Skan.endif
1015169689Skan.for _tool in tools/build
1016169689Skan	${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,depend,all,install)"; \
1017169689Skan	    cd ${.CURDIR}/${_tool}; \
1018169689Skan	    ${MAKE} DIRPRFX=${_tool}/ obj; \
1019169689Skan	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy includes; \
1020169689Skan	    ${MAKE} DIRPRFX=${_tool}/ depend; \
1021169689Skan	    ${MAKE} DIRPRFX=${_tool}/ all; \
1022169689Skan	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
1023169689Skan.endfor
1024169689Skan
1025169689Skan#
1026169689Skan# bootstrap-tools: Build tools needed for compatibility
1027169689Skan#
1028169689Skan.if ${MK_GAMES} != "no"
1029169689Skan_strfile=	games/fortune/strfile
1030169689Skan.endif
1031169689Skan
1032169689Skan.if ${MK_CXX} != "no"
1033169689Skan_gperf=		gnu/usr.bin/gperf
1034169689Skan.endif
1035169689Skan
1036169689Skan.if ${MK_GROFF} != "no"
1037169689Skan_groff=		gnu/usr.bin/groff
1038169689Skan.endif
1039169689Skan
1040169689Skan.if ${BOOTSTRAPPING} < 800022
1041169689Skan_ar=		usr.bin/ar
1042169689Skan.endif
1043169689Skan
1044169689Skan.if ${BOOTSTRAPPING} < 800013
1045169689Skan_mklocale=	usr.bin/mklocale
1046169689Skan.endif
1047169689Skan
1048169689Skan.if ${BOOTSTRAPPING} < 900002
1049169689Skan_sed=		usr.bin/sed
1050169689Skan.endif
1051169689Skan
1052169689Skan.if ${BOOTSTRAPPING} < 900006
1053169689Skan_lex=		usr.bin/lex
1054169689Skan.endif
1055169689Skan
1056169689Skan.if ${BOOTSTRAPPING} < 1000013
1057169689Skan_yacc=		usr.bin/yacc
1058169689Skan.endif
1059169689Skan
1060169689Skan.if ${BOOTSTRAPPING} >= 900040 && ${BOOTSTRAPPING} < 900041
1061169689Skan_awk=		usr.bin/awk
1062169689Skan.endif
1063169689Skan
1064169689Skan.if ${MK_BSNMP} != "no" && !exists(/usr/sbin/gensnmptree)
1065169689Skan_gensnmptree=	usr.sbin/bsnmpd/gensnmptree
1066169689Skan.endif
1067169689Skan
1068169689Skan.if ${MK_CLANG} != "no"
1069169689Skan_clang_tblgen= \
1070169689Skan	lib/clang/libllvmsupport \
1071169689Skan	lib/clang/libllvmtablegen \
1072169689Skan	usr.bin/clang/tblgen \
1073169689Skan	usr.bin/clang/clang-tblgen
1074169689Skan.endif
1075169689Skan
1076169689Skan# dtrace tools are required for older bootstrap env and cross-build
1077169689Skan.if ${MK_CDDL} != "no" && \
1078169689Skan    ((${BOOTSTRAPPING} < 800038 && \
1079169689Skan          !(${BOOTSTRAPPING} >= 700112 && ${BOOTSTRAPPING} < 799999)) \
1080169689Skan      || (${MACHINE} != ${TARGET} || ${MACHINE_ARCH} != ${TARGET_ARCH}))
1081169689Skan_dtrace_tools= cddl/usr.bin/sgsmsg cddl/lib/libctf lib/libelf \
1082169689Skan    lib/libdwarf cddl/usr.bin/ctfconvert cddl/usr.bin/ctfmerge
1083169689Skan.endif
1084169689Skan
1085169689Skan.if ${MK_FDT} != "no"
1086169689Skan_dtc= gnu/usr.bin/dtc
1087169689Skan.endif
1088169689Skan
1089169689Skan.if ${MK_KERBEROS} != "no"
1090169689Skan_kerberos5_bootstrap_tools= \
1091169689Skan	kerberos5/tools/make-roken \
1092169689Skan	kerberos5/lib/libroken \
1093169689Skan	kerberos5/lib/libvers \
1094169689Skan	kerberos5/tools/asn1_compile \
1095169689Skan	kerberos5/tools/slc
1096169689Skan.endif
1097169689Skan
1098169689Skan#	Please document (add comment) why something is in 'bootstrap-tools'.
1099169689Skan#	Try to bound the building of the bootstrap-tool to just the
1100169689Skan#	FreeBSD versions that need the tool built at this stage of the build.
1101169689Skanbootstrap-tools:
1102169689Skan.for _tool in \
1103169689Skan    ${_clang_tblgen} \
1104169689Skan    ${_kerberos5_bootstrap_tools} \
1105169689Skan    ${_dtrace_tools} \
1106169689Skan    ${_strfile} \
1107169689Skan    ${_gperf} \
1108169689Skan    ${_groff} \
1109169689Skan    ${_ar} \
1110169689Skan    ${_dtc} \
1111169689Skan    ${_awk} \
1112169689Skan    usr.bin/lorder \
1113169689Skan    usr.bin/makewhatis \
1114169689Skan    ${_mklocale} \
1115169689Skan    usr.bin/rpcgen \
1116169689Skan    ${_sed} \
1117169689Skan    ${_yacc} \
1118169689Skan    ${_lex} \
1119169689Skan    usr.bin/xinstall \
1120169689Skan    ${_gensnmptree} \
1121169689Skan    usr.sbin/config
1122169689Skan	${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
1123169689Skan		cd ${.CURDIR}/${_tool}; \
1124169689Skan		${MAKE} DIRPRFX=${_tool}/ obj; \
1125169689Skan		${MAKE} DIRPRFX=${_tool}/ depend; \
1126169689Skan		${MAKE} DIRPRFX=${_tool}/ all; \
1127169689Skan		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
1128169689Skan.endfor
1129169689Skan
1130169689Skan#
1131169689Skan# build-tools: Build special purpose build tools
1132169689Skan#
1133169689Skan.if defined(MODULES_WITH_WORLD) && exists(${KERNSRCDIR}/modules)
1134169689Skan_aicasm= sys/modules/aic7xxx/aicasm
1135169689Skan.endif
1136169689Skan
1137169689Skan.if !defined(NO_SHARE)
1138169689Skan_share=	share/syscons/scrnmaps
1139169689Skan.endif
1140169689Skan
1141169689Skan.if ${MK_GCC} != "no"
1142169689Skan_gcc_tools= gnu/usr.bin/cc/cc_tools
1143169689Skan.endif
1144169689Skan
1145169689Skan.if ${MK_RESCUE} != "no"
1146169689Skan_rescue= rescue/rescue
1147169689Skan.endif
1148169689Skan
1149169689Skanbuild-tools:
1150169689Skan.for _tool in \
1151169689Skan    bin/csh \
1152169689Skan    bin/sh \
1153169689Skan    ${_rescue} \
1154169689Skan    ${LOCAL_TOOL_DIRS} \
1155169689Skan    lib/ncurses/ncurses \
1156169689Skan    lib/ncurses/ncursesw \
1157169689Skan    ${_share} \
1158169689Skan    ${_aicasm} \
1159169689Skan    usr.bin/awk \
1160169689Skan    lib/libmagic \
1161169689Skan    usr.bin/mkesdb_static \
1162169689Skan    usr.bin/mkcsmapper_static
1163169689Skan	${_+_}@${ECHODIR} "===> ${_tool} (obj,build-tools)"; \
1164169689Skan		cd ${.CURDIR}/${_tool}; \
1165169689Skan		${MAKE} DIRPRFX=${_tool}/ obj; \
1166169689Skan		${MAKE} DIRPRFX=${_tool}/ build-tools
1167169689Skan.endfor
1168169689Skan.for _tool in \
1169169689Skan    ${_gcc_tools}
1170169689Skan	${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all)"; \
1171169689Skan		cd ${.CURDIR}/${_tool}; \
1172169689Skan		${MAKE} DIRPRFX=${_tool}/ obj; \
1173169689Skan		${MAKE} DIRPRFX=${_tool}/ depend; \
1174169689Skan		${MAKE} DIRPRFX=${_tool}/ all
1175169689Skan.endfor
1176169689Skan
1177169689Skan#
1178169689Skan# cross-tools: Build cross-building tools
1179169689Skan#
1180169689Skan.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${BOOTSTRAPPING} < 800035
1181169689Skan.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
1182169689Skan_btxld=		usr.sbin/btxld
1183169689Skan.endif
1184169689Skan.endif
1185169689Skan.if ${TARGET_ARCH} != ${MACHINE_ARCH}
1186169689Skan.if ${MK_RESCUE} != "no" || defined(RELEASEDIR)
1187169689Skan_crunchide=	usr.sbin/crunch/crunchide
1188169689Skan.endif
1189169689Skan.if ${TARGET_ARCH} == "i386" && defined(RELEASEDIR)
1190169689Skan_kgzip=		usr.sbin/kgzip
1191169689Skan.endif
1192169689Skan.endif
1193169689Skan
1194169689Skan.if ${MK_BINUTILS} != "no"
1195169689Skan_binutils=	gnu/usr.bin/binutils
1196169689Skan.endif
1197169689Skan
1198169689Skan.if ${MK_CLANG} != "no" && (${MK_CLANG_IS_CC} != "no" || ${CC:T:Mclang} == "clang")
1199169689Skan_clang=		usr.bin/clang
1200169689Skan_clang_libs=	lib/clang
1201169689Skan.endif
1202169689Skan
1203169689Skan.if ${MK_GCC} != "no" && (${MK_CLANG_IS_CC} == "no" || ${TARGET} == "pc98")
1204169689Skan_cc=		gnu/usr.bin/cc
1205169689Skan.endif
1206169689Skan
1207169689Skancross-tools:
1208169689Skan.for _tool in \
1209169689Skan    ${_clang_libs} \
1210169689Skan    ${_clang} \
1211169689Skan    ${_binutils} \
1212169689Skan    ${_cc} \
1213169689Skan    usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint \
1214169689Skan    ${_btxld} \
1215169689Skan    ${_crunchide} \
1216169689Skan    ${_kgzip}
1217169689Skan	${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
1218169689Skan		cd ${.CURDIR}/${_tool}; \
1219169689Skan		${MAKE} DIRPRFX=${_tool}/ obj; \
1220169689Skan		${MAKE} DIRPRFX=${_tool}/ depend; \
1221169689Skan		${MAKE} DIRPRFX=${_tool}/ all; \
1222169689Skan		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
1223169689Skan.endfor
1224169689Skan
1225169689Skan#
1226169689Skan# hierarchy - ensure that all the needed directories are present
1227169689Skan#
1228169689Skanhierarchy hier:
1229169689Skan	cd ${.CURDIR}/etc;		${MAKE} distrib-dirs
1230169689Skan.for _mtree in ${LOCAL_MTREE}
1231169689Skan	mtree -eU ${MTREE_FOLLOWS_SYMLINKS} -f ${.CURDIR}/${_mtree} \
1232169689Skan	    -p ${DESTDIR}/
1233169689Skan.endfor
1234169689Skan
1235169689Skan#
1236169689Skan# libraries - build all libraries, and install them under ${DESTDIR}.
1237169689Skan#
1238169689Skan# The list of libraries with dependents (${_prebuild_libs}) and their
1239169689Skan# interdependencies (__L) are built automatically by the
1240169689Skan# ${.CURDIR}/tools/make_libdeps.sh script.
1241169689Skan#
1242169689Skanlibraries:
1243169689Skan	cd ${.CURDIR}; \
1244169689Skan	    ${MAKE} -f Makefile.inc1 _prereq_libs; \
1245169689Skan	    ${MAKE} -f Makefile.inc1 _startup_libs; \
1246169689Skan	    ${MAKE} -f Makefile.inc1 _prebuild_libs; \
1247169689Skan	    ${MAKE} -f Makefile.inc1 _generic_libs;
1248169689Skan
1249169689Skan#
1250169689Skan# static libgcc.a prerequisite for shared libc
1251169689Skan#
1252169689Skan_prereq_libs= gnu/lib/libssp/libssp_nonshared gnu/lib/libgcc lib/libcompiler_rt
1253169689Skan
1254169689Skan# These dependencies are not automatically generated:
1255169689Skan#
1256169689Skan# gnu/lib/csu, gnu/lib/libgcc, lib/csu and lib/libc must be built before
1257169689Skan# all shared libraries for ELF.
1258169689Skan#
1259169689Skan_startup_libs=	gnu/lib/csu
1260169689Skan.if exists(${.CURDIR}/lib/csu/${MACHINE_ARCH}-elf)
1261169689Skan_startup_libs+=	lib/csu/${MACHINE_ARCH}-elf
1262169689Skan.elif exists(${.CURDIR}/lib/csu/${MACHINE_ARCH})
1263169689Skan_startup_libs+=	lib/csu/${MACHINE_ARCH}
1264169689Skan.else
1265169689Skan_startup_libs+=	lib/csu/${MACHINE_CPUARCH}
1266169689Skan.endif
1267169689Skan_startup_libs+=	gnu/lib/libgcc
1268169689Skan_startup_libs+=	lib/libcompiler_rt
1269169689Skan_startup_libs+=	lib/libc
1270169689Skan.if ${MK_LIBCPLUSPLUS} != "no"
1271169689Skan_startup_libs+=	lib/libcxxrt
1272169689Skan.endif
1273169689Skan
1274169689Skangnu/lib/libgcc__L: lib/libc__L
1275169689Skan.if ${MK_LIBCPLUSPLUS} != "no"
1276169689Skanlib/libcxxrt__L: gnu/lib/libgcc__L
1277169689Skan.endif
1278169689Skan
1279169689Skan_prebuild_libs=	${_kerberos5_lib_libasn1} \
1280169689Skan		${_kerberos5_lib_libhdb} \
1281169689Skan		${_kerberos5_lib_libheimbase} \
1282169689Skan		${_kerberos5_lib_libheimntlm} \
1283169689Skan		${_kerberos5_lib_libheimsqlite} \
1284169689Skan		${_kerberos5_lib_libheimipcc} \
1285169689Skan		${_kerberos5_lib_libhx509} ${_kerberos5_lib_libkrb5} \
1286169689Skan		${_kerberos5_lib_libroken} \
1287169689Skan		${_kerberos5_lib_libwind} \
1288169689Skan		${_lib_atf_libatf_c} \
1289169689Skan		lib/libbz2 ${_libcom_err} lib/libcrypt \
1290169689Skan		lib/libexpat \
1291169689Skan		${_lib_libgssapi} ${_lib_libipx} \
1292169689Skan		lib/libkiconv lib/libkvm lib/liblzma lib/libmd \
1293169689Skan		lib/ncurses/ncurses lib/ncurses/ncursesw \
1294169689Skan		lib/libopie lib/libpam ${_lib_libthr} \
1295169689Skan		lib/libradius lib/libsbuf lib/libtacplus \
1296169689Skan		${_cddl_lib_libumem} ${_cddl_lib_libnvpair} \
1297169689Skan		lib/libutil ${_lib_libypclnt} lib/libz lib/msun \
1298169689Skan		${_secure_lib_libcrypto} ${_secure_lib_libssh} \
1299169689Skan		${_secure_lib_libssl}
1300169689Skan
1301169689Skan.if ${MK_ATF} != "no"
1302169689Skan_lib_atf_libatf_c=	lib/atf/libatf-c
1303169689Skan.endif
1304169689Skan
1305169689Skan.if ${MK_LIBTHR} != "no"
1306169689Skan_lib_libthr=	lib/libthr
1307169689Skan.endif
1308169689Skan
1309169689Skan.if ${MK_OFED} != "no"
1310169689Skan_ofed_lib=	contrib/ofed/usr.lib/
1311169689Skan.endif
1312169689Skan
1313169689Skan_generic_libs=	${_cddl_lib} gnu/lib ${_kerberos5_lib} lib ${_secure_lib} usr.bin/lex/lib ${_ofed_lib}
1314169689Skan.for _DIR in ${LOCAL_LIB_DIRS}
1315169689Skan.if exists(${.CURDIR}/${_DIR}/Makefile)
1316169689Skan_generic_libs+= ${_DIR}
1317169689Skan.endif
1318169689Skan.endfor
1319169689Skan
1320169689Skanlib/libopie__L lib/libtacplus__L: lib/libmd__L
1321169689Skan
1322169689Skan.if ${MK_CDDL} != "no"
1323169689Skan_cddl_lib_libumem= cddl/lib/libumem
1324169689Skan_cddl_lib_libnvpair= cddl/lib/libnvpair
1325169689Skan_cddl_lib= cddl/lib
1326169689Skan.endif
1327169689Skan
1328169689Skan.if ${MK_CRYPT} != "no"
1329169689Skan.if ${MK_OPENSSL} != "no"
1330169689Skan_secure_lib_libcrypto= secure/lib/libcrypto
1331169689Skan_secure_lib_libssl= secure/lib/libssl
1332169689Skanlib/libradius__L secure/lib/libssl__L: secure/lib/libcrypto__L
1333169689Skan.if ${MK_OPENSSH} != "no"
1334169689Skan_secure_lib_libssh= secure/lib/libssh
1335169689Skansecure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L
1336169689Skan.if ${MK_KERBEROS_SUPPORT} != "no"
1337169689Skansecure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libkrb5__L \
1338169689Skan    kerberos5/lib/libhx509__L kerberos5/lib/libasn1__L lib/libcom_err__L \
1339169689Skan    lib/libmd__L kerberos5/lib/libroken__L
1340169689Skan.endif
1341169689Skan.endif
1342169689Skan.endif
1343169689Skan_secure_lib=	secure/lib
1344169689Skan.endif
1345169689Skan
1346169689Skan.if ${MK_KERBEROS} != "no"
1347169689Skankerberos5/lib/libasn1__L: lib/libcom_err__L kerberos5/lib/libroken__L
1348169689Skankerberos5/lib/libhdb__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
1349169689Skan    kerberos5/lib/libkrb5__L kerberos5/lib/libroken__L \
1350169689Skan    kerberos5/lib/libwind__L kerberos5/lib/libheimsqlite__L 
1351169689Skankerberos5/lib/libheimntlm__L: secure/lib/libcrypto__L kerberos5/lib/libkrb5__L \
1352169689Skan    kerberos5/lib/libroken__L lib/libcom_err__L
1353169689Skankerberos5/lib/libhx509__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
1354169689Skan    secure/lib/libcrypto__L kerberos5/lib/libroken__L kerberos5/lib/libwind__L
1355169689Skankerberos5/lib/libkrb5__L: kerberos5/lib/libasn1__L lib/libcom_err__L \
1356169689Skan    lib/libcrypt__L secure/lib/libcrypto__L kerberos5/lib/libhx509__L \
1357169689Skan    kerberos5/lib/libroken__L kerberos5/lib/libwind__L \
1358169689Skan    kerberos5/lib/libheimbase__L kerberos5/lib/libheimipcc__L
1359169689Skankerberos5/lib/libroken__L: lib/libcrypt__L
1360169689Skankerberos5/lib/libwind__L: kerberos5/lib/libroken__L lib/libcom_err__L
1361169689Skankerberos5/lib/libheimbase__L: lib/libthr__L
1362169689Skankerberos5/lib/libheimipcc__L: kerberos5/lib/libroken__L kerberos5/lib/libheimbase__L lib/libthr__L
1363169689Skankerberos5/lib/libheimsqlite__L: lib/libthr__L
1364169689Skan.endif
1365169689Skan
1366169689Skan.if ${MK_GSSAPI} != "no"
1367169689Skan_lib_libgssapi=	lib/libgssapi
1368169689Skan.endif
1369169689Skan
1370169689Skan.if ${MK_IPX} != "no"
1371169689Skan_lib_libipx=	lib/libipx
1372169689Skan.endif
1373169689Skan
1374169689Skan.if ${MK_KERBEROS} != "no"
1375169689Skan_kerberos5_lib=	kerberos5/lib
1376169689Skan_kerberos5_lib_libasn1= kerberos5/lib/libasn1
1377169689Skan_kerberos5_lib_libhdb= kerberos5/lib/libhdb
1378169689Skan_kerberos5_lib_libheimbase= kerberos5/lib/libheimbase
1379169689Skan_kerberos5_lib_libkrb5= kerberos5/lib/libkrb5
1380169689Skan_kerberos5_lib_libhx509= kerberos5/lib/libhx509
1381169689Skan_kerberos5_lib_libroken= kerberos5/lib/libroken
1382169689Skan_kerberos5_lib_libheimntlm= kerberos5/lib/libheimntlm
1383169689Skan_kerberos5_lib_libheimsqlite= kerberos5/lib/libheimsqlite
1384169689Skan_kerberos5_lib_libheimipcc= kerberos5/lib/libheimipcc
1385169689Skan_kerberos5_lib_libwind= kerberos5/lib/libwind
1386169689Skan_libcom_err= lib/libcom_err
1387169689Skan.endif
1388169689Skan
1389169689Skan.if ${MK_NIS} != "no"
1390169689Skan_lib_libypclnt=	lib/libypclnt
1391169689Skan.endif
1392169689Skan
1393169689Skan.if ${MK_OPENSSL} == "no"
1394169689Skanlib/libradius__L: lib/libmd__L
1395169689Skan.endif
1396169689Skan
1397169689Skan.for _lib in ${_prereq_libs}
1398169689Skan${_lib}__PL: .PHONY
1399169689Skan.if exists(${.CURDIR}/${_lib})
1400169689Skan	${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
1401169689Skan		cd ${.CURDIR}/${_lib}; \
1402169689Skan		${MAKE} DIRPRFX=${_lib}/ obj; \
1403169689Skan		${MAKE} DIRPRFX=${_lib}/ depend; \
1404169689Skan		${MAKE} -DNO_PROFILE -DNO_PIC DIRPRFX=${_lib}/ all; \
1405169689Skan		${MAKE} -DNO_PROFILE -DNO_PIC DIRPRFX=${_lib}/ install
1406169689Skan.endif
1407169689Skan.endfor
1408169689Skan
1409169689Skan.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs}
1410169689Skan${_lib}__L: .PHONY
1411169689Skan.if exists(${.CURDIR}/${_lib})
1412169689Skan	${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
1413169689Skan		cd ${.CURDIR}/${_lib}; \
1414169689Skan		${MAKE} DIRPRFX=${_lib}/ obj; \
1415169689Skan		${MAKE} DIRPRFX=${_lib}/ depend; \
1416169689Skan		${MAKE} DIRPRFX=${_lib}/ all; \
1417169689Skan		${MAKE} DIRPRFX=${_lib}/ install
1418169689Skan.endif
1419169689Skan.endfor
1420169689Skan
1421169689Skan# libpam is special: we need to build static PAM modules before
1422169689Skan# static PAM library, and dynamic PAM library before dynamic PAM
1423169689Skan# modules.
1424169689Skanlib/libpam__L: .PHONY
1425169689Skan	${_+_}@${ECHODIR} "===> lib/libpam (obj,depend,all,install)"; \
1426169689Skan		cd ${.CURDIR}/lib/libpam; \
1427169689Skan		${MAKE} DIRPRFX=lib/libpam/ obj; \
1428169689Skan		${MAKE} DIRPRFX=lib/libpam/ depend; \
1429169689Skan		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET all; \
1430169689Skan		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET install
1431169689Skan
1432169689Skan_prereq_libs: ${_prereq_libs:S/$/__PL/}
1433169689Skan_startup_libs: ${_startup_libs:S/$/__L/}
1434169689Skan_prebuild_libs: ${_prebuild_libs:S/$/__L/}
1435169689Skan_generic_libs: ${_generic_libs:S/$/__L/}
1436169689Skan
1437169689Skan.for __target in all clean cleandepend cleandir depend includes obj
1438169689Skan.for entry in ${SUBDIR}
1439169689Skan${entry}.${__target}__D: .PHONY
1440169689Skan	${_+_}@if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \
1441169689Skan		${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE_ARCH} (${__target})"; \
1442169689Skan		edir=${entry}.${MACHINE_ARCH}; \
1443169689Skan		cd ${.CURDIR}/$${edir}; \
1444169689Skan	else \
1445169689Skan		${ECHODIR} "===> ${DIRPRFX}${entry} (${__target})"; \
1446169689Skan		edir=${entry}; \
1447169689Skan		cd ${.CURDIR}/$${edir}; \
1448169689Skan	fi; \
1449169689Skan	${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/
1450169689Skan.endfor
1451169689Skanpar-${__target}: ${SUBDIR:S/$/.${__target}__D/}
1452169689Skan.endfor
1453169689Skan
1454169689Skan.include <bsd.subdir.mk>
1455169689Skan
1456169689Skan.if make(check-old) || make(check-old-dirs) || \
1457169689Skan    make(check-old-files) || make(check-old-libs) || \
1458169689Skan    make(delete-old) || make(delete-old-dirs) || \
1459169689Skan    make(delete-old-files) || make(delete-old-libs)
1460169689Skan
1461169689Skan#
1462169689Skan# check for / delete old files section
1463169689Skan#
1464169689Skan
1465169689Skan.include "ObsoleteFiles.inc"
1466169689Skan
1467169689SkanOLD_LIBS_MESSAGE="Please be sure no application still uses those libraries, \
1468169689Skanelse you can not start such an application. Consult UPDATING for more \
1469169689Skaninformation regarding how to cope with the removal/revision bump of a \
1470169689Skanspecific library."
1471169689Skan
1472169689Skan.if !defined(BATCH_DELETE_OLD_FILES)
1473169689SkanRM_I=-i
1474169689Skan.else
1475169689SkanRM_I=-v
1476169689Skan.endif
1477169689Skan
1478169689Skandelete-old-files:
1479169689Skan	@echo ">>> Removing old files (only deletes safe to delete libs)"
1480169689Skan# Ask for every old file if the user really wants to remove it.
1481169689Skan# It's annoying, but better safe than sorry.
1482169689Skan# NB: We cannot pass the list of OLD_FILES as a parameter because the
1483169689Skan# argument list will get too long. Using .for/.endfor make "loops" will make
1484169689Skan# the Makefile parser segfault.
1485169689Skan	@exec 3<&0; \
1486169689Skan	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
1487169689Skan	    -V OLD_FILES -V "OLD_FILES:Musr/share/*.gz:R" | xargs -n1 | \
1488169689Skan	while read file; do \
1489169689Skan		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
1490169689Skan			chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \
1491169689Skan			rm ${RM_I} "${DESTDIR}/$${file}" <&3; \
1492169689Skan		fi; \
1493169689Skan	done
1494169689Skan# Remove catpages without corresponding manpages.
1495169689Skan	@exec 3<&0; \
1496169689Skan	find ${DESTDIR}/usr/share/man/cat* ! -type d | \
1497169689Skan	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
1498169689Skan	while read catpage; do \
1499169689Skan		read manpage; \
1500169689Skan		if [ ! -e "$${manpage}" ]; then \
1501169689Skan			rm ${RM_I} $${catpage} <&3; \
1502169689Skan	        fi; \
1503169689Skan	done
1504169689Skan	@echo ">>> Old files removed"
1505169689Skan
1506169689Skancheck-old-files:
1507169689Skan	@echo ">>> Checking for old files"
1508169689Skan	@${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
1509169689Skan	    -V OLD_FILES -V "OLD_FILES:Musr/share/*.gz:R" | xargs -n1 | \
1510169689Skan	while read file; do \
1511169689Skan		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
1512169689Skan		 	echo "${DESTDIR}/$${file}"; \
1513169689Skan		fi; \
1514169689Skan	done
1515169689Skan# Check for catpages without corresponding manpages.
1516169689Skan	@find ${DESTDIR}/usr/share/man/cat* ! -type d | \
1517169689Skan	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
1518169689Skan	while read catpage; do \
1519169689Skan		read manpage; \
1520169689Skan		if [ ! -e "$${manpage}" ]; then \
1521169689Skan			echo $${catpage}; \
1522169689Skan	        fi; \
1523169689Skan	done
1524169689Skan
1525169689Skandelete-old-libs:
1526169689Skan	@echo ">>> Removing old libraries"
1527169689Skan	@echo "${OLD_LIBS_MESSAGE}" | fmt
1528169689Skan	@exec 3<&0; \
1529169689Skan	${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
1530169689Skan	    -V OLD_LIBS | xargs -n1 | \
1531169689Skan	while read file; do \
1532169689Skan		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
1533169689Skan			chflags noschg "${DESTDIR}/$${file}" 2>/dev/null || true; \
1534169689Skan			rm ${RM_I} "${DESTDIR}/$${file}" <&3; \
1535169689Skan		fi; \
1536169689Skan	done
1537169689Skan	@echo ">>> Old libraries removed"
1538169689Skan
1539169689Skancheck-old-libs:
1540169689Skan	@echo ">>> Checking for old libraries"
1541169689Skan	@${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
1542169689Skan	    -V OLD_LIBS | xargs -n1 | \
1543169689Skan	while read file; do \
1544169689Skan		if [ -f "${DESTDIR}/$${file}" -o -L "${DESTDIR}/$${file}" ]; then \
1545169689Skan			echo "${DESTDIR}/$${file}"; \
1546169689Skan		fi; \
1547169689Skan	done
1548169689Skan
1549169689Skandelete-old-dirs:
1550169689Skan	@echo ">>> Removing old directories"
1551169689Skan	@${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
1552169689Skan	    -V OLD_DIRS | xargs -n1 | \
1553169689Skan	while read dir; do \
1554169689Skan		if [ -d "${DESTDIR}/$${dir}" ]; then \
1555169689Skan			rmdir -v "${DESTDIR}/$${dir}" || true; \
1556169689Skan		elif [ -L "${DESTDIR}/$${dir}" ]; then \
1557169689Skan			echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \
1558169689Skan		fi; \
1559169689Skan	done
1560169689Skan	@echo ">>> Old directories removed"
1561169689Skan
1562169689Skancheck-old-dirs:
1563169689Skan	@echo ">>> Checking for old directories"
1564169689Skan	@${MAKE} -f ${.CURDIR}/Makefile.inc1 ${.MAKEFLAGS} ${.TARGET} \
1565169689Skan	    -V OLD_DIRS | xargs -n1 | \
1566169689Skan	while read dir; do \
1567169689Skan		if [ -d "${DESTDIR}/$${dir}" ]; then \
1568169689Skan			echo "${DESTDIR}/$${dir}"; \
1569169689Skan		elif [ -L "${DESTDIR}/$${dir}" ]; then \
1570169689Skan			echo "${DESTDIR}/$${dir} is a link, please remove everything manually."; \
1571169689Skan		fi; \
1572169689Skan	done
1573169689Skan
1574169689Skandelete-old: delete-old-files delete-old-dirs
1575169689Skan	@echo "To remove old libraries run '${MAKE} delete-old-libs'."
1576169689Skan
1577169689Skancheck-old: check-old-files check-old-libs check-old-dirs
1578169689Skan	@echo "To remove old files and directories run '${MAKE} delete-old'."
1579169689Skan	@echo "To remove old libraries run '${MAKE} delete-old-libs'."
1580169689Skan
1581169689Skan.endif
1582169689Skan
1583169689Skan#
1584169689Skan# showconfig - show build configuration.
1585169689Skan#
1586169689Skanshowconfig:
1587169689Skan	@${MAKE} -n -f bsd.own.mk -V dummy -dg1 2>&1 | grep ^MK_ | sort
1588169689Skan
1589169689Skan.if !empty(KRNLOBJDIR) && !empty(KERNCONF)
1590169689SkanDTBOUTPUTPATH= ${KRNLOBJDIR}/${KERNCONF}/
1591169689Skan
1592169689Skan.if !defined(FDT_DTS_FILE) || empty(FDT_DTS_FILE)
1593169689Skan.if exists(${KERNCONFDIR}/${KERNCONF})
1594169689SkanFDT_DTS_FILE!= awk 'BEGIN {FS="="} /^makeoptions[[:space:]]+FDT_DTS_FILE/ {print $$2}' \
1595169689Skan	${KERNCONFDIR}/${KERNCONF} ; echo
1596169689Skan.endif
1597169689Skan.endif
1598169689Skan
1599169689Skan.endif
1600169689Skan
1601169689Skan.if !defined(DTBOUTPUTPATH) || !exists(${DTBOUTPUTPATH})
1602169689SkanDTBOUTPUTPATH= ${.CURDIR}
1603169689Skan.endif
1604169689Skan
1605169689Skan#
1606169689Skan# Build 'standalone' Device Tree Blob
1607169689Skan#
1608169689Skanbuilddtb:
1609169689Skan	@if [ "${FDT_DTS_FILE}" = "" ]; then \
1610169689Skan		echo "ERROR: FDT_DTS_FILE must be specified!"; \
1611169689Skan		exit 1; \
1612169689Skan	fi;	\
1613169689Skan	if [ ! -f ${.CURDIR}/sys/boot/fdt/dts/${FDT_DTS_FILE} ]; then \
1614169689Skan		echo "ERROR: Specified DTS file (${FDT_DTS_FILE}) does not \
1615169689Skan			exist!"; \
1616169689Skan		exit 1;	\
1617169689Skan	fi;	\
1618169689Skan	if [ "${DTBOUTPUTPATH}" = "${.CURDIR}" ]; then	\
1619169689Skan		echo "WARNING: DTB will be placed in the current working \
1620169689Skan			directory"; \
1621169689Skan	fi
1622169689Skan	@PATH=${TMPPATH} \
1623169689Skan	dtc -O dtb -o \
1624169689Skan	    ${DTBOUTPUTPATH}/`echo ${FDT_DTS_FILE} | cut -d. -f1`.dtb -b 0 \
1625169689Skan	    -p 1024 ${.CURDIR}/sys/boot/fdt/dts/${FDT_DTS_FILE}
1626169689Skan
1627169689Skan###############
1628169689Skan
1629169689Skan.if defined(XDEV) && defined(XDEV_ARCH)
1630169689Skan
1631169689Skan.if ${XDEV} == ${MACHINE} && ${XDEV_ARCH} == ${MACHINE_ARCH}
1632169689SkanXDEV_CPUTYPE?=${CPUTYPE}
1633169689Skan.else
1634169689SkanXDEV_CPUTYPE?=${TARGET_CPUTYPE}
1635169689Skan.endif
1636169689Skan
1637169689SkanNOFUN=-DNO_FSCHG -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT \
1638169689Skan	-DWITHOUT_MAN -DWITHOUT_NLS -DNO_PROFILE \
1639169689Skan	-DWITHOUT_KERBEROS -DWITHOUT_RESCUE -DNO_WARNS \
1640169689Skan	TARGET=${XDEV} TARGET_ARCH=${XDEV_ARCH} \
1641169689Skan	CPUTYPE=${XDEV_CPUTYPE}
1642169689Skan
1643169689SkanXDDIR=${XDEV_ARCH}-freebsd
1644169689SkanXDTP=/usr/${XDDIR}
1645169689SkanCDBENV=MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/${XDDIR}
1646169689SkanCDENV= ${CDBENV} \
1647169689Skan	_SHLIBDIRPREFIX=${XDTP} \
1648169689Skan	TOOLS_PREFIX=${XDTP}
1649169689SkanCD2ENV=${CDENV} \
1650169689Skan	MACHINE=${XDEV} MACHINE_ARCH=${XDEV_ARCH}
1651169689Skan
1652169689SkanCDTMP=	${MAKEOBJDIRPREFIX}/${XDEV}/${.CURDIR}/tmp
1653169689SkanCDMAKE=${CDENV} ${MAKE} ${NOFUN}
1654169689SkanCD2MAKE=${CD2ENV} PATH=${CDTMP}/usr/bin:${XDTP}/usr/bin:${PATH} ${MAKE} ${NOFUN}
1655169689SkanXDDESTDIR=${DESTDIR}${XDTP}
1656169689Skan.if !defined(OSREL)
1657169689SkanOSREL!= uname -r | sed -e 's/[-(].*//'
1658169689Skan.endif
1659169689Skan
1660169689Skan.ORDER: xdev-build xdev-install
1661169689Skanxdev: xdev-build xdev-install
1662169689Skan
1663169689Skan.ORDER: _xb-build-tools _xb-cross-tools
1664169689Skanxdev-build: _xb-build-tools _xb-cross-tools
1665169689Skan
1666169689Skan_xb-build-tools:
1667169689Skan	${_+_}@cd ${.CURDIR}; \
1668169689Skan	${CDBENV} ${MAKE} -f Makefile.inc1 ${NOFUN} build-tools
1669169689Skan
1670169689Skan_xb-cross-tools:
1671169689Skan.for _tool in \
1672169689Skan    gnu/usr.bin/binutils \
1673169689Skan    gnu/usr.bin/cc \
1674169689Skan    usr.bin/ar
1675169689Skan	${_+_}@${ECHODIR} "===> xdev ${_tool} (obj,depend,all)"; \
1676169689Skan	cd ${.CURDIR}/${_tool}; \
1677169689Skan	${CDMAKE} DIRPRFX=${_tool}/ obj; \
1678169689Skan	${CDMAKE} DIRPRFX=${_tool}/ depend; \
1679169689Skan	${CDMAKE} DIRPRFX=${_tool}/ all
1680169689Skan.endfor
1681169689Skan
1682169689Skan_xi-mtree:
1683169689Skan	${_+_}@${ECHODIR} "mtree populating ${XDDESTDIR}"
1684169689Skan	mkdir -p ${XDDESTDIR}
1685169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.root.dist \
1686169689Skan	    -p ${XDDESTDIR} >/dev/null
1687169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
1688169689Skan	    -p ${XDDESTDIR}/usr >/dev/null
1689169689Skan	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
1690169689Skan	    -p ${XDDESTDIR}/usr/include >/dev/null
1691169689Skan
1692169689Skan.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links
1693169689Skanxdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links
1694169689Skan
1695169689Skan_xi-cross-tools:
1696169689Skan	@echo "_xi-cross-tools"
1697169689Skan.for _tool in \
1698169689Skan    gnu/usr.bin/binutils \
1699169689Skan    gnu/usr.bin/cc \
1700169689Skan    usr.bin/ar
1701169689Skan	${_+_}@${ECHODIR} "===> xdev ${_tool} (install)"; \
1702169689Skan	cd ${.CURDIR}/${_tool}; \
1703169689Skan	${CDMAKE} DIRPRFX=${_tool}/ install DESTDIR=${XDDESTDIR}
1704169689Skan.endfor
1705169689Skan
1706169689Skan_xi-includes:
1707169689Skan	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 par-includes \
1708169689Skan		DESTDIR=${XDDESTDIR}
1709169689Skan
1710169689Skan_xi-libraries:
1711169689Skan	${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 libraries \
1712169689Skan		DESTDIR=${XDDESTDIR}
1713169689Skan
1714169689Skan_xi-links:
1715169689Skan	${_+_}cd ${XDDESTDIR}/usr/bin; \
1716169689Skan		for i in *; do \
1717169689Skan			ln -sf ../../${XDTP}/usr/bin/$$i \
1718169689Skan			    ../../../../usr/bin/${XDDIR}-$$i; \
1719169689Skan			ln -sf ../../${XDTP}/usr/bin/$$i \
1720169689Skan			    ../../../../usr/bin/${XDDIR}${OSREL}-$$i; \
1721169689Skan		done
1722169689Skan.else
1723169689Skanxdev xdev-buil xdev-install:
1724169689Skan	@echo "*** Error: Both XDEV and XDEV_ARCH must be defined for \"${.TARGET}\" target"
1725169689Skan.endif
1726169689Skan