Makefile.inc1 revision 111212
1#
2# $FreeBSD: head/Makefile.inc1 111212 2003-02-21 11:19:25Z ru $
3#
4# Make command line options:
5#	-DMAKE_KERBEROS4 to build KerberosIV
6#	-DMAKE_KERBEROS5 to build Kerberos5
7#	-DNOCLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir
8#	-DNOCLEAN do not clean at all
9#	-DNOCRYPT will prevent building of crypt versions
10#	-DNOMAN do not build the manual pages
11#	-DNOPROFILE do not build profiled libraries
12#	-DNOSECURE do not go into secure subdir
13#	-DNOGAMES do not go into games subdir
14#	-DNOSHARE do not go into share subdir
15#	-DNOINFO do not make or install info files
16#	-DNOLIBC_R do not build libc_r.
17#	-DNO_FORTRAN do not build g77 and related libraries.
18#	-DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel
19#	-DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel
20#	-DNO_KERNELDEPEND do not run ${MAKE} depend in ${MAKE} buildkernel
21#	-DNO_PORTSUPDATE do not update ports in ${MAKE} update
22#	-DNO_DOCUPDATE do not update doc in ${MAKE} update
23#	LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
24#	TARGET_ARCH="arch" to crossbuild world to a different arch
25
26#
27# The intended user-driven targets are:
28# buildworld  - rebuild *everything*, including glue to help do upgrades
29# installworld- install everything built by "buildworld"
30# update      - convenient way to update your source tree (eg: sup/cvs)
31# most        - build user commands, no libraries or include files
32# installmost - install user commands, no libraries or include files
33#
34# Standard targets (not defined here) are documented in the makefiles in
35# /usr/share/mk.  These include:
36#		obj depend all install clean cleandepend cleanobj
37
38# Put initial settings here.
39SUBDIR=
40
41# We must do share/info early so that installation of info `dir'
42# entries works correctly.  Do it first since it is less likely to
43# grow dependencies on include and lib than vice versa.
44.if exists(${.CURDIR}/share/info)
45SUBDIR+= share/info
46.endif
47
48.if exists(${.CURDIR}/include)
49SUBDIR+= include
50.endif
51.if exists(${.CURDIR}/lib)
52SUBDIR+= lib
53.endif
54
55.if exists(${.CURDIR}/bin)
56SUBDIR+= bin
57.endif
58.if exists(${.CURDIR}/games) && !defined(NOGAMES)
59SUBDIR+= games
60.endif
61.if exists(${.CURDIR}/gnu)
62SUBDIR+= gnu
63.endif
64.if exists(${.CURDIR}/kerberosIV) && exists(${.CURDIR}/crypto) && \
65    !defined(NOCRYPT) && !defined(NO_OPENSSL) && defined(MAKE_KERBEROS4)
66SUBDIR+= kerberosIV
67.endif
68.if exists(${.CURDIR}/kerberos5) && exists(${.CURDIR}/crypto) && \
69    !defined(NOCRYPT) && !defined(NO_OPENSSL) && defined(MAKE_KERBEROS5)
70SUBDIR+= kerberos5
71.endif
72.if exists(${.CURDIR}/libexec)
73SUBDIR+= libexec
74.endif
75.if exists(${.CURDIR}/sbin)
76SUBDIR+= sbin
77.endif
78.if exists(${.CURDIR}/secure) && !defined(NOCRYPT) && !defined(NOSECURE)
79SUBDIR+= secure
80.endif
81.if exists(${.CURDIR}/share) && !defined(NOSHARE)
82SUBDIR+= share
83.endif
84.if exists(${.CURDIR}/sys)
85SUBDIR+= sys
86.endif
87.if exists(${.CURDIR}/usr.bin)
88SUBDIR+= usr.bin
89.endif
90.if exists(${.CURDIR}/usr.sbin)
91SUBDIR+= usr.sbin
92.endif
93
94# etc must be last for "distribute" to work
95.if exists(${.CURDIR}/etc)
96SUBDIR+= etc
97.endif
98
99# These are last, since it is nice to at least get the base system
100# rebuilt before you do them.
101.if defined(LOCAL_DIRS)
102.for _DIR in ${LOCAL_DIRS}
103.if exists(${.CURDIR}/${_DIR}) & exists(${.CURDIR}/${_DIR}/Makefile)
104SUBDIR+= ${_DIR}
105.endif
106.endfor
107.endif
108
109.if defined(SUBDIR_OVERRIDE)
110SUBDIR=		${SUBDIR_OVERRIDE}
111.endif
112
113.if defined(NOCLEANDIR)
114CLEANDIR=	clean cleandepend
115.else
116CLEANDIR=	cleandir
117.endif
118
119CVS?=		cvs
120SUP?=		/usr/local/bin/cvsup
121SUPFLAGS?=	-g -L 2 -P -
122.if defined(SUPHOST)
123SUPFLAGS+=	-h ${SUPHOST}
124.endif
125
126MAKEOBJDIRPREFIX?=	/usr/obj
127OSRELDATE!=	sysctl -n kern.osreldate
128TARGET_ARCH?=	${MACHINE_ARCH}
129.if ${TARGET_ARCH} == ${MACHINE_ARCH}
130TARGET?=	${MACHINE}
131TARGET_CPUTYPE?=${CPUTYPE}
132.else
133TARGET?=	${TARGET_ARCH}
134TARGET_CPUTYPE?=
135.endif
136.if !empty(TARGET_CPUTYPE)
137_TARGET_CPUTYPE=${TARGET_CPUTYPE}
138.else
139_TARGET_CPUTYPE=dummy
140.endif
141_CPUTYPE!=	${MAKE} -f /dev/null -m ${.CURDIR}/share/mk \
142		CPUTYPE=${_TARGET_CPUTYPE} -V CPUTYPE
143.if ${_CPUTYPE} != ${_TARGET_CPUTYPE}
144.error CPUTYPE global should be set with ?=.
145.endif
146.if make(buildworld)
147BUILD_ARCH!=	sysctl -n hw.machine_arch
148.if ${MACHINE_ARCH} != ${BUILD_ARCH}
149.error To cross-build, set TARGET_ARCH.
150.endif
151.endif
152.if ${MACHINE} == ${TARGET}
153OBJTREE=	${MAKEOBJDIRPREFIX}
154.else
155OBJTREE=	${MAKEOBJDIRPREFIX}/${TARGET}
156.endif
157WORLDTMP=	${OBJTREE}${.CURDIR}/${MACHINE_ARCH}
158# /usr/games added for fortune which depend on strfile
159STRICTTMPPATH=	${WORLDTMP}/usr/sbin:${WORLDTMP}/usr/bin:${WORLDTMP}/usr/games
160TMPPATH=	${STRICTTMPPATH}:${PATH}
161
162INSTALLTMP!=	/usr/bin/mktemp -d -u -t install
163
164#
165# Building a world goes through the following stages
166#
167# 1. bootstrap-tool stage [BMAKE]
168#	This stage is responsible for creating programs that
169#	are needed for backward compatibility reasons. They
170#	are not built as cross-tools.
171# 2. build-tool stage [TMAKE]
172#	This stage is responsible for creating the object
173#	tree and building any tools that are needed during
174#	the build process.
175# 3. cross-tool stage [XMAKE]
176#	This stage is responsible for creating any tools that
177#	are needed for cross-builds. A cross-compiler is one
178#	of them.
179# 4. world stage [WMAKE]
180#	This stage actually builds the world.
181# 5. install stage (optional) [IMAKE]
182#	This stage installs a previously built world.
183#
184
185# Common environment for world related stages
186CROSSENV=	MAKEOBJDIRPREFIX=${OBJTREE} \
187		MACHINE_ARCH=${TARGET_ARCH} \
188		MACHINE=${TARGET} \
189		CPUTYPE=${TARGET_CPUTYPE} \
190		GROFF_BIN_PATH=${WORLDTMP}/usr/bin \
191		GROFF_FONT_PATH=${WORLDTMP}/usr/share/groff_font \
192		GROFF_TMAC_PATH=${WORLDTMP}/usr/share/tmac
193
194# bootstrap-tool stage
195BMAKEENV=	MAKEOBJDIRPREFIX=${WORLDTMP} \
196		DESTDIR= \
197		INSTALL="sh ${.CURDIR}/tools/install.sh"
198BMAKE=		${BMAKEENV} ${MAKE} -f Makefile.inc1 \
199		BOOTSTRAPPING=${OSRELDATE} \
200		-DNOHTML -DNOINFO -DNOMAN -DNOPIC -DNOPROFILE -DNOSHARED \
201		-DNO_CPU_CFLAGS -DNO_WERROR
202
203# build-tool stage
204TMAKEENV=	MAKEOBJDIRPREFIX=${OBJTREE} \
205		DESTDIR= \
206		INSTALL="sh ${.CURDIR}/tools/install.sh"
207TMAKE=		${TMAKEENV} ${MAKE} -f Makefile.inc1 \
208		BOOTSTRAPPING=${OSRELDATE} -DNO_CPU_CFLAGS
209
210# cross-tool stage
211XMAKE=		TOOLS_PREFIX=${WORLDTMP} ${BMAKE} -DNO_FORTRAN -DNO_GDB
212
213# world stage
214WMAKEENV=	${CROSSENV} \
215		DESTDIR=${WORLDTMP} \
216		INSTALL="sh ${.CURDIR}/tools/install.sh" \
217		PATH=${TMPPATH}
218WMAKE=		${WMAKEENV} ${MAKE} -f Makefile.inc1
219
220# install stage
221IMAKEENV=	${CROSSENV} \
222		PATH=${STRICTTMPPATH}:${INSTALLTMP}
223IMAKE=		${IMAKEENV} ${MAKE} -f Makefile.inc1
224
225# kernel stage
226KMAKEENV=	${WMAKEENV}
227
228USRDIRS=	usr/bin usr/lib/compat/aout usr/games usr/libdata/ldscripts \
229		usr/libexec usr/sbin usr/share/misc \
230		usr/share/dict \
231		usr/share/groff_font/devX100 \
232		usr/share/groff_font/devX100-12 \
233		usr/share/groff_font/devX75 \
234		usr/share/groff_font/devX75-12 \
235		usr/share/groff_font/devascii \
236		usr/share/groff_font/devcp1047 \
237		usr/share/groff_font/devdvi \
238		usr/share/groff_font/devhtml \
239		usr/share/groff_font/devkoi8-r \
240		usr/share/groff_font/devlatin1 \
241		usr/share/groff_font/devlbp \
242		usr/share/groff_font/devlj4 \
243		usr/share/groff_font/devps \
244		usr/share/groff_font/devutf8 \
245		usr/share/tmac/mdoc usr/share/tmac/mm
246
247INCDIRS=	arpa dev fs g++/backward g++/bits g++/ext isc isofs libmilter \
248		objc openssl protocols readline rpc rpcsvc security ufs
249
250#
251# buildworld
252#
253# Attempt to rebuild the entire system, with reasonable chance of
254# success, regardless of how old your existing system is.
255#
256_worldtmp:
257.if ${.CURDIR:C/[^,]//g} != ""
258#	The m4 build of sendmail files doesn't like it if ',' is used
259#	anywhere in the path of it's files.
260	@echo
261	@echo "*** Error: path to source tree contains a comma ','"
262	@echo
263	@false
264.endif
265	@echo
266	@echo "--------------------------------------------------------------"
267	@echo ">>> Rebuilding the temporary build tree"
268	@echo "--------------------------------------------------------------"
269.if !defined(NOCLEAN)
270	rm -rf ${WORLDTMP}
271.else
272	# XXX - These two can depend on any header file.
273	rm -f ${OBJTREE}${.CURDIR}/usr.bin/kdump/ioctl.c
274	rm -f ${OBJTREE}${.CURDIR}/usr.bin/truss/ioctl.c
275.endif
276.for _dir in ${USRDIRS}
277	mkdir -p ${WORLDTMP}/${_dir}
278.endfor
279.for _dir in ${INCDIRS}
280	mkdir -p ${WORLDTMP}/usr/include/${_dir}
281.endfor
282	ln -sf ${.CURDIR}/sys ${WORLDTMP}
283_bootstrap-tools:
284	@echo
285	@echo "--------------------------------------------------------------"
286	@echo ">>> stage 1: bootstrap tools"
287	@echo "--------------------------------------------------------------"
288	cd ${.CURDIR}; ${BMAKE} bootstrap-tools
289_cleanobj:
290.if !defined(NOCLEAN)
291	@echo
292	@echo "--------------------------------------------------------------"
293	@echo ">>> stage 2: cleaning up the object tree"
294	@echo "--------------------------------------------------------------"
295	cd ${.CURDIR}; ${WMAKE} ${CLEANDIR:S/^/par-/}
296.endif
297_obj:
298	@echo
299	@echo "--------------------------------------------------------------"
300	@echo ">>> stage 2: rebuilding the object tree"
301	@echo "--------------------------------------------------------------"
302	cd ${.CURDIR}; ${WMAKE} par-obj
303_build-tools:
304	@echo
305	@echo "--------------------------------------------------------------"
306	@echo ">>> stage 2: build tools"
307	@echo "--------------------------------------------------------------"
308	cd ${.CURDIR}; ${TMAKE} build-tools
309_cross-tools:
310	@echo
311	@echo "--------------------------------------------------------------"
312	@echo ">>> stage 3: cross tools"
313	@echo "--------------------------------------------------------------"
314	cd ${.CURDIR}; ${XMAKE} cross-tools
315_includes:
316	@echo
317	@echo "--------------------------------------------------------------"
318	@echo ">>> stage 4: populating ${WORLDTMP}/usr/include"
319	@echo "--------------------------------------------------------------"
320	cd ${.CURDIR}; ${WMAKE} SHARED=symlinks par-includes
321_libraries:
322	@echo
323	@echo "--------------------------------------------------------------"
324	@echo ">>> stage 4: building libraries"
325	@echo "--------------------------------------------------------------"
326	cd ${.CURDIR}; ${WMAKE} -DNOHTML -DNOINFO -DNOMAN -DNOFSCHG libraries
327_depend:
328	@echo
329	@echo "--------------------------------------------------------------"
330	@echo ">>> stage 4: make dependencies"
331	@echo "--------------------------------------------------------------"
332	cd ${.CURDIR}; ${WMAKE} par-depend
333everything:
334	@echo
335	@echo "--------------------------------------------------------------"
336	@echo ">>> stage 4: building everything.."
337	@echo "--------------------------------------------------------------"
338	cd ${.CURDIR}; ${WMAKE} all
339
340
341WMAKE_TGTS=
342.if !defined(SUBDIR_OVERRIDE)
343WMAKE_TGTS+=	_worldtmp _bootstrap-tools
344.endif
345WMAKE_TGTS+=	_cleanobj _obj _build-tools
346.if !defined(SUBDIR_OVERRIDE)
347WMAKE_TGTS+=	_cross-tools
348.endif
349WMAKE_TGTS+=	_includes _libraries _depend everything
350
351buildworld: ${WMAKE_TGTS}
352.ORDER: ${WMAKE_TGTS}
353
354#
355# installcheck
356#
357# Checks to be sure system is ready for installworld
358#
359installcheck:
360.if !defined(NO_SENDMAIL)
361	@if ! `grep -q '^smmsp:' /etc/passwd`; then \
362		echo "ERROR: Required smmsp user is missing, see /usr/src/UPDATING."; \
363		false; \
364	fi
365	@if ! `grep -q '^smmsp:' /etc/group`; then \
366		echo "ERROR: Required smmsp group is missing, see /usr/src/UPDATING."; \
367		false; \
368	fi
369.endif
370.if ${TARGET_ARCH} == ${MACHINE_ARCH} && !defined(DISTDIR) && \
371    (!defined(DESTDIR) || empty(DESTDIR) || ${DESTDIR} == "/")
372	@echo "Checking to see if your booted kernel is fresh enough.."
373	${.OBJDIR}/bin/sh/sh -c \
374	    'echo "Testing installed kernel for new sigaction(2) syscall"'
375	@echo "Seems ok.."
376.endif
377
378#
379# distributeworld
380#
381# Distributes everything compiled by a `buildworld'.
382#
383# installworld
384#
385# Installs everything compiled by a 'buildworld'.
386#
387distributeworld installworld: installcheck
388	mkdir -p ${INSTALLTMP}
389	for prog in [ awk cat chflags chmod chown date echo egrep find grep \
390	    ln make mkdir mtree mv pwd_mkdb rm sed sh sysctl \
391	    test true uname wc zic; do \
392		cp `which $$prog` ${INSTALLTMP}; \
393	done
394	cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}
395	rm -rf ${INSTALLTMP}
396
397#
398# reinstall
399#
400# If you have a build server, you can NFS mount the source and obj directories
401# and do a 'make reinstall' on the *client* to install new binaries from the
402# most recent server build.
403#
404reinstall:
405	@echo "--------------------------------------------------------------"
406	@echo ">>> Making hierarchy"
407	@echo "--------------------------------------------------------------"
408	cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 hierarchy
409	@echo
410	@echo "--------------------------------------------------------------"
411	@echo ">>> Installing everything.."
412	@echo "--------------------------------------------------------------"
413	cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
414.if !defined(NOMAN) && !defined(NO_MAKEDB_RUN)
415	@echo
416	@echo "--------------------------------------------------------------"
417	@echo ">>> Rebuilding man page indices"
418	@echo "--------------------------------------------------------------"
419	cd ${.CURDIR}/share/man; ${MAKE} makedb
420.endif
421
422redistribute:
423	@echo "--------------------------------------------------------------"
424	@echo ">>> Distributing everything.."
425	@echo "--------------------------------------------------------------"
426	cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
427
428#
429# buildkernel and installkernel
430#
431# Which kernels to build and/or install is specified by setting
432# KERNCONF. If not defined a GENERIC kernel is built/installed.
433# Only the existing (depending TARGET) config files are used
434# for building kernels and only the first of these is designated
435# as the one being installed.
436#
437# Note that we have to use TARGET instead of TARGET_ARCH when
438# we're in kernel-land. Since only TARGET_ARCH is (expected) to
439# be set to cross-build, we have to make sure TARGET is set
440# properly.
441
442.if !defined(KERNCONF) && defined(KERNEL)
443KERNCONF=	${KERNEL}
444KERNWARN=	yes
445.else
446KERNCONF?=	GENERIC
447.endif
448INSTKERNNAME?=	kernel
449
450KRNLSRCDIR=	${.CURDIR}/sys
451KRNLCONFDIR=	${KRNLSRCDIR}/${TARGET}/conf
452KRNLOBJDIR=	${OBJTREE}${KRNLSRCDIR}
453KERNCONFDIR?=	${KRNLCONFDIR}
454
455BUILDKERNELS=
456INSTALLKERNEL=
457.for _kernel in ${KERNCONF}
458.if exists(${KERNCONFDIR}/${_kernel})
459BUILDKERNELS+=	${_kernel}
460.if empty(INSTALLKERNEL)
461INSTALLKERNEL= ${_kernel}
462.endif
463.endif
464.endfor
465
466#
467# buildkernel
468#
469# Builds all kernels defined by BUILDKERNELS.
470#
471buildkernel:
472.if empty(BUILDKERNELS)
473	@echo "ERROR: Missing kernel configuration file(s) (${KERNCONF}).";
474	@false
475.endif
476.if defined(KERNWARN)
477	@echo "--------------------------------------------------------------"
478	@echo ">>> WARNING: KERNEL= setting should be changed to KERNCONF="
479	@echo "--------------------------------------------------------------"
480	@sleep 3
481.endif
482	@echo
483.for _kernel in ${BUILDKERNELS}
484	@echo "--------------------------------------------------------------"
485	@echo ">>> Kernel build for ${_kernel} started on `LC_ALL=C date`"
486	@echo "--------------------------------------------------------------"
487	@echo "===> ${_kernel}"
488	mkdir -p ${KRNLOBJDIR}
489.if !defined(NO_KERNELCONFIG)
490	cd ${KRNLCONFDIR}; \
491		PATH=${TMPPATH} \
492		    config ${CONFIGARGS} -d ${KRNLOBJDIR}/${_kernel} \
493			${KERNCONFDIR}/${_kernel}
494.endif
495.if !defined(NOCLEAN) && !defined(NO_KERNELCLEAN)
496	cd ${KRNLOBJDIR}/${_kernel}; \
497	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} -DNO_MODULES clean
498	cd ${KRNLOBJDIR}/${_kernel}; \
499	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} cleandir
500.endif
501	cd ${KRNLOBJDIR}/${_kernel}; \
502	    MAKESRCPATH=${KRNLSRCDIR}/dev/aic7xxx/aicasm \
503	    ${MAKE} -DNO_CPU_CFLAGS -f ${KRNLSRCDIR}/dev/aic7xxx/aicasm/Makefile
504	cd ${KRNLOBJDIR}/${_kernel}; \
505	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} obj
506# XXX - Gratuitously builds aicasm in the ``makeoptions NO_MODULES'' case.
507.if !defined(MODULES_WITH_WORLD) && !defined(NO_MODULES) && exists(${KRNLSRCDIR}/modules)
508.for target in obj depend all
509	cd ${.CURDIR}/sys/modules/aic7xxx/aicasm; \
510	    MAKEOBJDIRPREFIX=${KRNLOBJDIR}/${_kernel}/modules \
511	    ${MAKE} -DNO_CPU_CFLAGS ${target}
512.endfor
513.endif
514.if !defined(NO_KERNELDEPEND)
515	cd ${KRNLOBJDIR}/${_kernel}; \
516	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} depend -DNO_MODULES_OBJ
517.endif
518	cd ${KRNLOBJDIR}/${_kernel}; \
519	    ${KMAKEENV} ${MAKE} KERNEL=${INSTKERNNAME} all -DNO_MODULES_OBJ
520	@echo "--------------------------------------------------------------"
521	@echo ">>> Kernel build for ${_kernel} completed on `LC_ALL=C date`"
522	@echo "--------------------------------------------------------------"
523.endfor
524
525#
526# installkernel
527#
528# Install the kernel defined by INSTALLKERNEL
529#
530installkernel reinstallkernel:
531.if empty(INSTALLKERNEL)
532	@echo "ERROR: No kernel \"${KERNCONF}\" to install."
533	@false
534.endif
535	cd ${KRNLOBJDIR}/${INSTALLKERNEL}; \
536	    ${CROSSENV} PATH=${TMPPATH} \
537	    ${MAKE} KERNEL=${INSTKERNNAME} ${.TARGET:S/kernel$//}
538
539#
540# update
541#
542# Update the source tree, by running sup and/or running cvs to update to the
543# latest copy.
544#
545update:
546.if defined(SUP_UPDATE)
547	@echo "--------------------------------------------------------------"
548	@echo ">>> Running ${SUP}"
549	@echo "--------------------------------------------------------------"
550.if defined(SUPFILE)
551	@${SUP} ${SUPFLAGS} ${SUPFILE}
552.endif
553.if defined(SUPFILE1)
554	@${SUP} ${SUPFLAGS} ${SUPFILE1}
555.endif
556.if defined(SUPFILE2)
557	@${SUP} ${SUPFLAGS} ${SUPFILE2}
558.endif
559.if defined(PORTSSUPFILE) && !defined(NO_PORTSUPDATE)
560	@${SUP} ${SUPFLAGS} ${PORTSSUPFILE}
561.endif
562.if defined(DOCSUPFILE) && !defined(NO_DOCUPDATE)
563	@${SUP} ${SUPFLAGS} ${DOCSUPFILE}
564.endif
565.endif
566.if defined(CVS_UPDATE)
567	@echo "--------------------------------------------------------------"
568	@echo ">>> Updating ${.CURDIR} from cvs repository" ${CVSROOT}
569	@echo "--------------------------------------------------------------"
570	cd ${.CURDIR}; ${CVS} -q update -A -P -d
571.endif
572
573#
574# most
575#
576# Build most of the user binaries on the existing system libs and includes.
577#
578most:
579	@echo "--------------------------------------------------------------"
580	@echo ">>> Building programs only"
581	@echo "--------------------------------------------------------------"
582.for _dir in bin sbin libexec usr.bin usr.sbin gnu/usr.bin gnu/usr.sbin
583	cd ${.CURDIR}/${_dir};		${MAKE} DIRPRFX=${_dir}/ all
584.endfor
585
586#
587# installmost
588#
589# Install the binaries built by the 'most' target.  This does not include
590# libraries or include files.
591#
592installmost:
593	@echo "--------------------------------------------------------------"
594	@echo ">>> Installing programs only"
595	@echo "--------------------------------------------------------------"
596.for _dir in bin sbin libexec usr.bin usr.sbin gnu/usr.bin gnu/usr.sbin
597	cd ${.CURDIR}/${_dir};		${MAKE} DIRPRFX=${_dir}/ install
598.endfor
599
600#
601# ------------------------------------------------------------------------
602#
603# From here onwards are utility targets used by the 'make world' and
604# related targets.  If your 'world' breaks, you may like to try to fix
605# the problem and manually run the following targets to attempt to
606# complete the build.  Beware, this is *not* guaranteed to work, you
607# need to have a pretty good grip on the current state of the system
608# to attempt to manually finish it.  If in doubt, 'make world' again.
609#
610
611#
612# bootstrap-tools: Build tools needed for compatibility
613#
614.if exists(${.CURDIR}/games) && !defined(NOGAMES)
615_strfile=	games/fortune/strfile
616.endif
617
618bootstrap-tools:
619.for _tool in ${_strfile} usr.bin/yacc usr.bin/colldef \
620    usr.bin/makewhatis usr.bin/rpcgen usr.bin/uudecode \
621    usr.bin/xargs usr.bin/xinstall \
622    usr.sbin/config usr.sbin/kbdcontrol \
623    gnu/usr.bin/gperf gnu/usr.bin/groff gnu/usr.bin/texinfo
624	${ECHODIR} "===> ${_tool}"; \
625		cd ${.CURDIR}/${_tool}; \
626		${MAKE} DIRPRFX=${_tool}/ obj; \
627		${MAKE} DIRPRFX=${_tool}/ depend; \
628		${MAKE} DIRPRFX=${_tool}/ all; \
629		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
630.endfor
631
632#
633# build-tools: Build special purpose build tools
634#
635.if defined(MODULES_WITH_WORLD) && exists(${KRNLSRCDIR}/modules)
636_aicasm= sys/modules/aic7xxx/aicasm
637.endif
638
639.if exists(${.CURDIR}/share) && !defined(NOSHARE)
640_share=	share/syscons/scrnmaps
641.endif
642
643.if !defined(NO_FORTRAN)
644_fortran= gnu/usr.bin/cc/f771
645.endif
646
647.if exists(${.CURDIR}/kerberosIV) && exists(${.CURDIR}/crypto) && \
648    !defined(NOCRYPT) && defined(MAKE_KERBEROS4)
649_libroken4= kerberosIV/lib/libroken
650.endif
651
652.if exists(${.CURDIR}/kerberos5) && exists(${.CURDIR}/crypto) && \
653    !defined(NOCRYPT) && defined(MAKE_KERBEROS5)
654_libkrb5= kerberos5/lib/libroken kerberos5/lib/libvers \
655    kerberos5/lib/libasn1 kerberos5/lib/libhdb kerberos5/lib/libsl
656.endif
657
658build-tools:
659.for _tool in bin/csh bin/sh gnu/usr.bin/cc/cc_tools ${_fortran} \
660    ${_libroken4} ${_libkrb5} lib/libncurses ${_share} \
661    ${_aicasm} usr.bin/awk usr.bin/file usr.sbin/sysinstall
662	${ECHODIR} "===> ${_tool}"; \
663		cd ${.CURDIR}/${_tool}; ${MAKE} DIRPRFX=${_tool}/ build-tools
664.endfor
665
666#
667# cross-tools: Build cross-building tools
668#
669.if ${TARGET_ARCH} == "alpha" && ${MACHINE_ARCH} != "alpha"
670_elf2exe=	usr.sbin/elf2exe
671.endif
672
673.if ${TARGET_ARCH} == "i386" && ${MACHINE_ARCH} != "i386"
674_btxld=	usr.sbin/btxld
675.endif
676
677.if ${TARGET_ARCH} == "sparc64"
678_elf2aout=	usr.bin/elf2aout
679.endif
680
681_xlint=	usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint
682
683cross-tools:
684.for _tool in ${_btxld} ${_elf2aout} ${_elf2exe} \
685    gnu/usr.bin/binutils usr.sbin/crunch/crunchide \
686    gnu/usr.bin/cc ${_xlint}
687	${ECHODIR} "===> ${_tool}"; \
688		cd ${.CURDIR}/${_tool}; \
689		${MAKE} DIRPRFX=${_tool}/ obj; \
690		${MAKE} DIRPRFX=${_tool}/ depend; \
691		${MAKE} DIRPRFX=${_tool}/ all; \
692		${MAKE} DIRPRFX=${_tool}/ DESTDIR=${MAKEOBJDIRPREFIX} install
693.endfor
694
695#
696# hierarchy - ensure that all the needed directories are present
697#
698hierarchy:
699	cd ${.CURDIR}/etc;		${MAKE} distrib-dirs
700
701#
702# libraries - build all libraries, and install them under ${DESTDIR}.
703#
704# The list of libraries with dependents (${_prebuild_libs}) and their
705# interdependencies (__L) are built automatically by the
706# ${.CURDIR}/tools/make_libdeps.sh script.
707#
708libraries:
709	cd ${.CURDIR}; \
710	    ${MAKE} -f Makefile.inc1 _startup_libs; \
711	    ${MAKE} -f Makefile.inc1 _prebuild_libs; \
712	    ${MAKE} -f Makefile.inc1 _generic_libs;
713
714# These dependencies are not automatically generated:
715#
716# gnu/lib/csu, gnu/lib/libgcc and lib/csu must be built before all
717# shared libraries for ELF.
718#
719_startup_libs=	gnu/lib/csu gnu/lib/libgcc
720.if exists(${.CURDIR}/lib/csu/${MACHINE_ARCH}-elf)
721_startup_libs+=	lib/csu/${MACHINE_ARCH}-elf
722.else
723_startup_libs+=	lib/csu/${MACHINE_ARCH}
724.endif
725
726_prebuild_libs=
727
728_generic_libs=	gnu/lib
729
730.if !defined(NOCRYPT) && defined(MAKE_KERBEROS5)
731_prebuild_libs+=	kerberos5/lib/libasn1
732_prebuild_libs+=	kerberos5/lib/libgssapi
733_prebuild_libs+=	kerberos5/lib/libkrb5
734_prebuild_libs+=	kerberos5/lib/libroken
735_generic_libs+=	kerberos5/lib
736.endif
737
738.if !defined(NOCRYPT) && defined(MAKE_KERBEROS4)
739_prebuild_libs+=	kerberosIV/lib/libkrb
740kerberosIV/lib/libkrb__L: lib/libcrypt__L
741_generic_libs+=	kerberosIV/lib
742.endif
743
744_prebuild_libs+= lib/libcom_err lib/libcrypt lib/libkvm lib/libmd \
745		lib/libncurses lib/libopie lib/libpam lib/libradius \
746		lib/librpcsvc \
747		lib/libsbuf lib/libtacplus lib/libutil lib/libypclnt \
748		lib/libz lib/msun
749
750lib/libopie__L lib/libradius__L lib/libtacplus__L: lib/libmd__L
751lib/libypclnt__L: lib/librpcsvc__L
752
753_generic_libs+=	lib
754
755.if !defined(NOCRYPT) && !defined(NOSECURE)
756.if !defined(NO_OPENSSL)
757_prebuild_libs+=	secure/lib/libcrypto secure/lib/libssl
758.if !defined(NO_OPENSSH)
759_prebuild_libs+=	secure/lib/libssh
760secure/lib/libssh__L: secure/lib/libcrypto__L lib/libz__L
761.endif
762.endif
763_generic_libs+=	secure/lib
764.endif
765
766_generic_libs+=	usr.bin/lex/lib
767
768.if ${MACHINE_ARCH} == "i386"
769_generic_libs+=	usr.sbin/pcvt/keycap
770.endif
771
772.for _lib in ${_startup_libs} ${_prebuild_libs:Nlib/libpam} ${_generic_libs}
773${_lib}__L: .PHONY
774.if exists(${.CURDIR}/${_lib})
775	${ECHODIR} "===> ${_lib}"; \
776		cd ${.CURDIR}/${_lib}; \
777		${MAKE} DIRPRFX=${_lib}/ depend; \
778		${MAKE} DIRPRFX=${_lib}/ all; \
779		${MAKE} DIRPRFX=${_lib}/ install
780.endif
781.endfor
782
783# libpam is special: we need to build static PAM modules before
784# static PAM library, and dynamic PAM library before dynamic PAM
785# modules.
786lib/libpam__L: .PHONY
787	${ECHODIR} "===> lib/libpam"; \
788		cd ${.CURDIR}/lib/libpam; \
789		${MAKE} DIRPRFX=lib/libpam/ depend; \
790		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET all; \
791		${MAKE} DIRPRFX=lib/libpam/ -D_NO_LIBPAM_SO_YET install
792
793_startup_libs: ${_startup_libs:S/$/__L/}
794_prebuild_libs: ${_prebuild_libs:S/$/__L/}
795_generic_libs: ${_generic_libs:S/$/__L/}
796
797.for __target in clean cleandepend cleandir depend includes obj
798.for entry in ${SUBDIR}
799${entry}.${__target}__D: .PHONY
800	@if test -d ${.CURDIR}/${entry}.${MACHINE_ARCH}; then \
801		${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE_ARCH}"; \
802		edir=${entry}.${MACHINE_ARCH}; \
803		cd ${.CURDIR}/$${edir}; \
804	else \
805		${ECHODIR} "===> ${DIRPRFX}${entry}"; \
806		edir=${entry}; \
807		cd ${.CURDIR}/$${edir}; \
808	fi; \
809	${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/
810.endfor
811par-${__target}: ${SUBDIR:S/$/.${__target}__D/}
812.endfor
813
814.include <bsd.subdir.mk>
815