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