Makefile.libcompat revision 163099
1212904Sdim#
2193323Sed# $FreeBSD: head/Makefile.inc1 163099 2006-10-07 18:34:08Z ru $
3193323Sed#
4193323Sed# Make command line options:
5193323Sed#	-DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
6193323Sed#	-DNO_CLEAN do not clean at all
7193323Sed#	-DNO_SHARE do not go into share subdir
8193323Sed#	-DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
9193323Sed#	-DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
10193323Sed#	-DNO_KERNELDEPEND do not run ${MAKE} depend in ${MAKE} buildkernel
11193323Sed#	-DNO_PORTSUPDATE do not update ports in ${MAKE} update
12193323Sed#	-DNO_DOCUPDATE do not update doc in ${MAKE} update
13193323Sed#	LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
14193323Sed#	TARGET="machine" to crossbuild world for a different machine type
15193323Sed
16193323Sed#
17193323Sed# The intended user-driven targets are:
18193323Sed# buildworld  - rebuild *everything*, including glue to help do upgrades
19193323Sed# installworld- install everything built by "buildworld"
20193323Sed# doxygen     - build API documentation of the kernel
21193323Sed# update      - convenient way to update your source tree (eg: cvsup/cvs)
22193323Sed#
23193323Sed# Standard targets (not defined here) are documented in the makefiles in
24193323Sed# /usr/share/mk.  These include:
25193323Sed#		obj depend all install clean cleandepend cleanobj
26252723Sdim
27252723Sdim.include <bsd.own.mk>
28263509Sdim
29252723Sdim# We must do share/info early so that installation of info `dir'
30252723Sdim# entries works correctly.  Do it first since it is less likely to
31212904Sdim# grow dependencies on include and lib than vice versa.
32252723Sdim#
33193323Sed# We must do lib and libexec before bin, because if installworld
34252723Sdim# installs a new /bin/sh, the 'make' command will *immediately*
35252723Sdim# use that new version.  And the new (dynamically-linked) /bin/sh
36235633Sdim# will expect to find appropriate libraries in /lib and /libexec.
37198090Srdivacky#
38193323Sed# We must do etc last for install/distribute to work.
39252723Sdim#
40252723SdimSUBDIR=	share/info include lib libexec bin
41252723Sdim.if ${MK_GAMES} != "no"
42223017SdimSUBDIR+=games
43193323Sed.endif
44198090SrdivackySUBDIR+=gnu
45198090Srdivacky.if ${MK_KERBEROS} != "no"
46252723SdimSUBDIR+=kerberos5
47252723Sdim.endif
48252723Sdim.if ${MK_RESCUE} != "no"
49193323SedSUBDIR+=rescue
50193323Sed.endif
51193323SedSUBDIR+=sbin
52199511Srdivacky.if ${MK_CRYPT} != "no"
53193323SedSUBDIR+=secure
54218893Sdim.endif
55199511Srdivacky.if !defined(NO_SHARE)
56218893SdimSUBDIR+=share
57193323Sed.endif
58199511SrdivackySUBDIR+=sys usr.bin usr.sbin etc
59193323Sed
60193323Sed# These are last, since it is nice to at least get the base system
61193323Sed# rebuilt before you do them.
62199511Srdivacky.for _DIR in ${LOCAL_DIRS}
63218893Sdim.if exists(${.CURDIR}/${_DIR}/Makefile)
64193323SedSUBDIR+= ${_DIR}
65198090Srdivacky.endif
66193323Sed.endfor
67193323Sed
68224145Sdim.if defined(SUBDIR_OVERRIDE)
69193323SedSUBDIR=		${SUBDIR_OVERRIDE}
70193323Sed.endif
71193323Sed
72193323Sed.if defined(NOCLEAN)
73193323SedNO_CLEAN=	${NOCLEAN}
74193323Sed.endif
75235633Sdim.if defined(NO_CLEANDIR)
76193323SedCLEANDIR=	clean cleandepend
77193323Sed.else
78245431SdimCLEANDIR=	cleandir
79193323Sed.endif
80226890Sdim
81245431SdimCVS?=		cvs
82226890SdimCVSFLAGS?=	-A -P -d -I!
83193323SedSUP?=		/usr/bin/csup
84193323SedSUPFLAGS?=	-g -L 2
85198090Srdivacky.if defined(SUPHOST)
86235633SdimSUPFLAGS+=	-h ${SUPHOST}
87198090Srdivacky.endif
88193323Sed
89218893SdimMAKEOBJDIRPREFIX?=	/usr/obj
90218893Sdim.if !defined(OSRELDATE)
91193323Sed.if exists(/usr/include/osreldate.h)
92193323SedOSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
93193323Sed		/usr/include/osreldate.h
94193323Sed.else
95245431SdimOSRELDATE=	0
96245431Sdim.endif
97193323Sed.endif
98193323Sed
99193323Sed# Guess machine architecture from machine type, and vice versa.
100193323Sed.if !defined(TARGET_ARCH) && defined(TARGET)
101193323SedTARGET_ARCH=	${TARGET:S/pc98/i386/}
102193323Sed.elif !defined(TARGET) && defined(TARGET_ARCH) && \
103193323Sed    ${TARGET_ARCH} != ${MACHINE_ARCH}
104193323SedTARGET=		${TARGET_ARCH}
105193323Sed.endif
106193323Sed# Otherwise, default to current machine type and architecture.
107193323SedTARGET?=	${MACHINE}
108193323SedTARGET_ARCH?=	${MACHINE_ARCH}
109193323Sed
110193323SedKNOWN_ARCHES?=	amd64 arm i386 i386/pc98 ia64 powerpc sparc64
111193323Sed.if ${TARGET} == ${TARGET_ARCH}
112193323Sed_t=		${TARGET}
113193323Sed.else
114193323Sed_t=		${TARGET_ARCH}/${TARGET}
115193323Sed.endif
116193323Sed.for _t in ${_t}
117193323Sed.if empty(KNOWN_ARCHES:M${_t})
118193323Sed.error Unknown target ${TARGET_ARCH}:${TARGET}.
119199511Srdivacky.endif
120199511Srdivacky.endfor
121199511Srdivacky
122199511Srdivacky.if ${TARGET} == ${MACHINE}
123245431SdimTARGET_CPUTYPE?=${CPUTYPE}
124245431Sdim.else
125245431SdimTARGET_CPUTYPE?=
126193323Sed.endif
127193323Sed
128193323Sed.if !empty(TARGET_CPUTYPE)
129193323Sed_TARGET_CPUTYPE=${TARGET_CPUTYPE}
130193323Sed.else
131193323Sed_TARGET_CPUTYPE=dummy
132193323Sed.endif
133193323Sed_CPUTYPE!=	MAKEFLAGS= CPUTYPE=${_TARGET_CPUTYPE} ${MAKE} \
134193323Sed		-f /dev/null -m ${.CURDIR}/share/mk -V CPUTYPE
135193323Sed.if ${_CPUTYPE} != ${_TARGET_CPUTYPE}
136193323Sed.error CPUTYPE global should be set with ?=.
137193323Sed.endif
138193323Sed.if make(buildworld)
139193323SedBUILD_ARCH!=	uname -p
140193323Sed.if ${MACHINE_ARCH} != ${BUILD_ARCH}
141193323Sed.error To cross-build, set TARGET_ARCH.
142193323Sed.endif
143193323Sed.endif
144193323Sed.if ${MACHINE} == ${TARGET} && !defined(CROSS_BUILD_TESTING)
145193323SedOBJTREE=	${MAKEOBJDIRPREFIX}
146193323Sed.else
147199511SrdivackyOBJTREE=	${MAKEOBJDIRPREFIX}/${TARGET}
148199511Srdivacky.endif
149199511SrdivackyWORLDTMP=	${OBJTREE}${.CURDIR}/tmp
150199511Srdivacky# /usr/games added for fortune which depend on strfile
151199511SrdivackyBPATH=		${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/usr/games
152199511SrdivackyXPATH=		${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin:${WORLDTMP}/usr/games
153199511SrdivackySTRICTTMPPATH=	${BPATH}:${XPATH}
154199511SrdivackyTMPPATH=	${STRICTTMPPATH}:${PATH}
155199511Srdivacky
156199511SrdivackyINSTALLTMP!=	/usr/bin/mktemp -d -u -t install
157199511Srdivacky
158199511Srdivacky#
159199511Srdivacky# Building a world goes through the following stages
160199511Srdivacky#
161199511Srdivacky# 1. legacy stage [BMAKE]
162199511Srdivacky#	This stage is responsible for creating compatibility
163199511Srdivacky#	shims that are needed by the bootstrap-tools,
164199511Srdivacky#	build-tools and cross-tools stages.
165199511Srdivacky# 1. bootstrap-tools stage [BMAKE]
166199511Srdivacky#	This stage is responsible for creating programs that
167199511Srdivacky#	are needed for backward compatibility reasons. They
168199511Srdivacky#	are not built as cross-tools.
169199511Srdivacky# 2. build-tools stage [TMAKE]
170199511Srdivacky#	This stage is responsible for creating the object
171199511Srdivacky#	tree and building any tools that are needed during
172199511Srdivacky#	the build process.
173199511Srdivacky# 3. cross-tools stage [XMAKE]
174199511Srdivacky#	This stage is responsible for creating any tools that
175193323Sed#	are needed for cross-builds. A cross-compiler is one
176193323Sed#	of them.
177193323Sed# 4. world stage [WMAKE]
178193323Sed#	This stage actually builds the world.
179193323Sed# 5. install stage (optional) [IMAKE]
180193323Sed#	This stage installs a previously built world.
181193323Sed#
182193323Sed
183193323SedBOOTSTRAPPING?=	0
184193323Sed
185198090Srdivacky# Common environment for world related stages
186193323SedCROSSENV=	MAKEOBJDIRPREFIX=${OBJTREE} \
187193323Sed		MACHINE_ARCH=${TARGET_ARCH} \
188235633Sdim		MACHINE=${TARGET} \
189245431Sdim		CPUTYPE=${TARGET_CPUTYPE} \
190235633Sdim		GROFF_BIN_PATH=${WORLDTMP}/legacy/usr/bin \
191235633Sdim		GROFF_FONT_PATH=${WORLDTMP}/legacy/usr/share/groff_font \
192199511Srdivacky		GROFF_TMAC_PATH=${WORLDTMP}/legacy/usr/share/tmac
193199511Srdivacky
194218893Sdim# bootstrap-tools stage
195218893SdimBMAKEENV=	INSTALL="sh ${.CURDIR}/tools/install.sh" \
196218893Sdim		PATH=${BPATH}:${PATH} \
197199511Srdivacky		WORLDTMP=${WORLDTMP} \
198193323Sed		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
199193323SedBMAKE=		MAKEOBJDIRPREFIX=${WORLDTMP} \
200245431Sdim		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
201193323Sed		DESTDIR= \
202193323Sed		BOOTSTRAPPING=${OSRELDATE} \
203193323Sed		-DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT -DWITHOUT_MAN \
204245431Sdim		-DWITHOUT_NLS -DNO_PIC -DWITHOUT_PROFILE -DNO_SHARED \
205193323Sed		-DNO_CPU_CFLAGS -DNO_WARNS
206193323Sed
207193323Sed# build-tools stage
208193323SedTMAKE=		MAKEOBJDIRPREFIX=${OBJTREE} \
209193323Sed		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
210193323Sed		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
211193323Sed		DESTDIR= \
212245431Sdim		BOOTSTRAPPING=${OSRELDATE} -DNO_LINT -DNO_CPU_CFLAGS -DNO_WARNS
213245431Sdim
214245431Sdim# cross-tools stage
215245431SdimXMAKE=		TOOLS_PREFIX=${WORLDTMP} ${BMAKE} \
216263509Sdim		TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
217263509Sdim		-DWITHOUT_FORTRAN -DWITHOUT_GDB
218263509Sdim
219263509Sdim# world stage
220193323SedWMAKEENV=	${CROSSENV} \
221245431Sdim		_SHLIBDIRPREFIX=${WORLDTMP} \
222245431Sdim		INSTALL="sh ${.CURDIR}/tools/install.sh" \
223235633Sdim		PATH=${TMPPATH}
224193323SedWMAKE=		${WMAKEENV} ${MAKE} -f Makefile.inc1 DESTDIR=${WORLDTMP}
225202375Srdivacky
226193323Sed.if ${TARGET_ARCH} == "amd64"
227199511Srdivacky# 32 bit world
228199511SrdivackyLIB32TMP=	${OBJTREE}${.CURDIR}/lib32
229199511Srdivacky
230212904Sdim.if empty(TARGET_CPUTYPE)
231245431SdimLIB32CPUTYPE=	k8
232263509Sdim.else
233263509SdimLIB32CPUTYPE=	${TARGET_CPUTYPE}
234263509Sdim.endif
235263509SdimLIB32PREFLAGS=	-m32 -march=${LIB32CPUTYPE} -mfancy-math-387 -DCOMPAT_32BIT
236263509SdimLIB32POSTFLAGS=	-I${LIB32TMP}/usr/include \
237263509Sdim		-L${LIB32TMP}/usr/lib32 \
238193323Sed		-B${LIB32TMP}/usr/lib32
239199511SrdivackyLIB32CC=	${LIB32PREFLAGS} \
240199511Srdivacky		${LIB32POSTFLAGS}
241199511SrdivackyLIB32CXX=	${LIB32PREFLAGS} -I${LIB32TMP}/usr/include/c++/3.4 \
242218893Sdim		${LIB32POSTFLAGS}
243199511SrdivackyLIB32OBJC=	${LIB32PREFLAGS} -I${LIB32TMP}/usr/include/objc \
244218893Sdim		${LIB32POSTFLAGS}
245218893Sdim
246218893Sdim# Yes, the flags are redundant.
247218893SdimLIB32MAKEENV=	MAKEOBJDIRPREFIX=${OBJTREE}/lib32 \
248199511Srdivacky		_SHLIBDIRPREFIX=${LIB32TMP} \
249199511Srdivacky		MACHINE=i386 \
250199511Srdivacky		MACHINE_ARCH=i386 \
251199511Srdivacky		INSTALL="sh ${.CURDIR}/tools/install.sh" \
252199511Srdivacky		PATH=${TMPPATH} \
253199511Srdivacky		CC="${CC} ${LIB32CC}" \
254199511Srdivacky		CXX="${CXX} ${LIB32CXX}" \
255218893Sdim		OBJC="${OBJC} ${LIB32OBJC}" \
256199511Srdivacky		LD="${LD} -m elf_i386_fbsd -Y P,${LIB32TMP}/usr/lib32" \
257199511Srdivacky		AS="${AS} --32" \
258199511Srdivacky		LIBDIR=/usr/lib32 \
259199511Srdivacky		SHLIBDIR=/usr/lib32
260193323Sed
261193323SedLIB32MAKE=	${LIB32MAKEENV} ${MAKE} -DNO_CPU_CFLAGS -DCOMPAT_32BIT \
262199511Srdivacky		-DWITHOUT_BIND -DWITHOUT_MAN -DWITHOUT_NLS -DWITHOUT_INFO \
263212904Sdim		-DWITHOUT_HTML
264218893SdimLIB32IMAKE=	${LIB32MAKE:NINSTALL=*} -DNO_INCS
265193323Sed.endif
266218893Sdim
267218893Sdim# install stage
268193323Sed.if empty(.MAKEFLAGS:M-n)
269193323SedIMAKEENV=	${CROSSENV} \
270218893Sdim		PATH=${STRICTTMPPATH}:${INSTALLTMP}
271218893Sdim.else
272218893SdimIMAKEENV=	${CROSSENV} \
273199481Srdivacky		PATH=${TMPPATH}:${INSTALLTMP}
274199481Srdivacky.endif
275198090SrdivackyIMAKE=		${IMAKEENV} ${MAKE} -f Makefile.inc1
276198090Srdivacky
277193323Sed# kernel stage
278198090SrdivackyKMAKEENV=	${WMAKEENV}
279263509SdimKMAKE=		${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME}
280198090Srdivacky
281198090Srdivacky#
282198090Srdivacky# buildworld
283198090Srdivacky#
284198090Srdivacky# Attempt to rebuild the entire system, with reasonable chance of
285198090Srdivacky# success, regardless of how old your existing system is.
286193323Sed#
287198090Srdivacky_worldtmp:
288193323Sed.if ${.CURDIR:C/[^,]//g} != ""
289193323Sed#	The m4 build of sendmail files doesn't like it if ',' is used
290193323Sed#	anywhere in the path of it's files.
291193323Sed	@echo
292193323Sed	@echo "*** Error: path to source tree contains a comma ','"
293193323Sed	@echo
294224145Sdim	false
295193323Sed.endif
296193323Sed	@echo
297193323Sed	@echo "--------------------------------------------------------------"
298212904Sdim	@echo ">>> Rebuilding the temporary build tree"
299212904Sdim	@echo "--------------------------------------------------------------"
300218893Sdim.if !defined(NO_CLEAN)
301218893Sdim	rm -rf ${WORLDTMP}
302199511Srdivacky.if ${TARGET_ARCH} == "amd64"
303212904Sdim	rm -rf ${LIB32TMP}
304212904Sdim.endif
305212904Sdim.else
306212904Sdim	rm -rf ${WORLDTMP}/legacy/usr/include
307218893Sdim#	XXX - These two can depend on any header file.
308218893Sdim	rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/ioctl.c
309199511Srdivacky	rm -f ${OBJTREE}${.CURDIR}/usr.bin/truss/ioctl.c
310199511Srdivacky.endif
311193323Sed.for _dir in \
312193323Sed    usr/bin usr/games usr/include/c++/3.4 usr/include/sys usr/lib \
313193323Sed    usr/libexec usr/sbin usr/share/dict \
314193323Sed    usr/share/groff_font/devX100 \
315245431Sdim    usr/share/groff_font/devX100-12 \
316245431Sdim    usr/share/groff_font/devX75 \
317252723Sdim    usr/share/groff_font/devX75-12 \
318252723Sdim    usr/share/groff_font/devascii \
319252723Sdim    usr/share/groff_font/devcp1047 \
320235633Sdim    usr/share/groff_font/devdvi \
321235633Sdim    usr/share/groff_font/devhtml \
322218893Sdim    usr/share/groff_font/devkoi8-r \
323218893Sdim    usr/share/groff_font/devlatin1 \
324218893Sdim    usr/share/groff_font/devlbp \
325218893Sdim    usr/share/groff_font/devlj4 \
326218893Sdim    usr/share/groff_font/devps \
327252723Sdim    usr/share/groff_font/devutf8 \
328252723Sdim    usr/share/tmac/mdoc usr/share/tmac/mm
329252723Sdim	mkdir -p ${WORLDTMP}/legacy/${_dir}
330252723Sdim.endfor
331252723Sdim.for _dir in \
332252723Sdim    lib usr/bin usr/include usr/lib/compat/aout usr/libdata/ldscripts \
333252723Sdim    usr/libexec usr/sbin usr/share/misc \
334252723Sdim    usr/share/snmp/defs usr/share/snmp/mibs
335252723Sdim	mkdir -p ${WORLDTMP}/${_dir}
336245431Sdim.endfor
337245431Sdim	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
338245431Sdim	    -p ${WORLDTMP}/usr/include >/dev/null
339245431Sdim	ln -sf ${.CURDIR}/sys ${WORLDTMP}
340245431Sdim.if ${MK_BIND_LIBS} != "no"
341245431Sdim	mtree -deU -f ${.CURDIR}/etc/mtree/BIND.include.dist \
342245431Sdim	    -p ${WORLDTMP}/usr/include >/dev/null
343245431Sdim.endif
344193323Sed_legacy:
345193323Sed	@echo
346193323Sed	@echo "--------------------------------------------------------------"
347193323Sed	@echo ">>> stage 1.1: legacy release compatibility shims"
348252723Sdim	@echo "--------------------------------------------------------------"
349252723Sdim	${_+_}cd ${.CURDIR}; ${BMAKE} legacy
350252723Sdim_bootstrap-tools:
351193323Sed	@echo
352245431Sdim	@echo "--------------------------------------------------------------"
353245431Sdim	@echo ">>> stage 1.2: bootstrap tools"
354252723Sdim	@echo "--------------------------------------------------------------"
355252723Sdim	${_+_}cd ${.CURDIR}; ${BMAKE} bootstrap-tools
356193323Sed_cleanobj:
357193323Sed.if !defined(NO_CLEAN)
358193323Sed	@echo
359193323Sed	@echo "--------------------------------------------------------------"
360198090Srdivacky	@echo ">>> stage 2.1: cleaning up the object tree"
361198090Srdivacky	@echo "--------------------------------------------------------------"
362198090Srdivacky	${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR:S/^/par-/}
363207618Srdivacky.if ${TARGET_ARCH} == "amd64"
364193323Sed	rm -rf ${OBJTREE}/lib32
365198090Srdivacky.endif
366198090Srdivacky.endif
367198090Srdivacky_obj:
368198090Srdivacky	@echo
369198090Srdivacky	@echo "--------------------------------------------------------------"
370235633Sdim	@echo ">>> stage 2.2: rebuilding the object tree"
371198090Srdivacky	@echo "--------------------------------------------------------------"
372198090Srdivacky	${_+_}cd ${.CURDIR}; ${WMAKE} par-obj
373193323Sed_build-tools:
374193323Sed	@echo
375193323Sed	@echo "--------------------------------------------------------------"
376193323Sed	@echo ">>> stage 2.3: build tools"
377198090Srdivacky	@echo "--------------------------------------------------------------"
378193323Sed	${_+_}cd ${.CURDIR}; ${TMAKE} build-tools
379198090Srdivacky_cross-tools:
380218893Sdim	@echo
381218893Sdim	@echo "--------------------------------------------------------------"
382218893Sdim	@echo ">>> stage 3: cross tools"
383218893Sdim	@echo "--------------------------------------------------------------"
384218893Sdim	${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
385193323Sed_includes:
386245431Sdim	@echo
387193323Sed	@echo "--------------------------------------------------------------"
388193323Sed	@echo ">>> stage 4.1: building includes"
389198090Srdivacky	@echo "--------------------------------------------------------------"
390193323Sed	${_+_}cd ${.CURDIR}; ${WMAKE} SHARED=symlinks par-includes
391193323Sed_libraries:
392245431Sdim	@echo
393245431Sdim	@echo "--------------------------------------------------------------"
394245431Sdim	@echo ">>> stage 4.2: building libraries"
395218893Sdim	@echo "--------------------------------------------------------------"
396218893Sdim	${_+_}cd ${.CURDIR}; \
397218893Sdim	    ${WMAKE} -DNO_FSCHG -DWITHOUT_HTML -DWITHOUT_INFO -DNO_LINT \
398218893Sdim	    -DWITHOUT_MAN -DWITHOUT_NLS -DWITHOUT_PROFILE libraries
399193323Sed_depend:
400193323Sed	@echo
401198090Srdivacky	@echo "--------------------------------------------------------------"
402193323Sed	@echo ">>> stage 4.3: make dependencies"
403193323Sed	@echo "--------------------------------------------------------------"
404193323Sed	${_+_}cd ${.CURDIR}; ${WMAKE} par-depend
405218893Sdimeverything:
406218893Sdim	@echo
407198090Srdivacky	@echo "--------------------------------------------------------------"
408193323Sed	@echo ">>> stage 4.4: building everything"
409193323Sed	@echo "--------------------------------------------------------------"
410198090Srdivacky	${_+_}cd ${.CURDIR}; ${WMAKE} par-all
411198090Srdivacky.if ${TARGET_ARCH} == "amd64"
412193323Sedbuild32:
413193323Sed	@echo
414193323Sed	@echo "--------------------------------------------------------------"
415193323Sed	@echo ">>> stage 5.1: building 32 bit shim libraries"
416193323Sed	@echo "--------------------------------------------------------------"
417193323Sed.for _dir in \
418193323Sed    lib lib32 usr/bin usr/include usr/lib32 usr/libdata/ldscripts \
419245431Sdim    usr/libexec usr/sbin usr/share/misc \
420245431Sdim    usr/share/snmp/defs usr/share/snmp/mibs
421245431Sdim	mkdir -p ${LIB32TMP}/${_dir}
422263509Sdim.endfor
423245431Sdim	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
424245431Sdim	    -p ${LIB32TMP}/usr/include >/dev/null
425245431Sdim	mkdir -p ${WORLDTMP}
426245431Sdim	ln -sf ${.CURDIR}/sys ${WORLDTMP}
427245431Sdim.if ${MK_KERBEROS} != "no"
428263509Sdim.for _t in obj depend all
429245431Sdim	cd ${.CURDIR}/kerberos5/tools; \
430245431Sdim	    MAKEOBJDIRPREFIX=${OBJTREE}/lib32 ${MAKE} DESTDIR= ${_t}
431263509Sdim.endfor
432263509Sdim.endif
433263509Sdim.for _t in obj includes
434263509Sdim	cd ${.CURDIR}/include; \
435263509Sdim	    ${LIB32MAKE} DESTDIR=${LIB32TMP} ${_t}
436263509Sdim	cd ${.CURDIR}/lib; \
437263509Sdim	    ${LIB32MAKE} DESTDIR=${LIB32TMP} ${_t}
438263509Sdim	cd ${.CURDIR}/gnu/lib; \
439263509Sdim	    ${LIB32MAKE} DESTDIR=${LIB32TMP} ${_t}
440263509Sdim.if ${MK_CRYPT} != "no"
441263509Sdim	cd ${.CURDIR}/secure/lib; \
442263509Sdim	    ${LIB32MAKE} DESTDIR=${LIB32TMP} ${_t}
443198090Srdivacky.endif
444193323Sed.if ${MK_KERBEROS} != "no"
445193323Sed	cd ${.CURDIR}/kerberos5/lib; \
446193323Sed	    ${LIB32MAKE} DESTDIR=${LIB32TMP} ${_t}
447193323Sed.endif
448193323Sed.endfor
449193323Sed.for _dir in usr.bin/lex/lib
450193323Sed	cd ${.CURDIR}/${_dir}; \
451193323Sed	    ${LIB32MAKE} DESTDIR=${LIB32TMP} obj
452193323Sed.endfor
453198090Srdivacky.for _dir in lib/libncurses lib/libmagic
454218893Sdim	cd ${.CURDIR}/${_dir}; \
455245431Sdim	    MAKEOBJDIRPREFIX=${OBJTREE}/lib32 ${MAKE} DESTDIR= build-tools
456198090Srdivacky.endfor
457198090Srdivacky	cd ${.CURDIR}; \
458198090Srdivacky	    ${LIB32MAKE} -f Makefile.inc1 DESTDIR=${LIB32TMP} libraries 
459198090Srdivacky.for _t in obj depend all
460245431Sdim	cd ${.CURDIR}/libexec/rtld-elf; \
461198090Srdivacky	    PROG=ld-elf32.so.1 ${LIB32MAKE} DESTDIR=${LIB32TMP} ${_t}
462245431Sdim.endfor
463245431Sdim
464198090Srdivackydistribute32 install32:
465198090Srdivacky.if make(distribute32)
466235633Sdim	mkdir -p ${DISTDIR}/${DISTRIBUTION}/usr/lib32	# XXX add to mtree
467245431Sdim.else
468235633Sdim	mkdir -p ${DESTDIR}/usr/lib32			# XXX add to mtree
469245431Sdim.endif
470245431Sdim	cd ${.CURDIR}/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
471245431Sdim	cd ${.CURDIR}/gnu/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
472245431Sdim.if ${MK_CRYPT} != "no"
473245431Sdim	cd ${.CURDIR}/secure/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
474245431Sdim.endif
475245431Sdim	cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIB32IMAKE} ${.TARGET:S/32$//}
476245431Sdim.endif
477245431Sdim
478245431Sdim
479245431SdimWMAKE_TGTS=
480245431Sdim.if !defined(SUBDIR_OVERRIDE)
481245431SdimWMAKE_TGTS+=	_worldtmp _legacy _bootstrap-tools
482245431Sdim.endif
483245431SdimWMAKE_TGTS+=	_cleanobj _obj _build-tools
484252723Sdim.if !defined(SUBDIR_OVERRIDE)
485252723SdimWMAKE_TGTS+=	_cross-tools
486252723Sdim.endif
487263509SdimWMAKE_TGTS+=	_includes _libraries _depend everything
488263509Sdim.if ${TARGET_ARCH} == "amd64" && ${MK_LIB32} != "no"
489193323SedWMAKE_TGTS+=	build32
490193323Sed.endif
491199481Srdivacky
492207618Srdivackybuildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
493207618Srdivacky.ORDER: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
494199481Srdivacky
495199481Srdivackybuildworld_prologue:
496199481Srdivacky	@echo "--------------------------------------------------------------"
497199481Srdivacky	@echo ">>> World build started on `LC_ALL=C date`"
498199481Srdivacky	@echo "--------------------------------------------------------------"
499199481Srdivacky
500199481Srdivackybuildworld_epilogue:
501199481Srdivacky	@echo
502199481Srdivacky	@echo "--------------------------------------------------------------"
503226890Sdim	@echo ">>> World build completed on `LC_ALL=C date`"
504226890Sdim	@echo "--------------------------------------------------------------"
505235633Sdim
506235633Sdim#
507235633Sdim# We need to have this as a target because the indirection between Makefile
508235633Sdim# and Makefile.inc1 causes the correct PATH to be used, rather than a
509235633Sdim# modification of the current environment's PATH.  In addition, we need
510235633Sdim# to quote multiword values.
511235633Sdim# 
512235633Sdimbuildenvvars:
513235633Sdim	@echo ${WMAKEENV:Q}
514235633Sdim
515235633Sdimbuildenv:
516235633Sdim	@echo Entering world for ${TARGET_ARCH}:${TARGET}
517235633Sdim	@cd ${.CURDIR} && env ${WMAKEENV} sh || true
518235633Sdim
519218893SdimTOOLCHAIN_TGTS=	${WMAKE_TGTS:N_depend:Neverything:Nbuild32}
520218893Sdimtoolchain: ${TOOLCHAIN_TGTS}
521218893Sdimkernel-toolchain: ${TOOLCHAIN_TGTS:N_includes:N_libraries}
522218893Sdim
523218893Sdim#
524218893Sdim# installcheck
525245431Sdim#
526245431Sdim# Checks to be sure system is ready for installworld/installkernel.
527245431Sdim#
528245431Sdiminstallcheck:
529245431Sdim
530245431Sdim#
531245431Sdim# Require DESTDIR to be set if installing for a different architecture.
532218893Sdim#
533223017Sdim.if ${TARGET_ARCH} != ${MACHINE_ARCH} || ${TARGET} != ${MACHINE}
534245431Sdim.if !make(distributeworld)
535245431Sdiminstallcheck: installcheck_DESTDIR
536245431Sdiminstallcheck_DESTDIR:
537245431Sdim.if !defined(DESTDIR) || empty(DESTDIR)
538245431Sdim	@echo "ERROR: Please set DESTDIR!"; \
539245431Sdim	false
540245431Sdim.endif
541245431Sdim.endif
542245431Sdim.endif
543245431Sdim
544245431Sdim#
545245431Sdim# Check for missing UIDs/GIDs.
546223017Sdim#
547223017SdimCHECK_UIDS=
548223017SdimCHECK_GIDS=	audit
549223017Sdim.if ${MK_SENDMAIL} != "no"
550223017SdimCHECK_UIDS+=	smmsp
551223017SdimCHECK_GIDS+=	smmsp
552218893Sdim.endif
553218893Sdim.if ${MK_PF} != "no"
554198090SrdivackyCHECK_UIDS+=	proxy
555198090SrdivackyCHECK_GIDS+=	proxy authpf
556198090Srdivacky.endif
557198090Srdivackyinstallcheck: installcheck_UGID
558198090Srdivackyinstallcheck_UGID:
559198090Srdivacky.for uid in ${CHECK_UIDS}
560198090Srdivacky	@if ! `id -u ${uid} >/dev/null 2>&1`; then \
561198090Srdivacky		echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \
562198090Srdivacky		false; \
563198090Srdivacky	fi
564198090Srdivacky.endfor
565198090Srdivacky.for gid in ${CHECK_GIDS}
566198090Srdivacky	@if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \
567198090Srdivacky		echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \
568198090Srdivacky		false; \
569218893Sdim	fi
570198090Srdivacky.endfor
571198090Srdivacky
572198090Srdivacky#
573218893Sdim# distributeworld
574198090Srdivacky#
575198090Srdivacky# Distributes everything compiled by a `buildworld'.
576218893Sdim#
577198090Srdivacky# installworld
578198090Srdivacky#
579198090Srdivacky# Installs everything compiled by a 'buildworld'.
580245431Sdim#
581245431Sdimdistributeworld installworld: installcheck
582198090Srdivacky	mkdir -p ${INSTALLTMP}
583198090Srdivacky	for prog in [ awk cap_mkdb cat chflags chmod chown \
584198090Srdivacky	    date echo egrep find grep install-info \
585198090Srdivacky	    ln lockf make mkdir mtree mv pwd_mkdb rm sed sh sysctl \
586198090Srdivacky	    test true uname wc zic; do \
587198090Srdivacky		cp `which $$prog` ${INSTALLTMP}; \
588198090Srdivacky	done
589198090Srdivacky	${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}
590198090Srdivacky	rm -rf ${INSTALLTMP}
591218893Sdim
592198090Srdivacky#
593198090Srdivacky# reinstall
594218893Sdim#
595198090Srdivacky# If you have a build server, you can NFS mount the source and obj directories
596198090Srdivacky# and do a 'make reinstall' on the *client* to install new binaries from the
597198090Srdivacky# most recent server build.
598198090Srdivacky#
599198090Srdivackyreinstall:
600198090Srdivacky	@echo "--------------------------------------------------------------"
601245431Sdim	@echo ">>> Making hierarchy"
602198090Srdivacky	@echo "--------------------------------------------------------------"
603198090Srdivacky	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 hierarchy
604245431Sdim	@echo
605198090Srdivacky	@echo "--------------------------------------------------------------"
606198090Srdivacky	@echo ">>> Installing everything"
607198090Srdivacky	@echo "--------------------------------------------------------------"
608198090Srdivacky	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
609198090Srdivacky.if ${TARGET_ARCH} == "amd64" && ${MK_LIB32} != "no"
610198090Srdivacky	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install32
611198090Srdivacky.endif
612198090Srdivacky
613198090Srdivackyredistribute:
614252723Sdim	@echo "--------------------------------------------------------------"
615245431Sdim	@echo ">>> Distributing everything"
616245431Sdim	@echo "--------------------------------------------------------------"
617245431Sdim	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
618245431Sdim.if ${TARGET_ARCH} == "amd64" && ${MK_LIB32} != "no"
619245431Sdim	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute32 DISTRIBUTION=lib32
620245431Sdim.endif
621245431Sdim
622245431Sdimdistrib-dirs distribution:
623198090Srdivacky	cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} ${.TARGET}
624198090Srdivacky
625199481Srdivacky#
626198090Srdivacky# buildkernel and installkernel
627198090Srdivacky#
628198090Srdivacky# Which kernels to build and/or install is specified by setting
629198090Srdivacky# KERNCONF. If not defined a GENERIC kernel is built/installed.
630198090Srdivacky# Only the existing (depending TARGET) config files are used
631198090Srdivacky# for building kernels and only the first of these is designated
632245431Sdim# as the one being installed.
633198090Srdivacky#
634198090Srdivacky# Note that we have to use TARGET instead of TARGET_ARCH when
635245431Sdim# we're in kernel-land. Since only TARGET_ARCH is (expected) to
636198090Srdivacky# be set to cross-build, we have to make sure TARGET is set
637198090Srdivacky# properly.
638198090Srdivacky
639198090Srdivacky.if !defined(KERNCONF) && defined(KERNEL)
640198090SrdivackyKERNCONF=	${KERNEL}
641198090SrdivackyKERNWARN=
642245431Sdim.else
643245431SdimKERNCONF?=	GENERIC
644245431Sdim.endif
645245431SdimINSTKERNNAME?=	kernel
646245431Sdim
647245431SdimKERNSRCDIR?=	${.CURDIR}/sys
648245431SdimKRNLCONFDIR=	${KERNSRCDIR}/${TARGET}/conf
649245431SdimKRNLOBJDIR=	${OBJTREE}${KERNSRCDIR}
650245431SdimKERNCONFDIR?=	${KRNLCONFDIR}
651198090Srdivacky
652198090SrdivackyBUILDKERNELS=
653199481SrdivackyINSTALLKERNEL=
654198090Srdivacky.for _kernel in ${KERNCONF}
655198090Srdivacky.if exists(${KERNCONFDIR}/${_kernel})
656198090SrdivackyBUILDKERNELS+=	${_kernel}
657198090Srdivacky.if empty(INSTALLKERNEL)
658198090SrdivackyINSTALLKERNEL= ${_kernel}
659198090Srdivacky.endif
660245431Sdim.endif
661198090Srdivacky.endfor
662198090Srdivacky
663245431Sdim#
664198090Srdivacky# buildkernel
665198090Srdivacky#
666198090Srdivacky# Builds all kernels defined by BUILDKERNELS.
667198090Srdivacky#
668198090Srdivackybuildkernel:
669198090Srdivacky.if empty(BUILDKERNELS)
670198090Srdivacky	@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF})."; \
671198090Srdivacky	false
672198090Srdivacky.endif
673198090Srdivacky.if defined(KERNWARN)
674198090Srdivacky	@echo "--------------------------------------------------------------"
675198090Srdivacky	@echo ">>> WARNING: KERNEL= setting should be changed to KERNCONF="
676193323Sed	@echo "--------------------------------------------------------------"
677207618Srdivacky	@sleep 3
678193323Sed.endif
679193323Sed	@echo
680193323Sed.for _kernel in ${BUILDKERNELS}
681193323Sed	@echo "--------------------------------------------------------------"
682193323Sed	@echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`"
683263509Sdim	@echo "--------------------------------------------------------------"
684263509Sdim	@echo "===> ${_kernel}"
685245431Sdim	mkdir -p ${KRNLOBJDIR}
686193323Sed.if !defined(NO_KERNELCONFIG)
687198090Srdivacky	@echo
688198090Srdivacky	@echo "--------------------------------------------------------------"
689198090Srdivacky	@echo ">>> stage 1: configuring the kernel"
690198090Srdivacky	@echo "--------------------------------------------------------------"
691198090Srdivacky	cd ${KRNLCONFDIR}; \
692198090Srdivacky		PATH=${TMPPATH} \
693263509Sdim		    config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \
694263509Sdim			${KERNCONFDIR}/${_kernel}
695245431Sdim.endif
696198090Srdivacky.if !defined(NO_CLEAN) && !defined(NO_KERNELCLEAN)
697198090Srdivacky	@echo
698193323Sed	@echo "--------------------------------------------------------------"
699193323Sed	@echo ">>> stage 2.1: cleaning up the object tree"
700218893Sdim	@echo "--------------------------------------------------------------"
701218893Sdim	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} ${CLEANDIR}
702218893Sdim.endif
703193323Sed	@echo
704193323Sed	@echo "--------------------------------------------------------------"
705245431Sdim	@echo ">>> stage 2.2: rebuilding the object tree"
706245431Sdim	@echo "--------------------------------------------------------------"
707245431Sdim	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj
708245431Sdim	@echo
709245431Sdim	@echo "--------------------------------------------------------------"
710245431Sdim	@echo ">>> stage 2.3: build tools"
711245431Sdim	@echo "--------------------------------------------------------------"
712245431Sdim	cd ${KRNLOBJDIR}/${_kernel}; \
713245431Sdim	    MAKESRCPATH=${KERNSRCDIR}/dev/aic7xxx/aicasm \
714245431Sdim	    ${MAKE} -DNO_CPU_CFLAGS -f ${KERNSRCDIR}/dev/aic7xxx/aicasm/Makefile
715245431Sdim# XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case.
716245431Sdim.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KERNSRCDIR}/modules)
717245431Sdim.for target in obj depend all
718245431Sdim	cd ${KERNSRCDIR}/modules/aic7xxx/aicasm; \
719245431Sdim	    MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \
720245431Sdim	    ${MAKE} -DNO_CPU_CFLAGS ${target}
721245431Sdim.endfor
722245431Sdim.endif
723245431Sdim.if !defined(NO_KERNELDEPEND)
724245431Sdim	@echo
725245431Sdim	@echo "--------------------------------------------------------------"
726245431Sdim	@echo ">>> stage 3.1: making dependencies"
727245431Sdim	@echo "--------------------------------------------------------------"
728245431Sdim	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} depend -DNO_MODULES_OBJ
729245431Sdim.endif
730245431Sdim	@echo
731245431Sdim	@echo "--------------------------------------------------------------"
732245431Sdim	@echo ">>> stage 3.2: building everything"
733245431Sdim	@echo "--------------------------------------------------------------"
734245431Sdim	cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} all -DNO_MODULES_OBJ
735245431Sdim	@echo "--------------------------------------------------------------"
736245431Sdim	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
737245431Sdim	@echo "--------------------------------------------------------------"
738245431Sdim.endfor
739245431Sdim
740245431Sdim#
741245431Sdim# installkernel, etc.
742245431Sdim#
743245431Sdim# Install the kernel defined by INSTALLKERNEL
744245431Sdim#
745245431Sdiminstallkernel installkernel.debug \
746245431Sdimreinstallkernel reinstallkernel.debug: installcheck
747245431Sdim.if empty(INSTALLKERNEL)
748245431Sdim	@echo "ERROR: No kernel \"${KERNCONF}\" to install."; \
749245431Sdim	false
750245431Sdim.endif
751245431Sdim	@echo "--------------------------------------------------------------"
752245431Sdim	@echo ">>> Installing kernel"
753245431Sdim	@echo "--------------------------------------------------------------"
754245431Sdim	cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
755245431Sdim	    ${CROSSENV} PATH=${TMPPATH} \
756245431Sdim	    ${MAKE} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel//}
757245431Sdim
758245431Sdim#
759245431Sdim# doxygen
760245431Sdim#
761245431Sdim# Build the API documentation with doxygen
762245431Sdim#
763245431Sdimdoxygen:
764245431Sdim	@if [ ! -x `/usr/bin/which doxygen` ]; then \
765245431Sdim		echo "You need doxygen (devel/doxygen) to generate the API documentation of the kernel." | /usr/bin/fmt; \
766245431Sdim		exit 1; \
767245431Sdim	fi
768245431Sdim	cd ${.CURDIR}/tools/kerneldoc/subsys && ${MAKE} obj all
769245431Sdim
770245431Sdim#
771245431Sdim# update
772245431Sdim#
773198090Srdivacky# Update the source tree, by running cvsup and/or running cvs to update to the
774224145Sdim# latest copy.
775224145Sdim#
776193323Sedupdate:
777224145Sdim.if defined(SUP_UPDATE)
778263509Sdim	@echo "--------------------------------------------------------------"
779193323Sed	@echo ">>> Running ${SUP}"
780198090Srdivacky	@echo "--------------------------------------------------------------"
781245431Sdim.if defined(SUPFILE)
782245431Sdim	@${SUP} ${SUPFLAGS} ${SUPFILE}
783245431Sdim.endif
784245431Sdim.if defined(SUPFILE1)
785198090Srdivacky	@${SUP} ${SUPFLAGS} ${SUPFILE1}
786198090Srdivacky.endif
787198090Srdivacky.if defined(SUPFILE2)
788235633Sdim	@${SUP} ${SUPFLAGS} ${SUPFILE2}
789198090Srdivacky.endif
790235633Sdim.if defined(PORTSSUPFILE) && !defined(NO_PORTSUPDATE)
791198090Srdivacky	@${SUP} ${SUPFLAGS} ${PORTSSUPFILE}
792193323Sed.endif
793212904Sdim.if defined(DOCSUPFILE) && !defined(NO_DOCUPDATE)
794212904Sdim	@${SUP} ${SUPFLAGS} ${DOCSUPFILE}
795235633Sdim.endif
796212904Sdim.endif
797212904Sdim.if defined(CVS_UPDATE)
798212904Sdim	@echo "--------------------------------------------------------------"
799212904Sdim	@echo ">>> Updating ${.CURDIR} from CVS repository" ${CVSROOT}
800212904Sdim	@echo "--------------------------------------------------------------"
801235633Sdim	cd ${.CURDIR}; ${CVS} -R -q update ${CVSFLAGS}
802235633Sdim.endif
803235633Sdim
804212904Sdim#
805212904Sdim# ------------------------------------------------------------------------
806212904Sdim#
807212904Sdim# From here onwards are utility targets used by the 'make world' and
808212904Sdim# related targets.  If your 'world' breaks, you may like to try to fix
809212904Sdim# the problem and manually run the following targets to attempt to
810226890Sdim# complete the build.  Beware, this is *not* guaranteed to work, you
811226890Sdim# need to have a pretty good grip on the current state of the system
812226890Sdim# to attempt to manually finish it.  If in doubt, 'make world' again.
813193323Sed#
814193323Sed
815193323Sed#
816198090Srdivacky# legacy: Build compatibility shims for the next three targets
817193323Sed#
818224145Sdimlegacy:
819193323Sed.if ${BOOTSTRAPPING} < 503000
820224145Sdim	@echo "ERROR: Source upgrades from versions prior to 5.3 not supported."; \
821224145Sdim	false
822245431Sdim.endif
823193323Sed.for _tool in tools/build
824193323Sed	${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,depend,all,install)"; \
825245431Sdim	    cd ${.CURDIR}/${_tool}; \
826193323Sed	    ${MAKE} DIRPRFX=${_tool}/ obj; \
827193323Sed	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy includes; \
828193323Sed	    ${MAKE} DIRPRFX=${_tool}/ depend; \
829224145Sdim	    ${MAKE} DIRPRFX=${_tool}/ all; \
830245431Sdim	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
831218893Sdim.endfor
832218893Sdim
833224145Sdim#
834235633Sdim# bootstrap-tools: Build tools needed for compatibility
835224145Sdim#
836263509Sdim.if ${MK_GAMES} != "no"
837198090Srdivacky_strfile=	games/fortune/strfile
838198090Srdivacky.endif
839198090Srdivacky
840245431Sdim.if ${MK_CXX} != "no"
841245431Sdim_gperf=		gnu/usr.bin/gperf
842245431Sdim.if ${BOOTSTRAPPING} < 700004
843245431Sdim_groff=		gnu/usr.bin/groff
844245431Sdim.else
845245431Sdim_groff=		gnu/usr.bin/groff/tmac
846245431Sdim.endif
847245431Sdim.endif
848245431Sdim
849245431Sdim.if ${BOOTSTRAPPING} < 600029
850245431Sdim_texinfo=	gnu/usr.bin/texinfo
851198090Srdivacky.endif
852201360Srdivacky
853235633Sdim.if ${BOOTSTRAPPING} < 600015
854198090Srdivacky_cap_mkdb=	usr.bin/cap_mkdb
855193323Sed.endif
856193323Sed
857193323Sed.if ${BOOTSTRAPPING} < 600018
858193323Sed_colldef=	usr.bin/colldef
859193323Sed.endif
860193323Sed
861193323Sed.if ${BOOTSTRAPPING} < 600017
862235633Sdim_gencat=	usr.bin/gencat
863235633Sdim.endif
864193323Sed
865245431Sdim.if ${BOOTSTRAPPING} < 600016
866245431Sdim_mklocale=	usr.bin/mklocale
867245431Sdim.endif
868245431Sdim
869245431Sdim.if ${BOOTSTRAPPING} < 700015
870245431Sdim_gensnmptree=	usr.sbin/bsnmpd/gensnmptree
871245431Sdim.endif
872245431Sdim
873245431Sdim.if ${MK_RESCUE} != "no" && \
874245431Sdim    ${BOOTSTRAPPING} < 600008
875245431Sdim_crunchgen=	usr.sbin/crunch/crunchgen
876245431Sdim.endif
877245431Sdim
878245431Sdim.if ${BOOTSTRAPPING} < 600020
879245431Sdim_pwd_mkdb=	usr.sbin/pwd_mkdb
880245431Sdim.endif
881245431Sdim
882245431Sdimbootstrap-tools:
883245431Sdim.for _tool in \
884245431Sdim    ${_strfile} \
885245431Sdim    ${_gperf} \
886198090Srdivacky    ${_groff} \
887245431Sdim    ${_texinfo} \
888245431Sdim    ${_cap_mkdb} \
889245431Sdim    ${_colldef} \
890245431Sdim    ${_gencat} \
891245431Sdim    usr.bin/lorder \
892245431Sdim    usr.bin/makewhatis \
893245431Sdim    ${_mklocale} \
894193323Sed    usr.bin/rpcgen \
895224145Sdim    usr.bin/xinstall \
896193323Sed    ${_gensnmptree} \
897193323Sed    usr.sbin/config \
898193323Sed    ${_crunchgen} \
899193323Sed    ${_pwd_mkdb}
900226890Sdim	${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
901226890Sdim		cd ${.CURDIR}/${_tool}; \
902193323Sed		${MAKE} DIRPRFX=${_tool}/ obj; \
903245431Sdim		${MAKE} DIRPRFX=${_tool}/ depend; \
904245431Sdim		${MAKE} DIRPRFX=${_tool}/ all; \
905226890Sdim		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
906193323Sed.endfor
907226890Sdim
908193323Sed#
909193323Sed# build-tools: Build special purpose build tools
910193323Sed#
911193323Sed.if defined(MODULES_WITH_WORLD) && exists(${KERNSRCDIR}/modules)
912193323Sed_aicasm= sys/modules/aic7xxx/aicasm
913193323Sed.endif
914193323Sed
915226890Sdim.if !defined(NO_SHARE)
916226890Sdim_share=	share/syscons/scrnmaps
917208599Srdivacky.endif
918193323Sed
919208599Srdivacky.if ${MK_KERBEROS} != "no"
920208599Srdivacky_kerberos5_tools= kerberos5/tools
921193323Sed.endif
922193323Sed
923226890Sdim.if ${MK_RESCUE} != "no"
924226890Sdim_rescue= rescue/rescue
925226890Sdim.endif
926226890Sdim
927226890Sdimbuild-tools:
928226890Sdim.for _tool in \
929193323Sed    bin/csh \
930245431Sdim    bin/sh \
931245431Sdim    ${_rescue} \
932226890Sdim    lib/libncurses \
933226890Sdim    ${_share} \
934226890Sdim    ${_aicasm} \
935226890Sdim    usr.bin/awk \
936226890Sdim    lib/libmagic \
937226890Sdim    usr.sbin/sysinstall
938226890Sdim	${_+_}@${ECHODIR} "===> ${_tool} (obj,build-tools)"; \
939226890Sdim		cd ${.CURDIR}/${_tool}; \
940226890Sdim		${MAKE} DIRPRFX=${_tool}/ obj; \
941226890Sdim		${MAKE} DIRPRFX=${_tool}/ build-tools
942226890Sdim.endfor
943226890Sdim.for _tool in \
944226890Sdim    gnu/usr.bin/cc/cc_tools \
945223017Sdim    ${_kerberos5_tools}
946193323Sed	${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all)"; \
947193323Sed		cd ${.CURDIR}/${_tool}; \
948193323Sed		${MAKE} DIRPRFX=${_tool}/ obj; \
949193323Sed		${MAKE} DIRPRFX=${_tool}/ depend; \
950193323Sed		${MAKE} DIRPRFX=${_tool}/ all
951193323Sed.endfor
952193323Sed
953193323Sed#
954193323Sed# cross-tools: Build cross-building tools
955198090Srdivacky#
956235633Sdim.if ${TARGET_ARCH} != ${MACHINE_ARCH}
957235633Sdim.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
958235633Sdim_btxld=		usr.sbin/btxld
959235633Sdim.endif
960198090Srdivacky.if ${MK_RESCUE} != "no" || defined(RELEASEDIR)
961203954Srdivacky_crunchide=	usr.sbin/crunch/crunchide
962203954Srdivacky.endif
963198090Srdivacky.if ${TARGET_ARCH} == "i386" && defined(RELEASEDIR)
964198090Srdivacky_kgzip=		usr.sbin/kgzip
965218893Sdim.endif
966218893Sdim.endif
967218893Sdim
968218893Sdimcross-tools:
969218893Sdim.for _tool in \
970235633Sdim    gnu/usr.bin/binutils \
971218893Sdim    gnu/usr.bin/cc \
972218893Sdim    usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint \
973218893Sdim    ${_btxld} \
974235633Sdim    ${_crunchide} \
975218893Sdim    ${_kgzip}
976218893Sdim	${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
977218893Sdim		cd ${.CURDIR}/${_tool}; \
978218893Sdim		${MAKE} DIRPRFX=${_tool}/ obj; \
979218893Sdim		${MAKE} DIRPRFX=${_tool}/ depend; \
980218893Sdim		${MAKE} DIRPRFX=${_tool}/ all; \
981193323Sed		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
982193323Sed.endfor
983193323Sed
984193323Sed#
985193323Sed# hierarchy - ensure that all the needed directories are present
986235633Sdim#
987235633Sdimhierarchy:
988235633Sdim	cd ${.CURDIR}/etc;		${MAKE} distrib-dirs
989235633Sdim
990235633Sdim#
991235633Sdim# libraries - build all libraries, and install them under ${DESTDIR}.
992235633Sdim#
993235633Sdim# The list of libraries with dependents (${_prebuild_libs}) and their
994245431Sdim# interdependencies (__L) are built automatically by the
995235633Sdim# ${.CURDIR}/tools/make_libdeps.sh script.
996235633Sdim#
997235633Sdimlibraries:
998235633Sdim	cd ${.CURDIR}; \
999235633Sdim	    ${MAKE} -f Makefile.inc1 _startup_libs; \
1000235633Sdim	    ${MAKE} -f Makefile.inc1 _prebuild_libs; \
1001235633Sdim	    ${MAKE} -f Makefile.inc1 _generic_libs;
1002235633Sdim
1003235633Sdim# These dependencies are not automatically generated:
1004235633Sdim#
1005235633Sdim# gnu/lib/csu, gnu/lib/libgcc and lib/csu must be built before all
1006245431Sdim# shared libraries for ELF.
1007245431Sdim#
1008245431Sdim_startup_libs=	gnu/lib/csu gnu/lib/libgcc
1009245431Sdim.if exists(${.CURDIR}/lib/csu/${MACHINE_ARCH}-elf)
1010245431Sdim_startup_libs+=	lib/csu/${MACHINE_ARCH}-elf
1011263509Sdim.else
1012263509Sdim_startup_libs+=	lib/csu/${MACHINE_ARCH}
1013245431Sdim.endif
1014263509Sdim
1015245431Sdim_prebuild_libs=
1016263509Sdim
1017245431Sdim_generic_libs=	gnu/lib
1018245431Sdim
1019245431Sdim.if ${MK_IPX} != "no"
1020263509Sdim_prebuild_libs+= lib/libipx
1021245431Sdim.endif
1022245431Sdim
1023235633Sdim.if ${MK_KERBEROS} != "no"
1024245431Sdim_prebuild_libs+=	kerberos5/lib/libasn1
1025245431Sdim_prebuild_libs+=	kerberos5/lib/libkrb5
1026245431Sdim_prebuild_libs+=	kerberos5/lib/libroken
1027245431Sdim_prebuild_libs+=	lib/libgssapi
1028245431Sdim_generic_libs+=	kerberos5/lib
1029245431Sdim.endif
1030263509Sdim
1031245431Sdim_prebuild_libs+= lib/libbz2 lib/libcom_err lib/libcrypt lib/libexpat \
1032263509Sdim		lib/libkiconv lib/libkvm lib/libmd \
1033245431Sdim		lib/libncurses lib/libopie lib/libpam \
1034245431Sdim		lib/libradius \
1035245431Sdim		lib/libsbuf lib/libtacplus lib/libutil \
1036245431Sdim		lib/libz lib/msun
1037245431Sdim
1038245431Sdimlib/libopie__L lib/libtacplus__L: lib/libmd__L
1039245431Sdim
1040245431Sdim_generic_libs+=	lib
1041245431Sdim
1042245431Sdim.if ${MK_CRYPT} != "no"
1043235633Sdim.if ${MK_OPENSSL} != "no"
1044235633Sdim_prebuild_libs+=	secure/lib/libcrypto secure/lib/libssl
1045235633Sdimlib/libradius__L secure/lib/libssl__L: secure/lib/libcrypto__L
1046235633Sdim.if ${MK_OPENSSH} != "no"
1047235633Sdim_prebuild_libs+=	secure/lib/libssh
1048235633Sdimsecure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L
1049235633Sdim.if ${MK_KERBEROS} != "no"
1050235633Sdimsecure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libkrb5__L \
1051235633Sdim    kerberos5/lib/libasn1__L lib/libcom_err__L lib/libmd__L \
1052235633Sdim    kerberos5/lib/libroken__L
1053245431Sdim.endif
1054245431Sdim.endif
1055235633Sdim.endif
1056235633Sdim_generic_libs+=	secure/lib
1057235633Sdim.endif
1058235633Sdim
1059235633Sdim.if ${MK_OPENSSL} == "no"
1060235633Sdimlib/libradius__L: lib/libmd__L
1061235633Sdim.endif
1062235633Sdim
1063235633Sdim.if ${MK_NIS} != "no"
1064235633Sdim_prebuild_libs+=	lib/libypclnt
1065235633Sdim.endif
1066235633Sdim
1067235633Sdim_generic_libs+=	usr.bin/lex/lib
1068235633Sdim
1069235633Sdim.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs}
1070235633Sdim${_lib}__L: .PHONY
1071235633Sdim.if exists(${.CURDIR}/${_lib})
1072235633Sdim	${_+_}@${ECHODIR} "===> ${_lib} (obj,depend,all,install)"; \
1073235633Sdim		cd ${.CURDIR}/${_lib}; \
1074235633Sdim		${MAKE} DIRPRFX=${_lib}/ obj; \
1075235633Sdim		${MAKE} DIRPRFX=${_lib}/ depend; \
1076235633Sdim		${MAKE} DIRPRFX=${_lib}/ all; \
1077235633Sdim		${MAKE} DIRPRFX=${_lib}/ install
1078235633Sdim.endif
1079235633Sdim.endfor
1080235633Sdim
1081263509Sdim# libpam is special: we need to build static PAM modules before
1082235633Sdim# static PAM library, and dynamic PAM library before dynamic PAM
1083235633Sdim# modules.
1084245431Sdimlib/libpam__L: .PHONY
1085245431Sdim	${_+_}@${ECHODIR} "===> lib/libpam (obj,depend,all,install)"; \
1086235633Sdim		cd ${.CURDIR}/lib/libpam; \
1087235633Sdim		${MAKE} DIRPRFX=lib/libpam/ obj; \
1088235633Sdim		${MAKE} DIRPRFX=lib/libpam/ depend; \
1089235633Sdim		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET all; \
1090245431Sdim		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET install
1091235633Sdim
1092235633Sdim_startup_libs: ${_startup_libs:S/$/__L/}
1093235633Sdim_prebuild_libs: ${_prebuild_libs:S/$/__L/}
1094235633Sdim_generic_libs: ${_generic_libs:S/$/__L/}
1095235633Sdim
1096263509Sdim.for __target in all clean cleandepend cleandir depend includes obj
1097235633Sdim.for entry in ${SUBDIR}
1098235633Sdim${entry}.${__target}__D: .PHONY
1099263509Sdim	${_+_}@if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \
1100263509Sdim		${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE_ARCH} (${__target})"; \
1101263509Sdim		edir=${entry}.${MACHINE_ARCH}; \
1102263509Sdim		cd ${.CURDIR}/$${edir}; \
1103263509Sdim	else \
1104263509Sdim		${ECHODIR} "===> ${DIRPRFX}${entry} (${__target})"; \
1105263509Sdim		edir=${entry}; \
1106263509Sdim		cd ${.CURDIR}/$${edir}; \
1107235633Sdim	fi; \
1108235633Sdim	${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/
1109235633Sdim.endfor
1110235633Sdimpar-${__target}: ${SUBDIR:S/$/.${__target}__D/}
1111235633Sdim.endfor
1112235633Sdim
1113235633Sdim.include <bsd.subdir.mk>
1114198090Srdivacky
1115245431Sdim.if make(delete-old) || make(delete-old-libs) || make(check-old)
1116245431Sdim
1117245431Sdim#
1118245431Sdim# check for / delete old files section
1119245431Sdim#
1120245431Sdim
1121245431Sdim.include "ObsoleteFiles.inc"
1122193323Sed
1123193323SedOLD_LIBS_MESSAGE="Please be sure no application still uses those libraries, \
1124212904Sdimelse you can not start such an application. Consult UPDATING for more \
1125235633Sdiminformation regarding how to cope with the removal/revision bump of a \
1126235633Sdimspecific library."
1127235633Sdim
1128235633Sdim.if !defined(BATCH_DELETE_OLD_FILES)
1129235633SdimRM_I=-i
1130235633Sdim.else
1131235633SdimRM_I=-v
1132235633Sdim.endif
1133212904Sdim
1134212904Sdimdelete-old-files:
1135193323Sed	@echo ">>> Removing old files (only deletes safe to delete libs)"
1136193323Sed.for file in ${OLD_FILES}
1137193323Sed# Ask for every old file if the user really wants to remove it.
1138198090Srdivacky# It's annoying, but better safe than sorry.
1139193323Sed	@if [ -f "${DESTDIR}/${file}" -o -L "${DESTDIR}/${file}" ]; then \
1140193323Sed		rm ${RM_I} "${DESTDIR}/${file}" || true; \
1141218893Sdim		if [ -f "${DESTDIR}/${file}" -o -L "${DESTDIR}/${file}" ]; then\
1142218893Sdim			echo "Removing schg flag on ${DESTDIR}/${file}"; \
1143218893Sdim			chflags noschg "${DESTDIR}/${file}"; \
1144218893Sdim			rm ${RM_I} "${DESTDIR}/${file}"; \
1145218893Sdim		fi; \
1146218893Sdim	fi
1147218893Sdim.endfor
1148218893Sdim# Remove catpages without corresponding manpages.
1149218893Sdim	@3<&0; \
1150218893Sdim	find ${DESTDIR}/usr/share/man/cat* ! -type d | \
1151193323Sed	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
1152193323Sed	while read catpage; do \
1153193323Sed		read manpage; \
1154193323Sed		if [ ! -e "$${manpage}" ]; then \
1155193323Sed			rm ${RM_I} $${catpage} <&3 ; \
1156202375Srdivacky	        fi; \
1157193323Sed	done
1158193323Sed	@echo ">>> Old files removed"
1159235633Sdim
1160193323Sedcheck-old-files:
1161193323Sed	@echo ">>> Checking for old files"
1162193323Sed.for file in ${OLD_FILES}
1163193323Sed	@if [ -f "${DESTDIR}/${file}" -o -L "${DESTDIR}/${file}" ]; then \
1164193323Sed		 echo "${DESTDIR}/${file}"; \
1165193323Sed	fi
1166193323Sed.endfor
1167193323Sed# Check for catpages without corresponding manpages.
1168193323Sed	@find ${DESTDIR}/usr/share/man/cat* ! -type d | \
1169193323Sed	sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \
1170193323Sed	while read catpage; do \
1171193323Sed		read manpage; \
1172193323Sed		if [ ! -e "$${manpage}" ]; then \
1173193323Sed			echo $${catpage} ; \
1174193323Sed	        fi; \
1175193323Sed	done
1176193323Sed
1177193323Seddelete-old-libs:
1178193323Sed	@echo ">>> Removing old libraries"
1179193323Sed	@echo "${OLD_LIBS_MESSAGE}" | fmt
1180193323Sed.for file in ${OLD_LIBS}
1181193323Sed	@if [ -f "${DESTDIR}/${file}" -o -L "${DESTDIR}/${file}" ]; then \
1182193323Sed		rm ${RM_I} "${DESTDIR}/${file}" || true; \
1183193323Sed		if [ -f "${DESTDIR}/${file}" -o -L "${DESTDIR}/${file}" ]; then\
1184193323Sed			echo "Removing schg flag on ${DESTDIR}/${file}"; \
1185193323Sed			chflags noschg "${DESTDIR}/${file}"; \
1186193323Sed			rm ${RM_I} "${DESTDIR}/${file}"; \
1187193323Sed		fi; \
1188193323Sed	fi
1189193323Sed.endfor
1190193323Sed	@echo ">>> Old libraries removed"
1191199511Srdivacky
1192199511Srdivackycheck-old-libs:
1193202375Srdivacky	@echo ">>> Checking for old libraries"
1194199511Srdivacky.for file in ${OLD_LIBS}
1195199511Srdivacky	@if [ -f "${DESTDIR}/${file}" -o -L "${DESTDIR}/${file}" ]; then \
1196235633Sdim		echo "${DESTDIR}/${file}"; \
1197199511Srdivacky	fi
1198199511Srdivacky.endfor
1199199511Srdivacky
1200199511Srdivackydelete-old-dirs:
1201199511Srdivacky	@echo ">>> Removing old directories"
1202199511Srdivacky.for dir in ${OLD_DIRS}
1203199511Srdivacky# Don't fail if an old directory isn't empty.
1204199511Srdivacky	@if [ -d "${DESTDIR}/${dir}" ]; then \
1205199511Srdivacky		rmdir -v "${DESTDIR}/${dir}" || true; \
1206199511Srdivacky	else \
1207199511Srdivacky		if [ -L "${DESTDIR}/${dir}" ]; then \
1208199511Srdivacky			echo "${DESTDIR}/${dir} is a link, please remove everything manually."; \
1209199511Srdivacky		fi; \
1210199511Srdivacky	fi
1211199511Srdivacky.endfor
1212199511Srdivacky	@echo ">>> Old directories removed"
1213199511Srdivacky
1214199511Srdivackycheck-old-dirs:
1215199511Srdivacky	@echo ">>> Checking for old directories"
1216199511Srdivacky.for dir in ${OLD_DIRS}
1217199511Srdivacky	@if [ -d "${DESTDIR}/${dir}" ]; then \
1218199511Srdivacky		echo "${DESTDIR}/${dir}"; \
1219199511Srdivacky	else \
1220199511Srdivacky		if [ -L "${DESTDIR}/${dir}" ]; then \
1221199511Srdivacky			echo "${DESTDIR}/${dir} is a link, please remove everything manually."; \
1222199511Srdivacky		fi; \
1223199511Srdivacky	fi
1224199511Srdivacky.endfor
1225199511Srdivacky
1226193323Seddelete-old: delete-old-files delete-old-dirs
1227202375Srdivacky	@echo "To remove old libraries run '${MAKE} delete-old-libs'."
1228198090Srdivacky
1229235633Sdimcheck-old: check-old-files check-old-libs check-old-dirs
1230193323Sed	@echo "To remove old files and directories run '${MAKE} delete-old'."
1231203954Srdivacky	@echo "To remove old libraries run '${MAKE} delete-old-libs'."
1232235633Sdim
1233193323Sed.endif
1234193323Sed
1235193323Sed#
1236193323Sed# showconfig - show build configuration.
1237193323Sed#
1238193323Sedshowconfig:
1239193323Sed	@${MAKE} -n -f bsd.own.mk -V dummy -dg1 | grep ^MK_ | sort
1240193323Sed