Makefile.inc1 revision 133942
155714Skris#
255714Skris# $FreeBSD: head/Makefile.inc1 133942 2004-08-18 06:49:56Z ru $
355714Skris#
455714Skris# Make command line options:
555714Skris#	-DNO_DYNAMICROOT do not link /bin and /sbin dynamically
655714Skris#	-DNO_KERBEROS Do not build Heimdal (Kerberos 5)
755714Skris#	-DNO_RESCUE do not build rescue binaries
8280297Sjkim#	-DNOCLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
955714Skris#	-DNOCLEAN do not clean at all
1055714Skris#	-DNOCRYPT will prevent building of crypt versions
1155714Skris#	-DNOMAN do not build the manual pages
1255714Skris#	-DNOPROFILE do not build profiled libraries
1355714Skris#	-DNOGAMES do not go into games subdir
1455714Skris#	-DNOSHARE do not go into share subdir
15280297Sjkim#	-DNOINFO do not make or install info files
1655714Skris#	-DNOLIBC_R do not build libc_r.
1755714Skris#	-DNO_FORTRAN do not build g77 and related libraries.
1855714Skris#	-DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
1955714Skris#	-DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
2055714Skris#	-DNO_KERNELDEPEND do not run ${MAKE} depend in ${MAKE} buildkernel
2155714Skris#	-DNO_PORTSUPDATE do not update ports in ${MAKE} update
22280297Sjkim#	-DNO_DOCUPDATE do not update doc in ${MAKE} update
2355714Skris#	LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
2455714Skris#	TARGET_ARCH="arch" to crossbuild world to a different arch
2555714Skris
2655714Skris#
2755714Skris# The intended user-driven targets are:
2855714Skris# buildworld  - rebuild *everything*, including glue to help do upgrades
2955714Skris# installworld- install everything built by "buildworld"
3055714Skris# update      - convenient way to update your source tree (eg: sup/cvs)
3155714Skris#
3255714Skris# Standard targets (not defined here) are documented in the makefiles in
3355714Skris# /usr/share/mk.  These include:
3455714Skris#		obj depend all install clean cleandepend cleanobj
3555714Skris
3655714Skris# We must do share/info early so that installation of info `dir'
37280297Sjkim# entries works correctly.  Do it first since it is less likely to
3855714Skris# grow dependencies on include and lib than vice versa.
3955714Skris#
40280297Sjkim# We must do lib and libexec before bin, because if installworld
4155714Skris# installs a new /bin/sh, the 'make' command will *immediately*
4255714Skris# use that new version.  And the new (dynamically-linked) /bin/sh
4355714Skris# will expect to find appropriate libraries in /lib and /libexec.
4455714Skris#
4555714Skris# We must do etc last for install/distribute to work.
4655714Skris#
4755714SkrisSUBDIR=	share/info include lib libexec bin
4855714Skris.if !defined(NOGAMES)
4955714SkrisSUBDIR+=games
5055714Skris.endif
5155714SkrisSUBDIR+=gnu
52280297Sjkim.if !defined(NO_KERBEROS) && !defined(NOCRYPT) && !defined(NO_OPENSSL)
5355714SkrisSUBDIR+=kerberos5
5455714Skris.endif
5555714Skris.if !defined(NO_RESCUE)
5655714SkrisSUBDIR+=rescue
5755714Skris.endif
58109998SmarkmSUBDIR+=sbin
59109998Smarkm.if !defined(NOCRYPT)
60109998SmarkmSUBDIR+=secure
61109998Smarkm.endif
62109998Smarkm.if !defined(NOSHARE)
63109998SmarkmSUBDIR+=share
64109998Smarkm.endif
65109998SmarkmSUBDIR+=sys usr.bin usr.sbin etc
66280297Sjkim
67109998Smarkm# These are last, since it is nice to at least get the base system
68109998Smarkm# rebuilt before you do them.
69109998Smarkm.for _DIR in ${LOCAL_DIRS}
70109998Smarkm.if exists(${.CURDIR}/${_DIR}/Makefile)
71109998SmarkmSUBDIR+= ${_DIR}
72109998Smarkm.endif
73109998Smarkm.endfor
74109998Smarkm
75109998Smarkm.if defined(SUBDIR_OVERRIDE)
76109998SmarkmSUBDIR=		${SUBDIR_OVERRIDE}
77109998Smarkm.endif
78109998Smarkm
79109998Smarkm.if defined(NOCLEANDIR)
80109998SmarkmCLEANDIR=	clean cleandepend
81109998Smarkm.else
82109998SmarkmCLEANDIR=	cleandir
83109998Smarkm.endif
84109998Smarkm
85109998SmarkmCVS?=		cvs
86109998SmarkmSUP?=		/usr/local/bin/cvsup
87109998SmarkmSUPFLAGS?=	-g -L 2 -P -
88109998Smarkm.if defined(SUPHOST)
89109998SmarkmSUPFLAGS+=	-h ${SUPHOST}
90109998Smarkm.endif
91109998Smarkm
92109998SmarkmMAKEOBJDIRPREFIX?=	/usr/obj
93109998Smarkm.if !defined(OSRELDATE)
94109998Smarkm.if exists(/usr/include/osreldate.h)
95109998SmarkmOSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
96109998Smarkm		/usr/include/osreldate.h
97109998Smarkm.else
98109998SmarkmOSRELDATE=	0
99109998Smarkm.endif
100109998Smarkm.endif
101109998SmarkmTARGET_ARCH?=	${MACHINE_ARCH}
102109998Smarkm.if ${TARGET_ARCH} == ${MACHINE_ARCH}
103109998SmarkmTARGET?=	${MACHINE}
104109998SmarkmTARGET_CPUTYPE?=${CPUTYPE}
105109998Smarkm.else
106109998SmarkmTARGET?=	${TARGET_ARCH}
107109998SmarkmTARGET_CPUTYPE?=
108109998Smarkm.endif
109109998Smarkm.if !empty(TARGET_CPUTYPE)
110109998Smarkm_TARGET_CPUTYPE=${TARGET_CPUTYPE}
11155714Skris.else
11255714Skris_TARGET_CPUTYPE=dummy
11355714Skris.endif
11455714Skris_CPUTYPE!=	MAKEFLAGS= ${MAKE} -f /dev/null -m ${.CURDIR}/share/mk \
11555714Skris		CPUTYPE=${_TARGET_CPUTYPE} -V CPUTYPE
11659191Skris.if ${_CPUTYPE} != ${_TARGET_CPUTYPE}
117109998Smarkm.error CPUTYPE global should be set with ?=.
118280297Sjkim.endif
119280297Sjkim.if make(buildworld)
120280297SjkimBUILD_ARCH!=	sysctl -n hw.machine_arch
12155714Skris.if ${MACHINE_ARCH} != ${BUILD_ARCH}
122280297Sjkim.error To cross-build, set TARGET_ARCH.
123280297Sjkim.endif
12455714Skris.endif
125280297Sjkim.if ${MACHINE} == ${TARGET}
126280297SjkimOBJTREE=	${MAKEOBJDIRPREFIX}
127280297Sjkim.else
128280297SjkimOBJTREE=	${MAKEOBJDIRPREFIX}/${TARGET}
129280297Sjkim.endif
13055714SkrisWORLDTMP=	${OBJTREE}${.CURDIR}/${MACHINE_ARCH}
131280297Sjkim# /usr/games added for fortune which depend on strfile
132280297SjkimBPATH=		${WORLDTMP}/legacy/usr/sbin:${WORLDTMP}/legacy/usr/bin:${WORLDTMP}/legacy/usr/games
133280297SjkimXPATH=		${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin:${WORLDTMP}/usr/games
134280297SjkimSTRICTTMPPATH=	${BPATH}:${XPATH}
135280297SjkimTMPPATH=	${STRICTTMPPATH}:${PATH}
136280297Sjkim
13755714SkrisINSTALLTMP!=	/usr/bin/mktemp -d -u -t install
138280297Sjkim
139280297Sjkim#
140280297Sjkim# Building a world goes through the following stages
141280297Sjkim#
142280297Sjkim# 1. legacy stage [BMAKE]
143280297Sjkim#	This stage is responsible for creating compatibility
144280297Sjkim#	shims that are needed by the bootstrap-tools,
145280297Sjkim#	build-tools and cross-tools stages.
14655714Skris# 1. bootstrap-tools stage [BMAKE]
147280297Sjkim#	This stage is responsible for creating programs that
148280297Sjkim#	are needed for backward compatibility reasons. They
149280297Sjkim#	are not built as cross-tools.
150280297Sjkim# 2. build-tools stage [TMAKE]
151280297Sjkim#	This stage is responsible for creating the object
152280297Sjkim#	tree and building any tools that are needed during
153280297Sjkim#	the build process.
154280297Sjkim# 3. cross-tools stage [XMAKE]
15555714Skris#	This stage is responsible for creating any tools that
15655714Skris#	are needed for cross-builds. A cross-compiler is one
157280297Sjkim#	of them.
158280297Sjkim# 4. world stage [WMAKE]
159280297Sjkim#	This stage actually builds the world.
16055714Skris# 5. install stage (optional) [IMAKE]
161280297Sjkim#	This stage installs a previously built world.
162280297Sjkim#
16355714Skris
164280297SjkimBOOTSTRAPPING?=	0
165280297Sjkim
166280297Sjkim# Common environment for world related stages
16755714SkrisCROSSENV=	MAKEOBJDIRPREFIX=${OBJTREE} \
168280297Sjkim		MACHINE_ARCH=${TARGET_ARCH} \
169280297Sjkim		MACHINE=${TARGET} \
170280297Sjkim		CPUTYPE=${TARGET_CPUTYPE} \
171280297Sjkim		GROFF_BIN_PATH=${WORLDTMP}/legacy/usr/bin \
172280297Sjkim		GROFF_FONT_PATH=${WORLDTMP}/legacy/usr/share/groff_font \
173280297Sjkim		GROFF_TMAC_PATH=${WORLDTMP}/legacy/usr/share/tmac
174280297Sjkim
175280297Sjkim# bootstrap-tools stage
176280297SjkimBMAKEENV=	DESTDIR= \
177280297Sjkim		INSTALL="sh ${.CURDIR}/tools/install.sh" \
178280297Sjkim		PATH=${BPATH}:${PATH} \
179280297Sjkim		WORLDTMP=${WORLDTMP} \
180109998Smarkm		MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}"
181280297SjkimBMAKE=		MAKEOBJDIRPREFIX=${WORLDTMP} \
182280297Sjkim		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
183280297Sjkim		BOOTSTRAPPING=${OSRELDATE} \
184280297Sjkim		-DNOHTML -DNOINFO -DNOLINT -DNOMAN -DNOPIC -DNOPROFILE \
185280297Sjkim		-DNOSHARED -DNO_CPU_CFLAGS -DNO_WARNS
186280297Sjkim
187280297Sjkim# build-tools stage
188280297SjkimTMAKE=		MAKEOBJDIRPREFIX=${OBJTREE} \
189280297Sjkim		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
19055714Skris		BOOTSTRAPPING=${OSRELDATE} -DNOLINT -DNO_CPU_CFLAGS -DNO_WARNS
191280297Sjkim
192280297Sjkim# cross-tools stage
193280297SjkimXMAKE=		TOOLS_PREFIX=${WORLDTMP} ${BMAKE} -DNO_FORTRAN -DNO_GDB
194280297Sjkim
195280297Sjkim# world stage
196280297SjkimWMAKEENV=	${CROSSENV} \
197280297Sjkim		DESTDIR=${WORLDTMP} \
198280297Sjkim		_SHLIBDIRPREFIX=${WORLDTMP} \
199280297Sjkim		INSTALL="sh ${.CURDIR}/tools/install.sh" \
200109998Smarkm		PATH=${TMPPATH}
201280297SjkimWMAKE=		${WMAKEENV} ${MAKE} -f Makefile.inc1
202280297Sjkim
203280297Sjkim# install stage
204280297Sjkim.if empty(.MAKEFLAGS:M-n)
205280297SjkimIMAKEENV=	${CROSSENV} \
206280297Sjkim		PATH=${STRICTTMPPATH}:${INSTALLTMP}
207280297Sjkim.else
208280297SjkimIMAKEENV=	${CROSSENV} \
209280297Sjkim		PATH=${TMPPATH}:${INSTALLTMP}
210280297Sjkim.endif
211280297SjkimIMAKE=		${IMAKEENV} ${MAKE} -f Makefile.inc1
212280297Sjkim
213280297Sjkim# kernel stage
214280297SjkimKMAKEENV=	${WMAKEENV}
215280297Sjkim
216280297Sjkim#
217280297Sjkim# buildworld
218280297Sjkim#
219280297Sjkim# Attempt to rebuild the entire system, with reasonable chance of
220280297Sjkim# success, regardless of how old your existing system is.
22155714Skris#
222194206Ssimon_worldtmp:
223280297Sjkim.if ${.CURDIR:C/[^,]//g} != ""
224280297Sjkim#	The m4 build of sendmail files doesn't like it if ',' is used
225246772Sjkim#	anywhere in the path of it's files.
226109998Smarkm	@echo
227280297Sjkim	@echo "*** Error: path to source tree contains a comma ','"
228280297Sjkim	@echo
229280297Sjkim	false
230280297Sjkim.endif
231280297Sjkim	@echo
23255714Skris	@echo "--------------------------------------------------------------"
233280297Sjkim	@echo ">>> Rebuilding the temporary build tree"
234280297Sjkim	@echo "--------------------------------------------------------------"
235280297Sjkim.if !defined(NOCLEAN)
236280297Sjkim	rm -rf ${WORLDTMP}
237194206Ssimon.else
238280297Sjkim	rm -rf ${WORLDTMP}/legacy/usr/include
239280297Sjkim	# XXX - These two can depend on any header file.
24055714Skris	rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/ioctl.c
241280297Sjkim	rm -f ${OBJTREE}${.CURDIR}/usr.bin/truss/ioctl.c
242280297Sjkim.endif
243280297Sjkim.for _dir in \
244280297Sjkim    usr/bin usr/games usr/include/c++/3.3 usr/include/sys usr/lib \
245280297Sjkim    usr/libexec usr/sbin usr/share/dict \
246280297Sjkim    usr/share/groff_font/devX100 \
247280297Sjkim    usr/share/groff_font/devX100-12 \
248280297Sjkim    usr/share/groff_font/devX75 \
249280297Sjkim    usr/share/groff_font/devX75-12 \
250280297Sjkim    usr/share/groff_font/devascii \
25159191Skris    usr/share/groff_font/devcp1047 \
252280297Sjkim    usr/share/groff_font/devdvi \
253280297Sjkim    usr/share/groff_font/devhtml \
254280297Sjkim    usr/share/groff_font/devkoi8-r \
255280297Sjkim    usr/share/groff_font/devlatin1 \
256280297Sjkim    usr/share/groff_font/devlbp \
257280297Sjkim    usr/share/groff_font/devlj4 \
25855714Skris    usr/share/groff_font/devps \
259280297Sjkim    usr/share/groff_font/devutf8 \
260280297Sjkim    usr/share/tmac/mdoc usr/share/tmac/mm
261280297Sjkim	mkdir -p ${WORLDTMP}/legacy/${_dir}
262280297Sjkim.endfor
263280297Sjkim.for _dir in \
264280297Sjkim    lib usr/bin usr/include usr/lib/compat/aout usr/libdata/ldscripts \
265280297Sjkim    usr/libexec usr/sbin usr/share/misc \
266280297Sjkim    usr/share/snmp/defs usr/share/snmp/mibs
267280297Sjkim	mkdir -p ${WORLDTMP}/${_dir}
268280297Sjkim.endfor
269280297Sjkim	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
270280297Sjkim	    -p ${WORLDTMP}/usr/include >/dev/null
271280297Sjkim	ln -sf ${.CURDIR}/sys ${WORLDTMP}
272280297Sjkim_legacy:
273280297Sjkim	@echo
274280297Sjkim	@echo "--------------------------------------------------------------"
275280297Sjkim	@echo ">>> stage 1.1: legacy release compatibility shims"
276280297Sjkim	@echo "--------------------------------------------------------------"
277280297Sjkim	${_+_}cd ${.CURDIR}; ${BMAKE} legacy
27855714Skris_bootstrap-tools:
279280297Sjkim	@echo
280280297Sjkim	@echo "--------------------------------------------------------------"
281280297Sjkim	@echo ">>> stage 1.2: bootstrap tools"
282280297Sjkim	@echo "--------------------------------------------------------------"
283280297Sjkim	${_+_}cd ${.CURDIR}; ${BMAKE} bootstrap-tools
284280297Sjkim_cleanobj:
285280297Sjkim.if !defined(NOCLEAN)
286280297Sjkim	@echo
28755714Skris	@echo "--------------------------------------------------------------"
288280297Sjkim	@echo ">>> stage 2.1: cleaning up the object tree"
289280297Sjkim	@echo "--------------------------------------------------------------"
290280297Sjkim	${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR:S/^/par-/}
291280297Sjkim.endif
292280297Sjkim_obj:
293280297Sjkim	@echo
294280297Sjkim	@echo "--------------------------------------------------------------"
295109998Smarkm	@echo ">>> stage 2.2: rebuilding the object tree"
296280297Sjkim	@echo "--------------------------------------------------------------"
297280297Sjkim	${_+_}cd ${.CURDIR}; ${WMAKE} par-obj
298280297Sjkim_build-tools:
299280297Sjkim	@echo
300280297Sjkim	@echo "--------------------------------------------------------------"
301280297Sjkim	@echo ">>> stage 2.3: build tools"
302280297Sjkim	@echo "--------------------------------------------------------------"
303280297Sjkim	${_+_}cd ${.CURDIR}; ${TMAKE} build-tools
304109998Smarkm_cross-tools:
305280297Sjkim	@echo
306280297Sjkim	@echo "--------------------------------------------------------------"
307280297Sjkim	@echo ">>> stage 3: cross tools"
308280297Sjkim	@echo "--------------------------------------------------------------"
309280297Sjkim	${_+_}cd ${.CURDIR}; ${XMAKE} cross-tools
310280297Sjkim_includes:
311280297Sjkim	@echo
312280297Sjkim	@echo "--------------------------------------------------------------"
313280297Sjkim	@echo ">>> stage 4.1: building includes"
314280297Sjkim	@echo "--------------------------------------------------------------"
315280297Sjkim	${_+_}cd ${.CURDIR}; ${WMAKE} SHARED=symlinks par-includes
316280297Sjkim_libraries:
317280297Sjkim	@echo
318280297Sjkim	@echo "--------------------------------------------------------------"
319109998Smarkm	@echo ">>> stage 4.2: building libraries"
320280297Sjkim	@echo "--------------------------------------------------------------"
321280297Sjkim	${_+_}cd ${.CURDIR}; \
322280297Sjkim	    ${WMAKE} -DNOFSCHG -DNOHTML -DNOINFO -DNOLINT -DNOMAN -DNOPROFILE \
323280297Sjkim	    libraries
324280297Sjkim_depend:
325280297Sjkim	@echo
326109998Smarkm	@echo "--------------------------------------------------------------"
327280297Sjkim	@echo ">>> stage 4.3: make dependencies"
328280297Sjkim	@echo "--------------------------------------------------------------"
329280297Sjkim	${_+_}cd ${.CURDIR}; ${WMAKE} par-depend
330280297Sjkimeverything:
331280297Sjkim	@echo
332280297Sjkim	@echo "--------------------------------------------------------------"
333280297Sjkim	@echo ">>> stage 4.4: building everything"
334280297Sjkim	@echo "--------------------------------------------------------------"
335280297Sjkim	${_+_}cd ${.CURDIR}; ${WMAKE} par-all
336280297Sjkim
337280297Sjkim
338280297SjkimWMAKE_TGTS=
339109998Smarkm.if !defined(SUBDIR_OVERRIDE)
340280297SjkimWMAKE_TGTS+=	_worldtmp _legacy _bootstrap-tools
341280297Sjkim.endif
342280297SjkimWMAKE_TGTS+=	_cleanobj _obj _build-tools
343280297Sjkim.if !defined(SUBDIR_OVERRIDE)
344280297SjkimWMAKE_TGTS+=	_cross-tools
345280297Sjkim.endif
346280297SjkimWMAKE_TGTS+=	_includes _libraries _depend everything
347280297Sjkim
348280297Sjkimbuildworld: ${WMAKE_TGTS}
349280297Sjkim.ORDER: ${WMAKE_TGTS}
350280297Sjkim
351280297SjkimTOOLCHAIN_TGTS=	${WMAKE_TGTS:N_depend:Neverything}
352280297Sjkimtoolchain: ${TOOLCHAIN_TGTS}
353280297Sjkimkernel-toolchain: ${TOOLCHAIN_TGTS:N_includes:N_libraries}
354280297Sjkim
355280297Sjkim#
356280297Sjkim# Use this to add checks to installworld/installkernel targets.
357280297Sjkim#
358280297SjkimSPECIAL_INSTALLCHECKS=
359280297Sjkim
360280297Sjkim#
361280297Sjkim# The following install-time check will see if the installation will
362280297Sjkim# change the type used for time_t, and if it will, the target makes
363280297Sjkim# sure that the user is expecting to make that change.
364280297Sjkim#
365280297Sjkim.if ${TARGET_ARCH} == "sparc64"
366280297SjkimSPECIAL_INSTALLCHECKS+=sparc64_installcheck
367280297Sjkim
368280297SjkimCUR_TIMET!=	grep __time_t /usr/include/machine/_types.h | awk '{print $$2}'
369280297SjkimSRC_TIMET!=	grep __time_t ${.CURDIR}/sys/sparc64/include/_types.h | \
370280297Sjkim		awk '{print $$2}'
371280297SjkimNEWSPARC_TIMETYPE?=${CUR_TIMET}
372280297Sjkim
373280297Sjkimsparc64_installcheck:
374280297Sjkim.if ${CUR_TIMET} != ${SRC_TIMET}
375280297Sjkim	@echo
37655714Skris.if ${NEWSPARC_TIMETYPE} != ${SRC_TIMET}
377280297Sjkim	@echo "***  ERROR: This target would change the type used for time_t!"
378280297Sjkim.else
379194206Ssimon	@echo "* Note: This installation changes the type used for time_t."
380280297Sjkim.endif
381280297Sjkim	@echo "* "
382280297Sjkim	@echo "* This host has time_t defined as ${CUR_TIMET},"
383280297Sjkim	@echo "* and this installation would change that to type ${SRC_TIMET}."
384280297Sjkim.if ${NEWSPARC_TIMETYPE} != ${SRC_TIMET}
385194206Ssimon	@echo "* "
386280297Sjkim	@echo "* If that is *NOT* what you wanted, then you need to change the"
387280297Sjkim	@echo "* typedef of __time_t in ${.CURDIR}/sys/sparc64/include/_types.h"
388280297Sjkim	@echo "* from '${SRC_TIMET}' to '${CUR_TIMET}'.  After that you *MUST*"
389280297Sjkim	@echo "* do a complete cleanworld, buildworld, buildkernel before you"
390280297Sjkim	@echo "* retry the 'make' command.  Also read /usr/src/UPDATING.64BTT."
391280297Sjkim	@echo "* "
392280297Sjkim	@echo "* If that *is* what you want, then enter the commands:"
393280297Sjkim	@echo "      NEWSPARC_TIMETYPE=${SRC_TIMET}"
394280297Sjkim	@echo "      export NEWSPARC_TIMETYPE"
395280297Sjkim	@echo "* and repeat your 'make' command."
396280297Sjkim	@echo
397280297Sjkim	false
398280297Sjkim.endif
399280297Sjkim	@echo
400280297Sjkim.elif ${NEWSPARC_TIMETYPE} != ${SRC_TIMET}
401280297Sjkim	@echo
402280297Sjkim	@echo "***  ERROR: NEWSPARC_TIMETYPE is set to '${NEWSPARC_TIMETYPE}'"
403280297Sjkim	@echo "***         but ${.CURDIR}/sys/sparc64/include/_types.h"
404280297Sjkim	@echo "***         has __time_t defined as '${SRC_TIMET}'."
405280297Sjkim	false
406280297Sjkim.else
407280297Sjkim	@# in sparc64_installcheck, all TIMETYPEs == '${CUR_TIMET}'
408280297Sjkim.endif
409280297Sjkim.endif
410280297Sjkim
411280297Sjkim#
412280297Sjkim# installcheck
413280297Sjkim#
414280297Sjkim# Checks to be sure system is ready for installworld
415280297Sjkim#
416280297SjkimCHECK_UIDS=
417280297SjkimCHECK_GIDS=
418280297Sjkim.if !defined(NO_SENDMAIL)
419280297SjkimCHECK_UIDS+=	smmsp
420280297SjkimCHECK_GIDS+=	smmsp
421280297Sjkim.endif
422280297Sjkim.if !defined(NO_PF)
423280297SjkimCHECK_UIDS+=	proxy
424280297SjkimCHECK_GIDS+=	proxy authpf
425280297Sjkim.endif
426280297Sjkiminstallcheck: ${SPECIAL_INSTALLCHECKS}
427280297Sjkim.for uid in ${CHECK_UIDS}
428280297Sjkim	@if ! `id -u ${uid} >/dev/null 2>&1`; then \
429280297Sjkim		echo "ERROR: Required ${uid} user is missing, see /usr/src/UPDATING."; \
430280297Sjkim		false; \
431280297Sjkim	fi
432280297Sjkim.endfor
433280297Sjkim.for gid in ${CHECK_GIDS}
434280297Sjkim	@if ! `find / -prune -group ${gid} >/dev/null 2>&1`; then \
435280297Sjkim		echo "ERROR: Required ${gid} group is missing, see /usr/src/UPDATING."; \
436280297Sjkim		false; \
437280297Sjkim	fi
438280297Sjkim.endfor
439280297Sjkim
440280297Sjkim#
441280297Sjkim# distributeworld
442280297Sjkim#
443280297Sjkim# Distributes everything compiled by a `buildworld'.
444280297Sjkim#
445280297Sjkim# installworld
446280297Sjkim#
447280297Sjkim# Installs everything compiled by a 'buildworld'.
448280297Sjkim#
449280297Sjkimdistributeworld installworld: installcheck
450280297Sjkim	mkdir -p ${INSTALLTMP}
451280297Sjkim	for prog in [ awk cap_mkdb cat chflags chmod chown \
452280297Sjkim	    date echo egrep find grep \
453280297Sjkim	    ln make mkdir mtree mv pwd_mkdb rm sed sh sysctl \
454280297Sjkim	    test true uname wc zic; do \
455280297Sjkim		cp `which $$prog` ${INSTALLTMP}; \
456280297Sjkim	done
457280297Sjkim	${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}
458280297Sjkim	rm -rf ${INSTALLTMP}
459280297Sjkim
460280297Sjkim#
461280297Sjkim# reinstall
462280297Sjkim#
463280297Sjkim# If you have a build server, you can NFS mount the source and obj directories
464280297Sjkim# and do a 'make reinstall' on the *client* to install new binaries from the
465280297Sjkim# most recent server build.
466280297Sjkim#
467280297Sjkimreinstall: ${SPECIAL_INSTALLCHECKS}
468280297Sjkim	@echo "--------------------------------------------------------------"
469280297Sjkim	@echo ">>> Making hierarchy"
470280297Sjkim	@echo "--------------------------------------------------------------"
471280297Sjkim	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 hierarchy
472280297Sjkim	@echo
473280297Sjkim	@echo "--------------------------------------------------------------"
474280297Sjkim	@echo ">>> Installing everything"
475280297Sjkim	@echo "--------------------------------------------------------------"
476280297Sjkim	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
477280297Sjkim
478280297Sjkimredistribute:
479280297Sjkim	@echo "--------------------------------------------------------------"
480280297Sjkim	@echo ">>> Distributing everything"
481280297Sjkim	@echo "--------------------------------------------------------------"
482280297Sjkim	${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
483280297Sjkim
484280297Sjkim#
485280297Sjkim# buildkernel and installkernel
486280297Sjkim#
487280297Sjkim# Which kernels to build and/or install is specified by setting
488280297Sjkim# KERNCONF. If not defined a GENERIC kernel is built/installed.
489280297Sjkim# Only the existing (depending TARGET) config files are used
490280297Sjkim# for building kernels and only the first of these is designated
491280297Sjkim# as the one being installed.
492280297Sjkim#
493280297Sjkim# Note that we have to use TARGET instead of TARGET_ARCH when
494280297Sjkim# we're in kernel-land. Since only TARGET_ARCH is (expected) to
495280297Sjkim# be set to cross-build, we have to make sure TARGET is set
496280297Sjkim# properly.
497280297Sjkim
498280297Sjkim.if !defined(KERNCONF) && defined(KERNEL)
499280297SjkimKERNCONF=	${KERNEL}
500280297SjkimKERNWARN=	yes
501280297Sjkim.else
502280297SjkimKERNCONF?=	GENERIC
503280297Sjkim.endif
504280297SjkimINSTKERNNAME?=	kernel
505280297Sjkim
506280297SjkimKERNSRCDIR?=	${.CURDIR}/sys
507280297SjkimKRNLCONFDIR=	${KERNSRCDIR}/${TARGET}/conf
508280297SjkimKRNLOBJDIR=	${OBJTREE}${KERNSRCDIR}
509280297SjkimKERNCONFDIR?=	${KRNLCONFDIR}
510280297Sjkim
511280297SjkimBUILDKERNELS=
512280297SjkimINSTALLKERNEL=
513280297Sjkim.for _kernel in ${KERNCONF}
514280297Sjkim.if exists(${KERNCONFDIR}/${_kernel})
515280297SjkimBUILDKERNELS+=	${_kernel}
516280297Sjkim.if empty(INSTALLKERNEL)
517280297SjkimINSTALLKERNEL= ${_kernel}
518280297Sjkim.endif
519280297Sjkim.endif
520280297Sjkim.endfor
521280297Sjkim
522280297Sjkim#
523280297Sjkim# buildkernel
524280297Sjkim#
525280297Sjkim# Builds all kernels defined by BUILDKERNELS.
526280297Sjkim#
527280297Sjkimbuildkernel:
528280297Sjkim.if empty(BUILDKERNELS)
529280297Sjkim	@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF}).";
530280297Sjkim	false
531280297Sjkim.endif
532280297Sjkim.if defined(KERNWARN)
533280297Sjkim	@echo "--------------------------------------------------------------"
534280297Sjkim	@echo ">>> WARNING: KERNEL= setting should be changed to KERNCONF="
535280297Sjkim	@echo "--------------------------------------------------------------"
536280297Sjkim	@sleep 3
537280297Sjkim.endif
538280297Sjkim	@echo
539280297Sjkim.for _kernel in ${BUILDKERNELS}
540194206Ssimon	@echo "--------------------------------------------------------------"
541194206Ssimon	@echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`"
542280297Sjkim	@echo "--------------------------------------------------------------"
543280297Sjkim	@echo "===> ${_kernel}"
544280297Sjkim	mkdir -p ${KRNLOBJDIR}
545280297Sjkim.if !defined(NO_KERNELCONFIG)
546280297Sjkim	@echo
547280297Sjkim	@echo "--------------------------------------------------------------"
548280297Sjkim	@echo ">>> stage 1: configuring the kernel"
549280297Sjkim	@echo "--------------------------------------------------------------"
550194206Ssimon	cd ${KRNLCONFDIR}; \
551280297Sjkim		PATH=${TMPPATH} \
552280297Sjkim		    config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \
553194206Ssimon			${KERNCONFDIR}/${_kernel}
554280297Sjkim.endif
555280297Sjkim.if !defined(NOCLEAN) && !defined(NO_KERNELCLEAN)
556280297Sjkim	@echo
557280297Sjkim	@echo "--------------------------------------------------------------"
558280297Sjkim	@echo ">>> stage 2.1: cleaning up the object tree"
559280297Sjkim	@echo "--------------------------------------------------------------"
560280297Sjkim	cd ${KRNLOBJDIR}/${_kernel}; \
561280297Sjkim	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} ${CLEANDIR}
562280297Sjkim.endif
563280297Sjkim	@echo
564194206Ssimon	@echo "--------------------------------------------------------------"
565280297Sjkim	@echo ">>> stage 2.2: rebuilding the object tree"
566280297Sjkim	@echo "--------------------------------------------------------------"
567280297Sjkim	cd ${KRNLOBJDIR}/${_kernel}; \
568280297Sjkim	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} obj
569280297Sjkim	@echo
570280297Sjkim	@echo "--------------------------------------------------------------"
571194206Ssimon	@echo ">>> stage 2.3: build tools"
572280297Sjkim	@echo "--------------------------------------------------------------"
573280297Sjkim	cd ${KRNLOBJDIR}/${_kernel}; \
574280297Sjkim	    MAKESRCPATH=${KERNSRCDIR}/dev/aic7xxx/aicasm \
575280297Sjkim	    ${MAKE} -DNO_CPU_CFLAGS -f ${KERNSRCDIR}/dev/aic7xxx/aicasm/Makefile
576280297Sjkim# XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case.
577280297Sjkim.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KERNSRCDIR}/modules)
578280297Sjkim.for target in obj depend all
579194206Ssimon	cd ${.CURDIR}/sys/modules/aic7xxx/aicasm; \
580280297Sjkim	    MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \
581280297Sjkim	    ${MAKE} -DNO_CPU_CFLAGS ${target}
582280297Sjkim.endfor
583280297Sjkim.endif
584280297Sjkim.if !defined(NO_KERNELDEPEND)
585280297Sjkim	@echo
586291719Sjkim	@echo "--------------------------------------------------------------"
587280297Sjkim	@echo ">>> stage 3.1: making dependencies"
588280297Sjkim	@echo "--------------------------------------------------------------"
589280297Sjkim	cd ${KRNLOBJDIR}/${_kernel}; \
590280297Sjkim	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} depend -DNO_MODULES_OBJ
591280297Sjkim.endif
592280297Sjkim	@echo
593280297Sjkim	@echo "--------------------------------------------------------------"
594280297Sjkim	@echo ">>> stage 3.2: building everything"
595280297Sjkim	@echo "--------------------------------------------------------------"
596280297Sjkim	cd ${KRNLOBJDIR}/${_kernel}; \
597280297Sjkim	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} all -DNO_MODULES_OBJ
598280297Sjkim	@echo "--------------------------------------------------------------"
599194206Ssimon	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
600280297Sjkim	@echo "--------------------------------------------------------------"
601280297Sjkim.endfor
602194206Ssimon
603280297Sjkim#
604280297Sjkim# installkernel, etc.
605280297Sjkim#
606280297Sjkim# Install the kernel defined by INSTALLKERNEL
607280297Sjkim#
608194206Ssimoninstallkernel installkernel.debug \
609280297Sjkimreinstallkernel reinstallkernel.debug: ${SPECIAL_INSTALLCHECKS}
610280297Sjkim.if empty(INSTALLKERNEL)
611280297Sjkim	@echo "ERROR: No kernel \"${KERNCONF}\" to install."
612280297Sjkim	false
613280297Sjkim.endif
614291719Sjkim	@echo "--------------------------------------------------------------"
615280297Sjkim	@echo ">>> Making hierarchy"
616194206Ssimon	@echo "--------------------------------------------------------------"
617280297Sjkim	cd ${.CURDIR}; \
618280297Sjkim	    ${CROSSENV} PATH=${TMPPATH} ${MAKE} -f Makefile.inc1 hierarchy
619280297Sjkim	@echo
620194206Ssimon	@echo "--------------------------------------------------------------"
621280297Sjkim	@echo ">>> Installing kernel"
622280297Sjkim	@echo "--------------------------------------------------------------"
623280297Sjkim	cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
624280297Sjkim	    ${CROSSENV} PATH=${TMPPATH} \
625280297Sjkim	    ${MAKE} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel//}
626280297Sjkim
627280297Sjkim#
628280297Sjkim# update
629280297Sjkim#
630280297Sjkim# Update the source tree, by running sup and/or running cvs to update to the
631280297Sjkim# latest copy.
632280297Sjkim#
633280297Sjkimupdate:
634280297Sjkim.if defined(SUP_UPDATE)
635280297Sjkim	@echo "--------------------------------------------------------------"
636280297Sjkim	@echo ">>> Running ${SUP}"
637280297Sjkim	@echo "--------------------------------------------------------------"
638280297Sjkim.if defined(SUPFILE)
639280297Sjkim	@${SUP} ${SUPFLAGS} ${SUPFILE}
640280297Sjkim.endif
641280297Sjkim.if defined(SUPFILE1)
642280297Sjkim	@${SUP} ${SUPFLAGS} ${SUPFILE1}
643280297Sjkim.endif
644280297Sjkim.if defined(SUPFILE2)
645280297Sjkim	@${SUP} ${SUPFLAGS} ${SUPFILE2}
646280297Sjkim.endif
647280297Sjkim.if defined(PORTSSUPFILE) && !defined(NO_PORTSUPDATE)
648280297Sjkim	@${SUP} ${SUPFLAGS} ${PORTSSUPFILE}
649280297Sjkim.endif
650280297Sjkim.if defined(DOCSUPFILE) && !defined(NO_DOCUPDATE)
651280297Sjkim	@${SUP} ${SUPFLAGS} ${DOCSUPFILE}
652280297Sjkim.endif
653280297Sjkim.endif
654280297Sjkim.if defined(CVS_UPDATE)
655280297Sjkim	@echo "--------------------------------------------------------------"
656280297Sjkim	@echo ">>> Updating ${.CURDIR} from cvs repository" ${CVSROOT}
657280297Sjkim	@echo "--------------------------------------------------------------"
658280297Sjkim	cd ${.CURDIR}; ${CVS} -R -q update -A -P -d
659280297Sjkim.endif
660280297Sjkim
661280297Sjkim#
662280297Sjkim# ------------------------------------------------------------------------
663280297Sjkim#
664280297Sjkim# From here onwards are utility targets used by the 'make world' and
665280297Sjkim# related targets.  If your 'world' breaks, you may like to try to fix
666280297Sjkim# the problem and manually run the following targets to attempt to
667280297Sjkim# complete the build.  Beware, this is *not* guaranteed to work, you
668280297Sjkim# need to have a pretty good grip on the current state of the system
669280297Sjkim# to attempt to manually finish it.  If in doubt, 'make world' again.
670280297Sjkim#
671280297Sjkim
672280297Sjkim#
673280297Sjkim# legacy: Build compatibility shims for the next three targets
674280297Sjkim#
675280297Sjkimlegacy:
676280297Sjkim.for _tool in tools/build
677280297Sjkim	${_+_}@${ECHODIR} "===> ${_tool}"; \
678280297Sjkim	    cd ${.CURDIR}/${_tool}; \
679280297Sjkim	    ${MAKE} DIRPRFX=${_tool}/ obj; \
680280297Sjkim	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy includes; \
681280297Sjkim	    ${MAKE} DIRPRFX=${_tool}/ depend; \
682280297Sjkim	    ${MAKE} DIRPRFX=${_tool}/ all; \
683280297Sjkim	    ${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
684280297Sjkim.endfor
685280297Sjkim
686280297Sjkim#
687280297Sjkim# bootstrap-tools: Build tools needed for compatibility
688280297Sjkim#
689280297Sjkim.if !defined(NOGAMES)
690280297Sjkim_strfile=	games/fortune/strfile
691280297Sjkim.endif
692280297Sjkim
693280297Sjkim.if !defined(NO_CXX)
694280297Sjkim_gperf=	gnu/usr.bin/gperf
695280297Sjkim.if ${BOOTSTRAPPING} < 500113
696280297Sjkim_groff=		gnu/usr.bin/groff
697280297Sjkim.else
698280297Sjkim_groff=		gnu/usr.bin/groff/tmac
699280297Sjkim.endif
700280297Sjkim.endif
701280297Sjkim
702280297Sjkim.if ${BOOTSTRAPPING} < 502102
703_lex=		usr.bin/lex
704.endif
705
706.if ${BOOTSTRAPPING} < 450005 || \
707    ${BOOTSTRAPPING} >= 500000 && ${BOOTSTRAPPING} < 500034
708_uudecode=	usr.bin/uudecode
709.endif
710
711.if ${BOOTSTRAPPING} < 430002 || \
712    ${BOOTSTRAPPING} >= 500000 && ${BOOTSTRAPPING} < 500019
713_xargs=		usr.bin/xargs
714.endif
715
716.if ${BOOTSTRAPPING} < 430002 || \
717    ${BOOTSTRAPPING} >= 500000 && ${BOOTSTRAPPING} < 500018
718_yacc=		usr.bin/yacc
719.endif
720
721.if !defined(NO_RESCUE) && \
722    ${BOOTSTRAPPING} < 502128
723_crunchgen=	usr.sbin/crunch/crunchgen
724.endif
725
726.if ${BOOTSTRAPPING} < 502128
727_gensnmptree=	usr.sbin/bsnmpd/gensnmptree
728.endif
729
730.if ${BOOTSTRAPPING} < 500019
731_kbdcontrol=	usr.sbin/kbdcontrol
732.endif
733
734bootstrap-tools:
735.for _tool in \
736    ${_strfile} \
737    ${_gperf} \
738    ${_groff} \
739    gnu/usr.bin/texinfo \
740    usr.bin/colldef \
741    ${_lex} \
742    usr.bin/makewhatis \
743    usr.bin/rpcgen \
744    ${_uudecode} \
745    ${_xargs} \
746    usr.bin/xinstall \
747    ${_yacc} \
748    usr.sbin/config \
749    ${_crunchgen} \
750    ${_gensnmptree} \
751    ${_kbdcontrol}
752	${_+_}@${ECHODIR} "===> ${_tool}"; \
753		cd ${.CURDIR}/${_tool}; \
754		${MAKE} DIRPRFX=${_tool}/ obj; \
755		${MAKE} DIRPRFX=${_tool}/ depend; \
756		${MAKE} DIRPRFX=${_tool}/ all; \
757		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX}/legacy install
758.endfor
759
760#
761# build-tools: Build special purpose build tools
762#
763.if defined(MODULES_WITH_WORLD) && exists(${KERNSRCDIR}/modules)
764_aicasm= sys/modules/aic7xxx/aicasm
765.endif
766
767.if !defined(NOSHARE)
768_share=	share/syscons/scrnmaps
769.endif
770
771.if !defined(NO_KERBEROS) && !defined(NOCRYPT) && !defined(NO_OPENSSL)
772_kerberos5_tools= kerberos5/tools
773.endif
774
775.if !defined(NO_RESCUE)
776_rescue= rescue/rescue
777.endif
778
779build-tools:
780.for _tool in \
781    bin/csh \
782    bin/sh \
783    ${_rescue} \
784    gnu/usr.bin/cc/cc_tools \
785    lib/libncurses \
786    ${_share} \
787    ${_aicasm} \
788    usr.bin/awk \
789    lib/libmagic \
790    usr.sbin/sysinstall
791	${_+_}@${ECHODIR} "===> ${_tool}"; \
792		cd ${.CURDIR}/${_tool}; \
793		${MAKE} DIRPRFX=${_tool}/ obj; \
794		${MAKE} DIRPRFX=${_tool}/ build-tools
795.endfor
796.for _tool in \
797    ${_kerberos5_tools}
798	${_+_}@${ECHODIR} "===> ${_tool}"; \
799		cd ${.CURDIR}/${_tool}; \
800		${MAKE} DIRPRFX=${_tool}/ obj; \
801		${MAKE} DIRPRFX=${_tool}/ depend; \
802		${MAKE} DIRPRFX=${_tool}/ all
803.endfor
804
805#
806# cross-tools: Build cross-building tools
807#
808.if ${TARGET_ARCH} == "sparc64" && ${TARGET_ARCH} != ${MACHINE_ARCH} && \
809    ${BOOTSTRAPPING} < 500037
810_elf2aout=	usr.bin/elf2aout
811.endif
812
813.if ${TARGET_ARCH} == "i386" && ${TARGET_ARCH} != ${MACHINE_ARCH}
814_btxld=		usr.sbin/btxld
815.endif
816
817.if (!defined(NO_RESCUE) || \
818    defined(RELEASEDIR)) && \
819    (${TARGET_ARCH} != ${MACHINE_ARCH} || ${BOOTSTRAPPING} < 501101)
820_crunchide=	usr.sbin/crunch/crunchide
821.endif
822
823.if ${TARGET_ARCH} == "alpha" && ${TARGET_ARCH} != ${MACHINE_ARCH}
824_elf2exe=	usr.sbin/elf2exe
825.endif
826
827.if ${TARGET_ARCH} == "i386" && ${TARGET_ARCH} != ${MACHINE_ARCH} && \
828    defined(RELEASEDIR)
829_kgzip=		usr.sbin/kgzip
830.endif
831
832cross-tools:
833.for _tool in \
834    gnu/usr.bin/binutils \
835    gnu/usr.bin/cc \
836    ${_elf2aout} \
837    usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint \
838    ${_btxld} \
839    ${_crunchide} \
840    ${_elf2exe} \
841    ${_kgzip}
842	${_+_}@${ECHODIR} "===> ${_tool}"; \
843		cd ${.CURDIR}/${_tool}; \
844		${MAKE} DIRPRFX=${_tool}/ obj; \
845		${MAKE} DIRPRFX=${_tool}/ depend; \
846		${MAKE} DIRPRFX=${_tool}/ all; \
847		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
848.endfor
849
850#
851# hierarchy - ensure that all the needed directories are present
852#
853hierarchy:
854	cd ${.CURDIR}/etc;		${MAKE} distrib-dirs
855
856#
857# libraries - build all libraries, and install them under ${DESTDIR}.
858#
859# The list of libraries with dependents (${_prebuild_libs}) and their
860# interdependencies (__L) are built automatically by the
861# ${.CURDIR}/tools/make_libdeps.sh script.
862#
863libraries:
864	cd ${.CURDIR}; \
865	    ${MAKE} -f Makefile.inc1 _startup_libs; \
866	    ${MAKE} -f Makefile.inc1 _prebuild_libs; \
867	    ${MAKE} -f Makefile.inc1 _generic_libs;
868
869# These dependencies are not automatically generated:
870#
871# gnu/lib/csu, gnu/lib/libgcc and lib/csu must be built before all
872# shared libraries for ELF.
873#
874_startup_libs=	gnu/lib/csu gnu/lib/libgcc
875.if exists(${.CURDIR}/lib/csu/${MACHINE_ARCH}-elf)
876_startup_libs+=	lib/csu/${MACHINE_ARCH}-elf
877.else
878_startup_libs+=	lib/csu/${MACHINE_ARCH}
879.endif
880
881_prebuild_libs=
882
883_generic_libs=	gnu/lib
884
885.if !defined(NO_KERBEROS) && !defined(NOCRYPT) && !defined(NO_OPENSSL)
886_prebuild_libs+=	kerberos5/lib/libasn1
887_prebuild_libs+=	kerberos5/lib/libgssapi
888_prebuild_libs+=	kerberos5/lib/libkrb5
889_prebuild_libs+=	kerberos5/lib/libroken
890_generic_libs+=	kerberos5/lib
891.endif
892
893_prebuild_libs+= lib/libcom_err lib/libcrypt lib/libexpat \
894		lib/libkvm lib/libmd \
895		lib/libncurses lib/libnetgraph lib/libopie lib/libpam \
896		lib/libradius \
897		lib/libsbuf lib/libtacplus lib/libutil lib/libypclnt \
898		lib/libz lib/msun
899
900lib/libopie__L lib/libtacplus__L: lib/libmd__L
901
902_generic_libs+=	lib
903
904.if !defined(NOCRYPT)
905.if !defined(NO_OPENSSL)
906_prebuild_libs+=	secure/lib/libcrypto secure/lib/libssl
907lib/libradius__L: secure/lib/libssl__L
908secure/lib/libssl__L: secure/lib/libcrypto__L
909.if !defined(NO_OPENSSH)
910_prebuild_libs+=	secure/lib/libssh
911secure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L
912.if !defined(NO_KERBEROS)
913secure/lib/libssh__L: kerberos5/lib/libgssapi__L kerberos5/lib/libkrb5__L \
914    kerberos5/lib/libasn1__L lib/libcom_err__L lib/libmd__L \
915    kerberos5/lib/libroken__L
916.endif
917.endif
918.endif
919_generic_libs+=	secure/lib
920.endif
921
922.if defined(NOCRYPT) || defined(NO_OPENSSL)
923lib/libradius__L: lib/libmd__L
924.endif
925
926_generic_libs+=	usr.bin/lex/lib
927
928.if ${MACHINE_ARCH} == "i386"
929_generic_libs+=	usr.sbin/pcvt/keycap
930.endif
931
932.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs}
933${_lib}__L: .PHONY
934.if exists(${.CURDIR}/${_lib})
935	${_+_}@${ECHODIR} "===> ${_lib}"; \
936		cd ${.CURDIR}/${_lib}; \
937		${MAKE} DIRPRFX=${_lib}/ depend; \
938		${MAKE} DIRPRFX=${_lib}/ all; \
939		${MAKE} DIRPRFX=${_lib}/ install
940.endif
941.endfor
942
943# libpam is special: we need to build static PAM modules before
944# static PAM library, and dynamic PAM library before dynamic PAM
945# modules.
946lib/libpam__L: .PHONY
947	${_+_}@${ECHODIR} "===> lib/libpam"; \
948		cd ${.CURDIR}/lib/libpam; \
949		${MAKE} DIRPRFX=lib/libpam/ depend; \
950		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET all; \
951		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET install
952
953_startup_libs: ${_startup_libs:S/$/__L/}
954_prebuild_libs: ${_prebuild_libs:S/$/__L/}
955_generic_libs: ${_generic_libs:S/$/__L/}
956
957.for __target in all clean cleandepend cleandir depend includes obj
958.for entry in ${SUBDIR}
959${entry}.${__target}__D: .PHONY
960	${_+_}@if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \
961		${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE_ARCH}"; \
962		edir=${entry}.${MACHINE_ARCH}; \
963		cd ${.CURDIR}/$${edir}; \
964	else \
965		${ECHODIR} "===> ${DIRPRFX}${entry}"; \
966		edir=${entry}; \
967		cd ${.CURDIR}/$${edir}; \
968	fi; \
969	${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/
970.endfor
971par-${__target}: ${SUBDIR:S/$/.${__target}__D/}
972.endfor
973
974.include <bsd.subdir.mk>
975