From 11fb97daa75d7b8711d69a0736a3bdfc149f7f7e Mon Sep 17 00:00:00 2001 From: John Birrell Date: Mon, 31 Aug 1998 01:08:08 +0000 Subject: E-day build system changes. - Moved most of the guts of Makefile to Makefile.inc1 to become the backend for the build system. - The new Makefile doesn't suffer from problems including the wrong sys.mk because it doesn't use anything in there or bsd.own.mk. So, from now on, the proper build command is just `make world' (or buildworld). - The intermediate makefiles called Makefile.inc0 and Makefile.upgrade fiddle with the OBJFORMAT and MAKEOBJDIRPREFIX variables so that both aout and elf object trees can coexist. Makefile.upgrade contains the aout->elf transition build. - A cross build environment is now very close to reality. Specifying TOOLDIR, setting OBJFORMAT and MAKEOBJDIRPREFIX allow that. See the comments in Makefile for more info. --- Makefile | 930 ++++++----------------------------------------------- Makefile.inc0 | 109 +++++++ Makefile.inc1 | 961 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile.upgrade | 230 +++++++++++++ 4 files changed, 1393 insertions(+), 837 deletions(-) create mode 100644 Makefile.inc0 create mode 100644 Makefile.inc1 create mode 100644 Makefile.upgrade diff --git a/Makefile b/Makefile index b65fe8fcaa2d..4f6f61bd18f2 100644 --- a/Makefile +++ b/Makefile @@ -1,875 +1,131 @@ # -# $Id: Makefile,v 1.209 1998/08/04 17:13:38 bde Exp $ -# -# While porting to the another architecture include the bootstrap instead -# of the normal build. -# -.if exists(${.CURDIR}/Makefile.${MACHINE}) && defined(BOOTSTRAP_WORLD) -.include "${.CURDIR}/Makefile.${MACHINE}" -.else -# -# Make command line options: -# -DCLOBBER will remove /usr/include -# -DMAKE_KERBEROS4 to build KerberosIV -# -DNOCLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir -# -DNOCLEAN do not clean at all -# -DNOTOOLS do not rebuild any tools first -# -DNOCRYPT will prevent building of crypt versions -# -DNOLKM do not build loadable kernel modules -# -DNOOBJDIR do not run ``${MAKE} obj'' -# -DNOPROFILE do not build profiled libraries -# -DNOSECURE do not go into secure subdir -# -DNOGAMES do not go into games subdir -# -DNOSHARE do not go into share subdir -# -DNOINFO do not make or install info files -# -DNOLIBC_R do not build libc_r. -# LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list - +# $Id$ # -# The intended user-driven targets are: -# buildworld - rebuild *everything*, including glue to help do upgrades -# installworld- install everything built by "buildworld" -# world - buildworld + installworld -# update - convenient way to update your source tree (eg: sup/cvs) -# most - build user commands, no libraries or include files -# installmost - install user commands, no libraries or include files -# -# Standard targets (not defined here) are documented in the makefiles in -# /usr/share/mk. These include: -# obj depend all install clean cleandepend cleanobj - -.if (!make(world)) && (!make(buildworld)) && (!make(installworld)) -.MAKEFLAGS:= -m ${.CURDIR}/share/mk ${.MAKEFLAGS} -.endif - +# The user-driven targets are: # -# Pick up any macros that are defined in the src-relative bsd.own.mk -# but not in the "system" bsd.own.mk. The "system" version has -# unfortunately already been included by the "system" sys.mk, so this -# only works for new macros. First undefine old macros that cause -# problems. +# buildworld - Rebuild *everything*, including glue to help do +# upgrades. +# installworld - Install everything built by "buildworld". +# world - buildworld + installworld. +# update - Convenient way to update your source tree (cvs). +# most - Build user commands, no libraries or include files. +# installmost - Install user commands, no libraries or include files. +# aout-to-elf - Upgrade an system from a.out to elf format (see below). +# aout-to-elf-build - Build everything required to upgrade a system from +# a.out to elf format (see below). +# aout-to-elf-install - Install everything built by aout-to-elf-build (see +# below). # -.undef LIBDIR -.include "${.CURDIR}/share/mk/bsd.own.mk" - -# Put initial settings here. -SUBDIR= - -# We must do share/info early so that installation of info `dir' -# entries works correctly. Do it first since it is less likely to -# grow dependencies on include and lib than vice versa. -.if exists(share/info) -SUBDIR+= share/info -.endif - -# We must do include and lib early so that the perl *.ph generation -# works correctly as it uses the header files installed by this. -.if exists(include) -SUBDIR+= include -.endif -.if exists(lib) -SUBDIR+= lib -.endif - -.if exists(bin) -SUBDIR+= bin -.endif -.if exists(games) && !defined(NOGAMES) -SUBDIR+= games -.endif -.if exists(gnu) -SUBDIR+= gnu -.endif -.if exists(kerberosIV) && exists(crypto) && !defined(NOCRYPT) && \ - defined(MAKE_KERBEROS4) -SUBDIR+= kerberosIV -.endif -.if exists(libexec) -SUBDIR+= libexec -.endif -.if exists(sbin) -SUBDIR+= sbin -.endif -.if exists(share) && !defined(NOSHARE) -SUBDIR+= share -.endif -.if exists(sys) -SUBDIR+= sys -.endif -.if exists(usr.bin) -SUBDIR+= usr.bin -.endif -.if exists(usr.sbin) -SUBDIR+= usr.sbin -.endif -.if exists(secure) && !defined(NOCRYPT) && !defined(NOSECURE) -SUBDIR+= secure -.endif -.if exists(lkm) && !defined(NOLKM) -SUBDIR+= lkm -.endif - -# etc must be last for "distribute" to work -.if exists(etc) -SUBDIR+= etc -.endif - -# These are last, since it is nice to at least get the base system -# rebuilt before you do them. -.if defined(LOCAL_DIRS) -.for _DIR in ${LOCAL_DIRS} -.if exists(${_DIR}) & exists(${_DIR}/Makefile) -SUBDIR+= ${_DIR} -.endif -.endfor -.endif - -# Handle -DNOOBJDIR, -DNOCLEAN and -DNOCLEANDIR -.if defined(NOOBJDIR) -OBJDIR= -.else -OBJDIR= obj -.endif - -.if defined(NOCLEAN) -CLEANDIR= -.else -.if defined(NOCLEANDIR) -CLEANDIR= clean cleandepend -.else -CLEANDIR= cleandir -.endif -.endif - -.if !defined(NOCLEAN) -_NODEPEND= true -.endif -.if defined(_NODEPEND) -_DEPEND= cleandepend -.else -_DEPEND= depend -.endif - -SUP?= cvsup -SUPFLAGS?= -g -L 2 -P - - +# This makefile is simple by design. The FreeBSD make automatically reads +# the /usr/share/mk/sys.mk unless the -m argument is specified on the +# command line. By keeping this makefile simple, it doesn't matter too +# much how different the installed mk files are from those in the source +# tree. This makefile executes a child make process, forcing it to use +# the mk files from the source tree which are supposed to DTRT. # -# While building tools for bootstrapping, we don't need to waste time on -# shared or profiled libraries, shared linkage, or documentation, except -# when the tools won't get cleaned we must use the defaults for shared -# libraries and shared linkage (and this doesn't waste time). -# XXX actually, we do need to waste time building shared libraries. -# -.if defined(NOCLEAN) -MK_FLAGS= -DNOINFO -DNOMAN -DNOPROFILE -.else -MK_FLAGS= -DNOINFO -DNOMAN -DNOPIC -DNOPROFILE -DNOSHARED -.endif - +# The user-driven targets (as listed above) are implemented in Makefile.inc0 +# and the private targets are in Makefile.inc1. These are kept separate +# to help the bootstrap build from aout to elf format. # -# world -# -# Attempt to rebuild and reinstall *everything*, with reasonable chance of -# success, regardless of how old your existing system is. -# -# >> Beware, it overwrites the local build environment! << -# -world: - @echo "--------------------------------------------------------------" - @echo "make world started on `LC_TIME=C date`" - @echo "--------------------------------------------------------------" -.if target(pre-world) - @echo - @echo "--------------------------------------------------------------" - @echo " Making 'pre-world' target" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${MAKE} pre-world -.endif - cd ${.CURDIR}; ${MAKE} buildworld - cd ${.CURDIR}; ${MAKE} -B installworld -.if target(post-world) - @echo - @echo "--------------------------------------------------------------" - @echo " Making 'post-world' target" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${MAKE} post-world -.endif - @echo - @echo "--------------------------------------------------------------" - @echo "make world completed on `LC_TIME=C date`" - @echo "--------------------------------------------------------------" - -.if defined(MAKEOBJDIRPREFIX) -WORLDTMP= ${MAKEOBJDIRPREFIX}${.CURDIR}/tmp -.else -WORLDTMP= /usr/obj${.CURDIR}/tmp -.endif -STRICTTMPPATH= ${WORLDTMP}/sbin:${WORLDTMP}/usr/sbin:${WORLDTMP}/bin:${WORLDTMP}/usr/bin -TMPPATH= ${STRICTTMPPATH}:${PATH} - -# XXX COMPILER_PATH is needed for finding cc1, ld and as -# XXX GCC_EXEC_PREFIX is for *crt.o. It is probably unnecessary now -# that LIBRARY_PATH is set. We still can't use -nostdlib, since gcc -# wouldn't link *crt.o or libgcc if it were used. -# XXX LD_LIBRARY_PATH is for ld.so. It is also used by ld, although we don't -# want that - all compile-time library paths should be resolved by gcc. -# It fails for set[ug]id executables (are any used?). -COMPILER_ENV= BISON_SIMPLE=${WORLDTMP}/usr/share/misc/bison.simple \ - COMPILER_PATH=${WORLDTMP}/usr/libexec:${WORLDTMP}/usr/bin \ - GCC_EXEC_PREFIX=${WORLDTMP}${SHLIBDIR}:${WORLDTMP}/usr/lib/ \ - LD_LIBRARY_PATH=${WORLDTMP}${SHLIBDIR} \ - LIBRARY_PATH=${WORLDTMP}${SHLIBDIR}:${WORLDTMP}/usr/lib - -BMAKEENV= PATH=${TMPPATH} ${COMPILER_ENV} NOEXTRADEPEND=t \ - OBJFORMAT_PATH=${WORLDTMP}/usr/libexec:/usr/libexec -XMAKEENV= PATH=${STRICTTMPPATH} ${COMPILER_ENV} \ - OBJFORMAT_PATH=${WORLDTMP}/usr/libexec \ - CFLAGS="-nostdinc ${CFLAGS}" # XXX -nostdlib - -# used to compile and install 'make' in temporary build tree -MAKETMP= ${WORLDTMP}/make -IBMAKE= ${BMAKEENV} MAKEOBJDIR=${MAKETMP} ${MAKE} DESTDIR=${WORLDTMP} -# bootstrap make -BMAKE= ${BMAKEENV} ${WORLDTMP}/usr/bin/make DESTDIR=${WORLDTMP} -# cross make used for compilation -XMAKE= ${XMAKEENV} ${WORLDTMP}/usr/bin/make DESTDIR=${WORLDTMP} -# cross make used for final installation -IXMAKE= ${XMAKEENV} ${WORLDTMP}/usr/bin/make - +# For novices wanting to build from current sources, the simple instructions +# are: # -# buildworld -# -# Attempt to rebuild the entire system, with reasonable chance of -# success, regardless of how old your existing system is. -# -buildworld: -.if !defined(NOCLEAN) - @echo - @echo "--------------------------------------------------------------" - @echo " Cleaning up the temporary build tree" - @echo "--------------------------------------------------------------" - mkdir -p ${WORLDTMP} - chflags -R noschg ${WORLDTMP}/ - rm -rf ${WORLDTMP} -.endif -.if !defined(NOTOOLS) - @echo - @echo "--------------------------------------------------------------" - @echo " Making make" - @echo "--------------------------------------------------------------" - mkdir -p ${WORLDTMP}/usr/bin ${MAKETMP} - ( \ - cd ${.CURDIR}/usr.bin/make; \ - MAKEOBJDIRPREFIX=""; unset MAKEOBJDIRPREFIX; \ - ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} all; \ - ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} install; \ - ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} clean \ - ) - @echo - @echo "--------------------------------------------------------------" - @echo " Making mtree" - @echo "--------------------------------------------------------------" - mkdir -p ${WORLDTMP}/usr/sbin ${WORLDTMP}/mtree - ( \ - cd ${.CURDIR}/usr.sbin/mtree; \ - MAKEOBJDIRPREFIX=""; unset MAKEOBJDIRPREFIX; \ - export MAKEOBJDIR=${WORLDTMP}/mtree; \ - ${BMAKE} ${MK_FLAGS} all; \ - ${BMAKE} ${MK_FLAGS} -B install clean \ - ) -.endif - @echo - @echo "--------------------------------------------------------------" - @echo " Making hierarchy" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} hierarchy -.if !defined(NOCLEAN) - @echo - @echo "--------------------------------------------------------------" - @echo " Cleaning up the obj tree" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} ${CLEANDIR:S/^/par-/} -.endif -.if !defined(NOOBJDIR) - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding the obj tree" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} par-${OBJDIR} -.endif -.if !defined(NOTOOLS) - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding bootstrap tools" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} bootstrap - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding tools necessary to build the include files" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} include-tools -.endif - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding ${DESTDIR}/usr/include" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; SHARED=copies ${BMAKE} includes - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding bootstrap libraries" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} bootstrap-libraries -.if !defined(NOTOOLS) - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding tools needed to build libraries" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} lib-tools -.endif -.if !defined(NOTOOLS) - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding all other tools needed to build the world" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${BMAKE} build-tools -.endif -.if !defined(_NODEPEND) - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding dependencies" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${XMAKE} par-depend -.endif - @echo - @echo "--------------------------------------------------------------" - @echo " Building libraries" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${XMAKE} -DNOINFO -DNOMAN libraries - @echo - @echo "--------------------------------------------------------------" - @echo " Building everything.." - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${XMAKE} all - +# 1. Ensure that your /usr/obj directory has at least 165 Mb of free space. +# 2. `cd /usr/src' (or to the directory containing your source tree). +# 3. `make world' # -# installworld +# Be warned, this will update your installed system, except for configuration +# files in the /etc directory. You have to do those manually. # -# Installs everything compiled by a 'buildworld'. +# If at first you're a little nervous about having a `make world' update +# your system, a `make buildworld' will build everything in the /usr/obj +# tree without touching your installed system. To be of any further use +# though, a `make installworld' is required. # -installworld: - cd ${.CURDIR}; ${IXMAKE} reinstall - +# The `make world' process always follows the installed object format. +# This is set by creating /etc/objformat containing either OBJFORMAT=aout +# or OBJFORMAT=elf. If this file does not exist, the object format defaults +# to aout. This is expected to be changed to elf just prior to the release +# or 3.0. If OBJFORMAT is set as an environment variable or in /etc/make.conf, +# this overrides /etc/objformat. # -# reinstall -# -# If you have a build server, you can NFS mount the source and obj directories -# and do a 'make reinstall' on the *client* to install new binaries from the -# most recent server build. -# -reinstall: - @echo "--------------------------------------------------------------" - @echo " Making hierarchy" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${MAKE} hierarchy - @echo - @echo "--------------------------------------------------------------" - @echo " Installing everything.." - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; ${MAKE} install -.if ${MACHINE_ARCH} == "i386" - @echo - @echo "--------------------------------------------------------------" - @echo " Re-scanning the shared libraries.." - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; /sbin/ldconfig -R -.endif - @echo - @echo "--------------------------------------------------------------" - @echo " Rebuilding man page indexes" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}/share/man; ${MAKE} makedb - +# Unless -DNOAOUT is specified, a `make world' with OBJFORMAT=elf will +# update the legacy support for aout. This includes all libraries, ld.so, +# lkms and boot objects. This part of build should be regarded as +# deprecated and you should _not_ expect to be able to do this past the +# release of 3.1. You have exactly one major release to move entirely +# to elf. # -# update -# -# Update the source tree, by running sup and/or running cvs to update to the -# latest copy. -# -update: -.if defined(SUP_UPDATE) - @echo "--------------------------------------------------------------" - @echo "Running ${SUP}" - @echo "--------------------------------------------------------------" - @${SUP} ${SUPFLAGS} ${SUPFILE} -.if defined(SUPFILE1) - @${SUP} ${SUPFLAGS} ${SUPFILE1} -.endif -.if defined(SUPFILE2) - @${SUP} ${SUPFLAGS} ${SUPFILE2} -.endif -.endif -.if defined(CVS_UPDATE) - @echo "--------------------------------------------------------------" - @echo "Updating /usr/src from cvs repository" ${CVSROOT} - @echo "--------------------------------------------------------------" - cd ${.CURDIR}; cvs -q update -P -d -.endif - -# -# most -# -# Build most of the user binaries on the existing system libs and includes. -# -most: - @echo "--------------------------------------------------------------" - @echo " Building programs only" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}/bin; ${MAKE} all - cd ${.CURDIR}/sbin; ${MAKE} all - cd ${.CURDIR}/libexec; ${MAKE} all - cd ${.CURDIR}/usr.bin; ${MAKE} all - cd ${.CURDIR}/usr.sbin; ${MAKE} all - cd ${.CURDIR}/gnu/libexec; ${MAKE} all - cd ${.CURDIR}/gnu/usr.bin; ${MAKE} all - cd ${.CURDIR}/gnu/usr.sbin; ${MAKE} all -#.if defined(MAKE_KERBEROS4) && !defined(NOCRYPT) -# cd ${.CURDIR}/kerberosIV; ${MAKE} most -#.endif -#.if !defined(NOSECURE) && !defined(NOCRYPT) -# cd ${.CURDIR}/secure; ${MAKE} most -#.endif - +# ---------------------------------------------------------------------------- # -# installmost -# -# Install the binaries built by the 'most' target. This does not include -# libraries or include files. -# -installmost: - @echo "--------------------------------------------------------------" - @echo " Installing programs only" - @echo "--------------------------------------------------------------" - cd ${.CURDIR}/bin; ${MAKE} install - cd ${.CURDIR}/sbin; ${MAKE} install - cd ${.CURDIR}/libexec; ${MAKE} install - cd ${.CURDIR}/usr.bin; ${MAKE} install - cd ${.CURDIR}/usr.sbin; ${MAKE} install - cd ${.CURDIR}/gnu/libexec; ${MAKE} install - cd ${.CURDIR}/gnu/usr.bin; ${MAKE} install - cd ${.CURDIR}/gnu/usr.sbin; ${MAKE} install -#.if defined(MAKE_KERBEROS4) && !defined(NOCRYPT) -# cd ${.CURDIR}/kerberosIV; ${MAKE} installmost -#.endif -#.if !defined(NOSECURE) && !defined(NOCRYPT) -# cd ${.CURDIR}/secure; ${MAKE} installmost -#.endif - +# Upgrading an i386 system from a.out to elf format # -# ------------------------------------------------------------------------ # -# From here onwards are utility targets used by the 'make world' and -# related targets. If your 'world' breaks, you may like to try to fix -# the problem and manually run the following targets to attempt to -# complete the build. Beware, this is *not* guaranteed to work, you -# need to have a pretty good grip on the current state of the system -# to attempt to manually finish it. If in doubt, 'make world' again. +# The aout->elf transition build is performed by doing a `make aout-to-elf' +# or a `make aout-to-elf-build' followed by a `make aout-to-elf-install'. +# You need to have at least 320 Mb of free space for the object tree. # - +# The upgrade process checks the installed release. If this is 3.0-CURRENT, +# it is assumed that your kernel contains all the syscalls required by the +# current sources. # -# heirarchy - ensure that all the needed directories are present +# For installed systems where `uname -r' reports something other than +# 3.0-CURRENT, the upgrade process expects to build a kernel using the +# kernel configuration file sys/i386/conf/GENERICupgrade. This file is +# defaulted to the GENERIC kernel configuration file on the assumption that +# it will be suitable for most systems. Before performing the upgrade, +# replace sys/i386/conf/GENERICupgrade with your own version if your +# hardware requires a different configuration. # -hierarchy: - cd ${.CURDIR}/etc; ${MAKE} distrib-dirs - +# The upgrade procedure will stop and ask for confirmation to proceed +# several times. On each occasion, you can type Ctrl-C to abort the +# upgrade. # -# bootstrap - [re]build tools needed to run the actual build, this includes -# tools needed by 'make depend', as some tools are needed to generate source -# for the dependency information to be gathered from. -# -bootstrap: -.if defined(DESTDIR) - rm -f ${DESTDIR}/usr/src/sys - ln -s ${.CURDIR}/sys ${DESTDIR}/usr/src - cd ${.CURDIR}/include; find -dx . | cpio -dump ${DESTDIR}/usr/include -.for d in net netinet posix4 sys vm machine - if [ -h ${DESTDIR}/usr/include/$d ]; then \ - rm -f ${DESTDIR}/usr/include/$d ; \ - fi -.endfor - cd ${.CURDIR}/sys; \ - find -dx net netinet posix4 sys vm -name '*.h' -o -type d | \ - cpio -dump ${DESTDIR}/usr/include - mkdir -p ${DESTDIR}/usr/include/machine - cd ${.CURDIR}/sys/${MACHINE_ARCH}/include; find -dx . -name '*.h' -o -type d | \ - cpio -dump ${DESTDIR}/usr/include/machine -.endif - cd ${.CURDIR}/usr.bin/make; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} - cd ${.CURDIR}/usr.bin/xinstall; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} - cd ${.CURDIR}/usr.bin/yacc; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} - cd ${.CURDIR}/usr.bin/lex; ${MAKE} bootstrap; \ - ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} -DNOLIB all; \ - ${MAKE} ${MK_FLAGS} -DNOLIB -B install ${CLEANDIR} -.if !defined(NOOBJDIR) - cd ${.CURDIR}/usr.bin/lex; ${MAKE} ${OBJDIR} -.endif - cd ${.CURDIR}/usr.sbin/mtree; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} -.if defined(DESTDIR) - cd ${.CURDIR}/include && ${MAKE} copies -.endif - +# At the end of the upgrade procedure, /etc/objformat is created or +# updated to contain OBJFORMAT=elf. From then on, you're elf by default. # -# include-tools - generally the same as 'bootstrap', except that it's for -# things that are specifically needed to generate include files. +# ---------------------------------------------------------------------------- # -# XXX should be merged with bootstrap, it's not worth keeeping them separate. -# Well, maybe it is now. We force 'cleandepend' here to avoid dependencies -# on cleaned away headers in ${WORLDTMP}. # -include-tools: -.for d in usr.bin/compile_et usr.bin/rpcgen - cd ${.CURDIR}/$d; ${MAKE} cleandepend; \ - ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} -.endfor - +# Define the user-driven targets. These are listed here in alphabetical +# order, but that's not important. # -# includes - possibly generate and install the include files. -# -includes: -.if defined(CLOBBER) - rm -rf ${DESTDIR}/usr/include/* - mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ - -p ${DESTDIR}/usr/include -.endif - cd ${.CURDIR}/include; ${MAKE} -B all install - cd ${.CURDIR}/gnu/include; ${MAKE} install - cd ${.CURDIR}/gnu/lib/libmp; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libobjc; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libreadline; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libregex; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libstdc++; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libg++; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libdialog; ${MAKE} beforeinstall - cd ${.CURDIR}/gnu/lib/libgmp; ${MAKE} beforeinstall -.if exists(secure) && !defined(NOCRYPT) - cd ${.CURDIR}/secure/lib/libdes; ${MAKE} beforeinstall -.endif -.if exists(kerberosIV) && !defined(NOCRYPT) && defined(MAKE_KERBEROS4) - cd ${.CURDIR}/kerberosIV/lib/libacl; ${MAKE} beforeinstall - cd ${.CURDIR}/kerberosIV/lib/libkadm; ${MAKE} beforeinstall - cd ${.CURDIR}/kerberosIV/lib/libkafs; ${MAKE} beforeinstall - cd ${.CURDIR}/kerberosIV/lib/libkdb; ${MAKE} beforeinstall - cd ${.CURDIR}/kerberosIV/lib/libkrb; ${MAKE} beforeinstall - cd ${.CURDIR}/kerberosIV/lib/libtelnet; ${MAKE} beforeinstall -.else - cd ${.CURDIR}/lib/libtelnet; ${MAKE} beforeinstall -.endif -.if exists(${.CURDIR}/lib/csu/${MACHINE}) - cd ${.CURDIR}/lib/csu/${MACHINE}; ${MAKE} beforeinstall -.endif - cd ${.CURDIR}/lib/libalias; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libc; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libcalendar; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libcurses; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libdisk; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libedit; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libftpio; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libmd; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libmytinfo; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libncurses; ${MAKE} beforeinstall -.if !defined(WANT_CSRG_LIBM) - cd ${.CURDIR}/lib/msun; ${MAKE} beforeinstall -.endif - cd ${.CURDIR}/lib/libopie; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libpcap; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/librpcsvc; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libskey; ${MAKE} beforeinstall -.if !defined(NOTCL) && exists (${.CURDIR}/contrib/tcl) && \ - exists(${.CURDIR}/usr.bin/tclsh) && exists (${.CURDIR}/lib/libtcl) - cd ${.CURDIR}/lib/libtcl; ${MAKE} installhdrs -.endif - cd ${.CURDIR}/lib/libtermcap; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libcom_err; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libss; ${MAKE} -B hdrs beforeinstall - cd ${.CURDIR}/lib/libscsi; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libutil; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libvgl; ${MAKE} beforeinstall - cd ${.CURDIR}/lib/libz; ${MAKE} beforeinstall - cd ${.CURDIR}/usr.bin/f2c; ${MAKE} beforeinstall - cd ${.CURDIR}/usr.bin/lex; ${MAKE} beforeinstall +TGTS = all buildworld depend everything includes installmost install \ + installworld most obj update world # -# Declare tools if they are not required on all architectures. -# -.if ${MACHINE_ARCH} == "i386" -# aout tools: -_aout_ar = usr.bin/ar -_aout_as = gnu/usr.bin/as -_aout_ld = gnu/usr.bin/ld -_aout_nm = usr.bin/nm -_aout_ranlib = usr.bin/ranlib -_aout_size = usr.bin/size -_aout_strip = usr.bin/strip -.endif - +# Handle the user-driven targets, using the source relative mk files. # -# lib-tools - build tools to compile and install the libraries. -# -# XXX gperf is required for cc -# XXX a new ld and tsort is required for cc -lib-tools: -.for d in \ - gnu/usr.bin/gperf \ - ${_aout_ld} \ - usr.bin/tsort \ - ${_aout_as} \ - gnu/usr.bin/bison \ - gnu/usr.bin/cc \ - ${_aout_ar} \ - usr.bin/env \ - usr.bin/lex/lib \ - usr.bin/mk_cmds \ - ${_aout_nm} \ - ${_aout_ranlib} \ - ${_aout_strip} \ - gnu/usr.bin/binutils \ - usr.bin/uudecode \ - usr.bin/objformat - cd ${.CURDIR}/$d; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install; \ - ${MAKE} ${MK_FLAGS:S/-DNOPIC//} -B ${CLEANDIR} ${OBJDIR} -.endfor +${TGTS} : upgrade_checks + @cd ${.CURDIR}; \ + make -f Makefile.inc0 -m ${.CURDIR}/share/mk ${.TARGET} # -# We have to know too much about ordering and subdirs in the lib trees: +# Perform a few tests to determine if the installed tools are adequate +# for building the world. These are for older systems (prior to 2.2.5). # -# To satisfy shared library linkage when only the libraries being built -# are visible: +# From 2.2.5 onwards, the installed tools will pass these upgrade tests, +# so the normal make world is capable of doing what is required to update +# the system to current. # -# libcom_err must be built before libss. -# libcrypt and libmd must be built before libskey. -# libm must be built before libtcl. -# libmytinfo must be built before libdialog and libncurses. -# libncurses must be built before libdialog. -# libtermcap must be built before libcurses, libedit and libreadline. +upgrade_checks : + @cd ${.CURDIR}; if `make -m ${.CURDIR}/share/mk test > /dev/null 2>&1`; then ok=1; else make -f Makefile.upgrade make; fi; + # -# Some libraries are built conditionally and/or are in inconsistently -# named directories: +# A simple test target used as part of the test to see if make supports +# the -m argument. # -.if exists(lib/csu/${MACHINE}.pcc) -_csu=lib/csu/${MACHINE}.pcc -.else -_csu=lib/csu/${MACHINE} -.endif - -.if !defined(NOSECURE) && !defined(NOCRYPT) -_libcrypt= secure/lib/libcrypt lib/libcrypt -.else -_libcrypt= lib/libcrypt -.endif - -.if defined(WANT_CSRG_LIBM) -_libm= lib/libm -.else -_libm= lib/msun -.endif +test : # -# bootstrap-libraries - build just enough libraries for the bootstrap -# tools, and install them under ${WORLDTMP}. -# -# Build csu and libgcc early so that some tools get linked to the new -# versions (too late for the main tools, however). Then build the -# necessary prerequisite libraries (libtermcap just needs to be before -# libcurses, and this only matters for the NOCLEAN case when NOPIC is -# not set). -# -# This is mostly wrong. The build tools must run on the host system, -# so they should use host libraries. We depend on the target being -# similar enough to the host for new target libraries to work on the -# host. -# -bootstrap-libraries: -.for _lib in ${_csu} gnu/usr.bin/cc/libgcc lib/libtermcap \ - gnu/lib/libregex gnu/lib/libreadline lib/libc \ - ${_libcrypt} lib/libcurses lib/libedit ${_libm} \ - lib/libmd lib/libutil lib/libz usr.bin/lex/lib -.if exists(${.CURDIR}/${_lib}) - cd ${.CURDIR}/${_lib}; \ - ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ - ${MAKE} ${MK_FLAGS} all; \ - ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} -.endif -.endfor - +# Define the upgrade targets. These are listed here in alphabetical +# order, but that's not important. # -# libraries - build all libraries, and install them under ${DESTDIR}. -# -# The ordering is not as special as for bootstrap-libraries. Build -# the prerequisites first, then build almost everything else in -# alphabetical order. -# -libraries: -.for _lib in lib/libcom_err ${_libcrypt} ${_libm} lib/libmytinfo \ - lib/libncurses lib/libtermcap \ - gnu/lib gnu/usr.bin/cc/libgcc lib usr.bin/lex/lib usr.sbin/pcvt/keycap -.if exists(${.CURDIR}/${_lib}) - cd ${.CURDIR}/${_lib}; ${MAKE} all; ${MAKE} -B install -.endif -.endfor -.if exists(${.CURDIR}/secure/lib) && !defined(NOCRYPT) && !defined(NOSECURE) - cd ${.CURDIR}/secure/lib; ${MAKE} all; ${MAKE} -B install -.endif -.if exists(${.CURDIR}/kerberosIV/lib) && !defined(NOCRYPT) && \ - defined(MAKE_KERBEROS4) - cd ${.CURDIR}/kerberosIV/lib; ${MAKE} all; ${MAKE} -B install -.endif +UPGRADE = aout-to-elf aout-to-elf-build aout-to-elf-install # -# Exclude unused tools from build-tools. -# -.if !defined(NOGAMES) && exists(${.CURDIR}/games) -_adventure= games/adventure -_caesar= games/caesar -_hack= games/hack -_phantasia= games/phantasia -_strfile= games/fortune/strfile -.endif -.if !defined(NOPERL) -_perl= gnu/usr.bin/perl/perl -.endif -.if !defined(NOSHARE) && exists(${.CURDIR}/share) -_scrnmaps= share/syscons/scrnmaps -.endif -.if !defined(NOLKM) && exists(${.CURDIR}/lkm) -_linux= lkm/linux -.endif - -BTMAKEFLAGS= ${MK_FLAGS} -D_BUILD_TOOLS - +# Handle the upgrade targets, using the source relative mk files. # -# build-tools - build and install any other tools needed to complete the -# compile and install. -# ifdef stale -# bc and cpp are required to build groff. Otherwise, the order here is -# mostly historical, i.e., bogus. -# chmod is used to build gcc's tmpmultilib[2] at obscure times. -# endif stale -# XXX uname is a bug - the target should not depend on the host. -# -build-tools: -.for d in \ - bin/cat \ - bin/chmod \ - bin/cp \ - bin/date \ - bin/dd \ - bin/echo \ - bin/expr \ - bin/hostname \ - bin/ln \ - bin/ls \ - bin/mkdir \ - bin/mv \ - bin/rm \ - bin/test \ - ${_caesar} \ - ${_strfile} \ - gnu/usr.bin/awk \ - gnu/usr.bin/bc \ - gnu/usr.bin/grep \ - gnu/usr.bin/groff \ - gnu/usr.bin/gzip \ - gnu/usr.bin/man/makewhatis \ - gnu/usr.bin/patch \ - ${_perl} \ - gnu/usr.bin/sort \ - gnu/usr.bin/texinfo \ - usr.bin/basename \ - usr.bin/cap_mkdb \ - usr.bin/chflags \ - usr.bin/cmp \ - usr.bin/col \ - usr.bin/colldef \ - usr.bin/cpp \ - usr.bin/expand \ - usr.bin/file2c \ - usr.bin/find \ - usr.bin/gencat \ - usr.bin/id \ - usr.bin/join \ - usr.bin/lorder \ - usr.bin/m4 \ - usr.bin/mkdep \ - usr.bin/mklocale \ - usr.bin/paste \ - usr.bin/sed \ - ${_aout_size} \ - usr.bin/soelim \ - usr.bin/symorder \ - usr.bin/touch \ - usr.bin/tr \ - usr.bin/true \ - usr.bin/uname \ - usr.bin/uuencode \ - usr.bin/vgrind \ - usr.bin/vi \ - usr.bin/wc \ - usr.bin/xargs \ - usr.bin/yacc \ - usr.sbin/chown \ - usr.sbin/mtree \ - usr.sbin/zic \ - bin/sh - cd ${.CURDIR}/$d; ${MAKE} ${BTMAKEFLAGS} ${_DEPEND}; \ - ${MAKE} ${BTMAKEFLAGS} all; \ - ${MAKE} ${BTMAKEFLAGS} -B install ${CLEANDIR} ${OBJDIR} -.endfor -.if !defined(NOGAMES) && exists(${.CURDIR}/games) - cd ${DESTDIR}/usr/games; cp -p caesar strfile ${DESTDIR}/usr/bin -.endif -.for d in \ - bin/sh \ - ${_adventure} \ - ${_hack} \ - ${_phantasia} \ - gnu/usr.bin/cc/cc_tools \ - lib/libmytinfo \ - ${_linux} \ - ${_scrnmaps} \ - sys/i386/boot/netboot - cd ${.CURDIR}/$d; ${MAKE} ${BTMAKEFLAGS} build-tools -.endfor - cd ${.CURDIR}/usr.bin/tn3270/tools; ${MAKE} ${BTMAKEFLAGS} all - -.for __target in clean cleandepend cleandir depend obj -.for entry in ${SUBDIR} -${entry}.${__target}__D: .PHONY - @if test -d ${.CURDIR}/${entry}.${MACHINE}; then \ - ${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE}"; \ - edir=${entry}.${MACHINE}; \ - cd ${.CURDIR}/$${edir}; \ - else \ - ${ECHODIR} "===> ${DIRPRFX}${entry}"; \ - edir=${entry}; \ - cd ${.CURDIR}/$${edir}; \ - fi; \ - ${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/ -.endfor -par-${__target}: ${SUBDIR:S/$/.${__target}__D/} -.endfor - -.endif - -.include +${UPGRADE} : upgrade_checks + @cd ${.CURDIR}; \ + make -f Makefile.upgrade -m ${.CURDIR}/share/mk ${.TARGET} diff --git a/Makefile.inc0 b/Makefile.inc0 new file mode 100644 index 000000000000..2be6fdf85582 --- /dev/null +++ b/Makefile.inc0 @@ -0,0 +1,109 @@ +# +# $Id$ +# +# This makefile ensures that the object directory is set according to the +# object format to avoid mixing aout and elf formatted files during the +# transition period. +# +# >> Beware, this makefile overwrites the local build environment! << +# + +# +# Build things relative to the user's preferred object directory, +# defaulting to /usr/obj if not defined. +# +MAKEOBJDIRPREFIX?=/usr/obj + +# +# Variables passed to make work better if they are set as environment +# variables instead of command line options. +# +MK_ENV= MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/${OBJFORMAT} + +# +# We should always use the current set of mk files, not the installed ones. +# This makefile is a wrapper for the backend makefile (Makefile.inc1). +# +MAKE= make -m ${.CURDIR}/share/mk -f Makefile.inc1 + +# +# These are the backend targets. +# +BKTGTS= all depend everything includes install installmost most obj update + + +# +# A generic rule for the backend targets. +# +${BKTGTS} : + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} ${.TARGET} + +# +# Temporary path and environment for the legacy build. +# +ELFTMPPATH= ${MAKEOBJDIRPREFIX}/elf${.CURDIR}/tmp/sbin:${MAKEOBJDIRPREFIX}/elf${.CURDIR}/tmp/bin:${MAKEOBJDIRPREFIX}/elf${.CURDIR}/tmp/usr/sbin:${MAKEOBJDIRPREFIX}/elf${.CURDIR}/tmp/usr/bin:${MAKEOBJDIRPREFIX}/elf${.CURDIR}/tmp/usr/games +LEGACY_ENV= MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/aout \ + PATH=${ELFTMPPATH} OBJFORMAT=aout NOTOOLS=1 \ + TOOLROOT=${MAKEOBJDIRPREFIX}/elf${.CURDIR}/tmp + +# +# world +# +# Attempt to rebuild and reinstall *everything*, with reasonable chance of +# success, regardless of how old your existing system is. If building on +# an i386/elf system, build the aout legacy cruft too. +# +world: + @echo "--------------------------------------------------------------" + @echo " ${OBJFORMAT} make world started on `LC_TIME=C date`" + @echo "--------------------------------------------------------------" +.if target(pre-world) + @echo + @echo "--------------------------------------------------------------" + @echo " Making 'pre-world' target" + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} pre-world +.endif + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} buildworld +.if ${MACHINE_ARCH} == "i386" && ${OBJFORMAT} == "elf" && !defined(NOAOUT) + @cd ${.CURDIR}; ${LEGACY_ENV} ${MAKE} legacy-build +.endif + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} -B installworld +.if ${MACHINE_ARCH} == "i386" && ${OBJFORMAT} == "elf" && !defined(NOAOUT) + @cd ${.CURDIR}; ${LEGACY_ENV} ${MAKE} legacy-install +.endif +.if target(post-world) + @echo + @echo "--------------------------------------------------------------" + @echo " Making 'post-world' target" + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} post-world +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " ${OBJFORMAT} make world completed on `LC_TIME=C date`" + @echo "--------------------------------------------------------------" + +# +# buildworld +# +# Build the world in the current object format, plus the legacy aout +# support if the current object format is elf on i386. +# +buildworld : + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} buildworld +.if ${MACHINE_ARCH} == "i386" && ${OBJFORMAT} == "elf" && !defined(NOAOUT) + @cd ${.CURDIR}; ${LEGACY_ENV} ${MAKE} legacy-build +.endif + +# +# installworld +# +# Install the world in the current object format, plus the legacy aout +# support if the current object format is elf on i386. +# +installworld : + @cd ${.CURDIR}; ${MK_ENV} ${MAKE} installworld +.if ${MACHINE_ARCH} == "i386" && ${OBJFORMAT} == "elf" && !defined(NOAOUT) + @cd ${.CURDIR}; ${LEGACY_ENV} ${MAKE} -DNOMAN -DNOINFO legacy-install +.endif diff --git a/Makefile.inc1 b/Makefile.inc1 new file mode 100644 index 000000000000..2d04a8655805 --- /dev/null +++ b/Makefile.inc1 @@ -0,0 +1,961 @@ +# +# $Id: Makefile,v 1.209 1998/08/04 17:13:38 bde Exp $ +# +# Make command line options: +# -DCLOBBER will remove /usr/include +# -DMAKE_KERBEROS4 to build KerberosIV +# -DNOCLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir +# -DNOCLEAN do not clean at all +# -DNOTOOLS do not rebuild any tools first +# -DNOCRYPT will prevent building of crypt versions +# -DNOLKM do not build loadable kernel modules +# -DNOPROFILE do not build profiled libraries +# -DNOSECURE do not go into secure subdir +# -DNOGAMES do not go into games subdir +# -DNOSHARE do not go into share subdir +# -DNOINFO do not make or install info files +# -DNOLIBC_R do not build libc_r. +# LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list + +# +# The intended user-driven targets are: +# buildworld - rebuild *everything*, including glue to help do upgrades +# installworld- install everything built by "buildworld" +# update - convenient way to update your source tree (eg: sup/cvs) +# most - build user commands, no libraries or include files +# installmost - install user commands, no libraries or include files +# +# Standard targets (not defined here) are documented in the makefiles in +# /usr/share/mk. These include: +# obj depend all install clean cleandepend cleanobj + +# Put initial settings here. +SUBDIR= + +# We must do share/info early so that installation of info `dir' +# entries works correctly. Do it first since it is less likely to +# grow dependencies on include and lib than vice versa. +.if exists(share/info) +SUBDIR+= share/info +.endif + +# We must do include and lib early so that the perl *.ph generation +# works correctly as it uses the header files installed by this. +.if exists(include) +SUBDIR+= include +.endif +.if exists(lib) +SUBDIR+= lib +.endif + +.if exists(bin) +SUBDIR+= bin +.endif +.if exists(games) && !defined(NOGAMES) +SUBDIR+= games +.endif +.if exists(gnu) +SUBDIR+= gnu +.endif +.if exists(kerberosIV) && exists(crypto) && !defined(NOCRYPT) && \ + defined(MAKE_KERBEROS4) +SUBDIR+= kerberosIV +.endif +.if exists(libexec) +SUBDIR+= libexec +.endif +.if exists(sbin) +SUBDIR+= sbin +.endif +.if exists(share) && !defined(NOSHARE) +SUBDIR+= share +.endif +.if exists(sys) +SUBDIR+= sys +.endif +.if exists(usr.bin) +SUBDIR+= usr.bin +.endif +.if exists(usr.sbin) +SUBDIR+= usr.sbin +.endif +.if exists(secure) && !defined(NOCRYPT) && !defined(NOSECURE) +SUBDIR+= secure +.endif +.if exists(lkm) && !defined(NOLKM) && ${OBJFORMAT} == "aout" +SUBDIR+= lkm +.endif + +# etc must be last for "distribute" to work +.if exists(etc) +SUBDIR+= etc +.endif + +# These are last, since it is nice to at least get the base system +# rebuilt before you do them. +.if defined(LOCAL_DIRS) +.for _DIR in ${LOCAL_DIRS} +.if exists(${_DIR}) & exists(${_DIR}/Makefile) +SUBDIR+= ${_DIR} +.endif +.endfor +.endif + +OBJDIR= obj + +.if defined(NOCLEAN) +CLEANDIR= +.else +.if defined(NOCLEANDIR) +CLEANDIR= clean cleandepend +.else +CLEANDIR= cleandir +.endif +.endif + +.if !defined(NOCLEAN) +_NODEPEND= true +.endif +.if defined(_NODEPEND) +_DEPEND= cleandepend +.else +_DEPEND= depend +.endif + +SUP?= cvsup +SUPFLAGS?= -g -L 2 -P - + +# +# While building tools for bootstrapping, we don't need to waste time on +# shared or profiled libraries, shared linkage, or documentation, except +# when the tools won't get cleaned we must use the defaults for shared +# libraries and shared linkage (and this doesn't waste time). +# XXX actually, we do need to waste time building shared libraries. +# +.if defined(NOCLEAN) +MK_FLAGS= -DNOINFO -DNOMAN -DNOPROFILE +.else +MK_FLAGS= -DNOINFO -DNOMAN -DNOPIC -DNOPROFILE -DNOSHARED +.endif + +# +# Define the location of the temporary installation directory. Note that +# MAKEOBJDIRPREFIX normally isn't defined so if the current directory is +# /usr/src, then the world temporary directory is /usr/obj/usr/src/tmp. +# +# During the transition from aout to elf format on i386, MAKEOBJDIRPREFIX +# is set by the parent makefile (Makefile.inc0) to be /usr/obj/${OBJFORMAT} +# in order to keep aout and elf format files apart. +# +.if defined(MAKEOBJDIRPREFIX) +WORLDTMP= ${MAKEOBJDIRPREFIX}${.CURDIR}/tmp +.else +WORLDTMP= /usr/obj${.CURDIR}/tmp +.endif + +# +# Define the PATH to the build tools. +# +# If not building tools, the PATH always points to the installed binaries. +# The NOTOOLS option assumes that in installed tools are good enough and that +# the user's PATH will locate to appropriate tools. This option is required +# for a cross-compiled build environment. +# +# If building tools, then the PATH includes the world temporary directories +# so that the bootstrapped tools are used as soon as they are built. The +# strict path is for use after all tools are supposed to have been +# bootstrapped. It doesn't allow any of the installed tools to be used. +# +.if defined(NOTOOLS) +# Default root of the tool tree +TOOLROOT?= +# Choose the PATH relative to the root of the tool tree +PATH= ${TOOLROOT}/sbin:${TOOLROOT}/bin:${TOOLROOT}/usr/sbin:${TOOLROOT}/usr/bin:${TOOLROOT}/usr/games +.else +TOOLROOT= ${WORLDTMP} +.endif +STRICTTMPPATH= ${TOOLROOT}/sbin:${TOOLROOT}/usr/sbin:${TOOLROOT}/bin:${TOOLROOT}/usr/bin +TMPPATH= ${STRICTTMPPATH}:${PATH} + +# XXX COMPILER_PATH is needed for finding cc1, ld and as +# XXX GCC_EXEC_PREFIX is for *crt.o. It is probably unnecessary now +# that LIBRARY_PATH is set. We still can't use -nostdlib, since gcc +# wouldn't link *crt.o or libgcc if it were used. +# XXX LD_LIBRARY_PATH is for ld.so. It is also used by ld, although we don't +# want that - all compile-time library paths should be resolved by gcc. +# It fails for set[ug]id executables (are any used?). +COMPILER_ENV= BISON_SIMPLE=${TOOLROOT}/usr/share/misc/bison.simple \ + COMPILER_PATH=${TOOLROOT}/usr/libexec:${TOOLROOT}/usr/bin \ + GCC_EXEC_PREFIX=${WORLDTMP}${SHLIBDIR}:${WORLDTMP}/usr/lib/ \ + LD_LIBRARY_PATH=${TOOLROOT}${SHLIBDIR} \ + LIBRARY_PATH=${WORLDTMP}${SHLIBDIR}:${WORLDTMP}/usr/lib + +BMAKEENV= PATH=${TMPPATH} ${COMPILER_ENV} NOEXTRADEPEND=t \ + OBJFORMAT_PATH=${TOOLROOT}/usr/libexec:/usr/libexec +XMAKEENV= PATH=${STRICTTMPPATH} ${COMPILER_ENV} \ + OBJFORMAT_PATH=${TOOLROOT}/usr/libexec \ + CFLAGS="-nostdinc ${CFLAGS}" # XXX -nostdlib + +# used to compile and install 'make' in temporary build tree +MAKETMP= ${WORLDTMP}/make +IBMAKE= ${BMAKEENV} MAKEOBJDIR=${MAKETMP} ${MAKE} DESTDIR=${WORLDTMP} + +.if defined(NOTOOLS) +# bootstrap make +BMAKE= ${BMAKEENV} ${MAKE} DESTDIR=${WORLDTMP} +# cross make used for compilation +XMAKE= ${XMAKEENV} ${MAKE} DESTDIR=${WORLDTMP} +# cross make used for final installation +IXMAKE= ${XMAKEENV} ${MAKE} +.else +# bootstrap make +BMAKE= ${BMAKEENV} ${WORLDTMP}/usr/bin/make DESTDIR=${WORLDTMP} +# cross make used for compilation +XMAKE= ${XMAKEENV} ${WORLDTMP}/usr/bin/make DESTDIR=${WORLDTMP} +# cross make used for final installation +IXMAKE= ${XMAKEENV} ${WORLDTMP}/usr/bin/make +.endif + +# +# buildworld +# +# Attempt to rebuild the entire system, with reasonable chance of +# success, regardless of how old your existing system is. +# +buildworld: +.if !defined(NOCLEAN) + @echo + @echo "--------------------------------------------------------------" + @echo " Cleaning up the temporary ${OBJFORMAT} build tree" + @echo "--------------------------------------------------------------" + mkdir -p ${WORLDTMP} + chflags -R noschg ${WORLDTMP}/ + rm -rf ${WORLDTMP} +.endif +.if !defined(NOTOOLS) + @echo + @echo "--------------------------------------------------------------" + @echo " Making make" + @echo "--------------------------------------------------------------" + mkdir -p ${WORLDTMP}/usr/bin ${MAKETMP} + ( \ + cd ${.CURDIR}/usr.bin/make; \ + MAKEOBJDIRPREFIX=""; unset MAKEOBJDIRPREFIX; \ + ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} all; \ + ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} install; \ + ${IBMAKE} -I${.CURDIR}/share/mk ${MK_FLAGS} clean \ + ) + @echo + @echo "--------------------------------------------------------------" + @echo " Making mtree" + @echo "--------------------------------------------------------------" + mkdir -p ${WORLDTMP}/usr/sbin ${WORLDTMP}/mtree + ( \ + cd ${.CURDIR}/usr.sbin/mtree; \ + MAKEOBJDIRPREFIX=""; unset MAKEOBJDIRPREFIX; \ + export MAKEOBJDIR=${WORLDTMP}/mtree; \ + ${BMAKE} ${MK_FLAGS} all; \ + ${BMAKE} ${MK_FLAGS} -B install clean \ + ) +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " Making hierarchy" + @echo "--------------------------------------------------------------" + mkdir -p ${WORLDTMP} + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 hierarchy +.if !defined(NOCLEAN) + @echo + @echo "--------------------------------------------------------------" + @echo " Cleaning up the ${OBJFORMAT} obj tree" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 ${CLEANDIR:S/^/par-/} +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding the ${OBJFORMAT} obj tree" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 par-${OBJDIR} +.if !defined(NOTOOLS) + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding ${OBJFORMAT} bootstrap tools" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 bootstrap + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding tools necessary to build the include files" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 include-tools +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding ${DESTDIR}/usr/include" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; SHARED=copies ${BMAKE} -f Makefile.inc1 includes + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding bootstrap libraries" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 bootstrap-libraries +.if !defined(NOTOOLS) + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding tools needed to build libraries" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 lib-tools +.endif +.if !defined(NOTOOLS) + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding all other tools needed to build the ${OBJFORMAT} world" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${BMAKE} -f Makefile.inc1 build-tools +.endif +.if !defined(_NODEPEND) + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding dependencies" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${XMAKE} -f Makefile.inc1 par-depend +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " Building ${OBJFORMAT} libraries" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${XMAKE} -DNOINFO -DNOMAN -f Makefile.inc1 libraries + @echo + @echo "--------------------------------------------------------------" + @echo " Building everything.." + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${XMAKE} -f Makefile.inc1 all + +everything: + @echo "--------------------------------------------------------------" + @echo " Building everything.." + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${XMAKE} -f Makefile.inc1 all + +# +# installworld +# +# Installs everything compiled by a 'buildworld'. +# +installworld: + cd ${.CURDIR}; ${IXMAKE} -f Makefile.inc1 reinstall + +# +# reinstall +# +# If you have a build server, you can NFS mount the source and obj directories +# and do a 'make reinstall' on the *client* to install new binaries from the +# most recent server build. +# +reinstall: + @echo "--------------------------------------------------------------" + @echo " Making hierarchy" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 hierarchy + @echo + @echo "--------------------------------------------------------------" + @echo " Installing everything.." + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install +.if ${MACHINE_ARCH} == "i386" + @echo + @echo "--------------------------------------------------------------" + @echo " Re-scanning the shared libraries.." + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; /sbin/ldconfig -R +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding man page indexes" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/share/man; ${MAKE} makedb + +# +# update +# +# Update the source tree, by running sup and/or running cvs to update to the +# latest copy. +# +update: +.if defined(SUP_UPDATE) + @echo "--------------------------------------------------------------" + @echo "Running ${SUP}" + @echo "--------------------------------------------------------------" + @${SUP} ${SUPFLAGS} ${SUPFILE} +.if defined(SUPFILE1) + @${SUP} ${SUPFLAGS} ${SUPFILE1} +.endif +.if defined(SUPFILE2) + @${SUP} ${SUPFLAGS} ${SUPFILE2} +.endif +.endif +.if defined(CVS_UPDATE) + @echo "--------------------------------------------------------------" + @echo "Updating /usr/src from cvs repository" ${CVSROOT} + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; cvs -q update -P -d +.endif + +# +# most +# +# Build most of the user binaries on the existing system libs and includes. +# +most: + @echo "--------------------------------------------------------------" + @echo " Building programs only" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/bin; ${MAKE} all + cd ${.CURDIR}/sbin; ${MAKE} all + cd ${.CURDIR}/libexec; ${MAKE} all + cd ${.CURDIR}/usr.bin; ${MAKE} all + cd ${.CURDIR}/usr.sbin; ${MAKE} all + cd ${.CURDIR}/gnu/libexec; ${MAKE} all + cd ${.CURDIR}/gnu/usr.bin; ${MAKE} all + cd ${.CURDIR}/gnu/usr.sbin; ${MAKE} all +#.if defined(MAKE_KERBEROS4) && !defined(NOCRYPT) +# cd ${.CURDIR}/kerberosIV; ${MAKE} most +#.endif +#.if !defined(NOSECURE) && !defined(NOCRYPT) +# cd ${.CURDIR}/secure; ${MAKE} most +#.endif + +# +# installmost +# +# Install the binaries built by the 'most' target. This does not include +# libraries or include files. +# +installmost: + @echo "--------------------------------------------------------------" + @echo " Installing programs only" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/bin; ${MAKE} install + cd ${.CURDIR}/sbin; ${MAKE} install + cd ${.CURDIR}/libexec; ${MAKE} install + cd ${.CURDIR}/usr.bin; ${MAKE} install + cd ${.CURDIR}/usr.sbin; ${MAKE} install + cd ${.CURDIR}/gnu/libexec; ${MAKE} install + cd ${.CURDIR}/gnu/usr.bin; ${MAKE} install + cd ${.CURDIR}/gnu/usr.sbin; ${MAKE} install +#.if defined(MAKE_KERBEROS4) && !defined(NOCRYPT) +# cd ${.CURDIR}/kerberosIV; ${MAKE} installmost +#.endif +#.if !defined(NOSECURE) && !defined(NOCRYPT) +# cd ${.CURDIR}/secure; ${MAKE} installmost +#.endif + +# +# ------------------------------------------------------------------------ +# +# From here onwards are utility targets used by the 'make world' and +# related targets. If your 'world' breaks, you may like to try to fix +# the problem and manually run the following targets to attempt to +# complete the build. Beware, this is *not* guaranteed to work, you +# need to have a pretty good grip on the current state of the system +# to attempt to manually finish it. If in doubt, 'make world' again. +# + +# +# hierarchy - ensure that all the needed directories are present +# +hierarchy: + cd ${.CURDIR}/etc; ${MAKE} distrib-dirs + +# +# bootstrap - [re]build tools needed to run the actual build, this includes +# tools needed by 'make depend', as some tools are needed to generate source +# for the dependency information to be gathered from. +# +bootstrap: +.if defined(DESTDIR) + rm -f ${DESTDIR}/usr/src/sys + ln -s ${.CURDIR}/sys ${DESTDIR}/usr/src + cd ${.CURDIR}/include; find -dx . | cpio -dump ${DESTDIR}/usr/include +.for d in net netinet posix4 sys vm machine + if [ -h ${DESTDIR}/usr/include/$d ]; then \ + rm -f ${DESTDIR}/usr/include/$d ; \ + fi +.endfor + cd ${.CURDIR}/sys; \ + find -dx net netinet posix4 sys vm -name '*.h' -o -type d | \ + cpio -dump ${DESTDIR}/usr/include + mkdir -p ${DESTDIR}/usr/include/machine + cd ${.CURDIR}/sys/${MACHINE_ARCH}/include; find -dx . -name '*.h' -o -type d | \ + cpio -dump ${DESTDIR}/usr/include/machine +.endif + cd ${.CURDIR}/usr.bin/make; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/xinstall; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/yacc; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/usr.bin/lex; ${MAKE} bootstrap; \ + ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} -DNOLIB all; \ + ${MAKE} ${MK_FLAGS} -DNOLIB -B install ${CLEANDIR} + cd ${.CURDIR}/usr.bin/lex; ${MAKE} ${OBJDIR} + cd ${.CURDIR}/usr.sbin/mtree; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} +.if defined(DESTDIR) + cd ${.CURDIR}/include && ${MAKE} copies +.endif + +# +# include-tools - generally the same as 'bootstrap', except that it's for +# things that are specifically needed to generate include files. +# +# XXX should be merged with bootstrap, it's not worth keeeping them separate. +# Well, maybe it is now. We force 'cleandepend' here to avoid dependencies +# on cleaned away headers in ${WORLDTMP}. +# +include-tools: +.for d in usr.bin/compile_et usr.bin/rpcgen + cd ${.CURDIR}/$d; ${MAKE} cleandepend; \ + ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} +.endfor + +# +# includes - possibly generate and install the include files. +# +includes: +.if defined(CLOBBER) + rm -rf ${DESTDIR}/usr/include/* + mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \ + -p ${DESTDIR}/usr/include +.endif + cd ${.CURDIR}/include; ${MAKE} -B all install + cd ${.CURDIR}/gnu/include; ${MAKE} install + cd ${.CURDIR}/gnu/lib/libmp; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libobjc; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libreadline; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libregex; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libstdc++; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libg++; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libdialog; ${MAKE} beforeinstall + cd ${.CURDIR}/gnu/lib/libgmp; ${MAKE} beforeinstall +.if exists(secure) && !defined(NOCRYPT) + cd ${.CURDIR}/secure/lib/libdes; ${MAKE} beforeinstall +.endif +.if exists(kerberosIV) && !defined(NOCRYPT) && defined(MAKE_KERBEROS4) + cd ${.CURDIR}/kerberosIV/lib/libacl; ${MAKE} beforeinstall + cd ${.CURDIR}/kerberosIV/lib/libkadm; ${MAKE} beforeinstall + cd ${.CURDIR}/kerberosIV/lib/libkafs; ${MAKE} beforeinstall + cd ${.CURDIR}/kerberosIV/lib/libkdb; ${MAKE} beforeinstall + cd ${.CURDIR}/kerberosIV/lib/libkrb; ${MAKE} beforeinstall + cd ${.CURDIR}/kerberosIV/lib/libtelnet; ${MAKE} beforeinstall +.else + cd ${.CURDIR}/lib/libtelnet; ${MAKE} beforeinstall +.endif +.if exists(${.CURDIR}/lib/csu/${MACHINE}) + cd ${.CURDIR}/lib/csu/${MACHINE}; ${MAKE} beforeinstall +.endif + cd ${.CURDIR}/lib/libalias; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libc; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libcalendar; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libcurses; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libdisk; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libedit; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libftpio; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libmd; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libmytinfo; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libncurses; ${MAKE} beforeinstall +.if !defined(WANT_CSRG_LIBM) + cd ${.CURDIR}/lib/msun; ${MAKE} beforeinstall +.endif + cd ${.CURDIR}/lib/libopie; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libpcap; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/librpcsvc; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libskey; ${MAKE} beforeinstall +.if !defined(NOTCL) && exists (${.CURDIR}/contrib/tcl) && \ + exists(${.CURDIR}/usr.bin/tclsh) && exists (${.CURDIR}/lib/libtcl) + cd ${.CURDIR}/lib/libtcl; ${MAKE} installhdrs +.endif + cd ${.CURDIR}/lib/libtermcap; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libcom_err; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libss; ${MAKE} -B hdrs beforeinstall + cd ${.CURDIR}/lib/libscsi; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libutil; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libvgl; ${MAKE} beforeinstall + cd ${.CURDIR}/lib/libz; ${MAKE} beforeinstall + cd ${.CURDIR}/usr.bin/f2c; ${MAKE} beforeinstall + cd ${.CURDIR}/usr.bin/lex; ${MAKE} beforeinstall + +# +# Declare tools if they are not required on all architectures. +# +.if ${MACHINE_ARCH} == "i386" +# aout tools: +_aout_ar = usr.bin/ar +_aout_as = gnu/usr.bin/as +_aout_ld = gnu/usr.bin/ld +_aout_nm = usr.bin/nm +_aout_ranlib = usr.bin/ranlib +_aout_size = usr.bin/size +_aout_strip = usr.bin/strip +.endif + +# +# lib-tools - build tools to compile and install the libraries. +# +# XXX gperf is required for cc +# XXX a new ld and tsort is required for cc +lib-tools: +.for d in \ + gnu/usr.bin/gperf \ + ${_aout_ld} \ + usr.bin/tsort \ + ${_aout_as} \ + gnu/usr.bin/bison \ + gnu/usr.bin/cc \ + ${_aout_ar} \ + usr.bin/env \ + usr.bin/lex/lib \ + usr.bin/mk_cmds \ + ${_aout_nm} \ + ${_aout_ranlib} \ + ${_aout_strip} \ + gnu/usr.bin/binutils \ + usr.bin/uudecode \ + share/info \ + usr.bin/objformat + cd ${.CURDIR}/$d; ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install; \ + ${MAKE} ${MK_FLAGS:S/-DNOPIC//} -B ${CLEANDIR} ${OBJDIR} +.endfor + +# +# We have to know too much about ordering and subdirs in the lib trees: +# +# To satisfy shared library linkage when only the libraries being built +# are visible: +# +# libcom_err must be built before libss. +# libcrypt and libmd must be built before libskey. +# libm must be built before libtcl. +# libmytinfo must be built before libdialog and libncurses. +# libncurses must be built before libdialog. +# libtermcap must be built before libcurses, libedit and libreadline. +# +# Some libraries are built conditionally and/or are in inconsistently +# named directories: +# +.if exists(lib/csu/${MACHINE}.pcc) +_csu=lib/csu/${MACHINE}.pcc +.elif ${MACHINE} == "i386" && ${OBJFORMAT} == "elf" +_csu=lib/csu/i386-elf +.else +_csu=lib/csu/${MACHINE} +.endif + +.if !defined(NOSECURE) && !defined(NOCRYPT) +_libcrypt= secure/lib/libcrypt lib/libcrypt +.else +_libcrypt= lib/libcrypt +.endif + +.if defined(WANT_CSRG_LIBM) +_libm= lib/libm +.else +_libm= lib/msun +.endif + +# +# bootstrap-libraries - build just enough libraries for the bootstrap +# tools, and install them under ${WORLDTMP}. +# +# Build csu and libgcc early so that some tools get linked to the new +# versions (too late for the main tools, however). Then build the +# necessary prerequisite libraries (libtermcap just needs to be before +# libcurses, and this only matters for the NOCLEAN case when NOPIC is +# not set). +# +# This is mostly wrong. The build tools must run on the host system, +# so they should use host libraries. We depend on the target being +# similar enough to the host for new target libraries to work on the +# host. +# +bootstrap-libraries: +.for _lib in ${_csu} gnu/usr.bin/cc/libgcc lib/libtermcap \ + gnu/lib/libregex gnu/lib/libreadline lib/libc \ + ${_libcrypt} lib/libcurses lib/libedit ${_libm} \ + lib/libmd lib/libutil lib/libz usr.bin/lex/lib +.if exists(${.CURDIR}/${_lib}) + cd ${.CURDIR}/${_lib}; \ + ${MAKE} ${MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${MK_FLAGS} all; \ + ${MAKE} ${MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} +.endif +.endfor + +# +# bootstrap-rtld - Build the shared library loader and install it +# under ${WORLDTMP}. This requires libc_pic which isn't normally +# bootstrapped, so libc has to be built again. *sigh* +# +RTLD_MK_FLAGS= -DNOINFO -DNOMAN -DNOPROFILE +bootstrap-rtld: +.if exists(${.CURDIR}/libexec/rtld-${OBJFORMAT}) + cd ${.CURDIR}/lib/libc; \ + ${MAKE} ${RTLD_MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${RTLD_MK_FLAGS} all; \ + ${MAKE} ${RTLD_MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} + cd ${.CURDIR}/libexec/rtld-${OBJFORMAT}; \ + ${MAKE} obj; \ + ${MAKE} ${RTLD_MK_FLAGS} ${_DEPEND}; \ + ${MAKE} ${RTLD_MK_FLAGS} all; \ + ${MAKE} ${RTLD_MK_FLAGS} -B install ${CLEANDIR} ${OBJDIR} +.endif + +# +# libraries - build all libraries, and install them under ${DESTDIR}. +# +# The ordering is not as special as for bootstrap-libraries. Build +# the prerequisites first, then build almost everything else in +# alphabetical order. +# +libraries: +.for _lib in lib/libcom_err ${_libcrypt} ${_libm} lib/libmytinfo \ + lib/libncurses lib/libtermcap \ + gnu/lib gnu/usr.bin/cc/libgcc lib usr.bin/lex/lib usr.sbin/pcvt/keycap +.if exists(${.CURDIR}/${_lib}) + cd ${.CURDIR}/${_lib}; ${MAKE} all; ${MAKE} -B install +.endif +.endfor +.if exists(${.CURDIR}/secure/lib) && !defined(NOCRYPT) && !defined(NOSECURE) + cd ${.CURDIR}/secure/lib; ${MAKE} all; ${MAKE} -B install +.endif +.if exists(${.CURDIR}/kerberosIV/lib) && !defined(NOCRYPT) && \ + defined(MAKE_KERBEROS4) + cd ${.CURDIR}/kerberosIV/lib; ${MAKE} all; ${MAKE} -B install +.endif + +# +# Exclude unused tools from build-tools. +# +.if !defined(NOGAMES) && exists(${.CURDIR}/games) +_adventure= games/adventure +_caesar= games/caesar +_hack= games/hack +_phantasia= games/phantasia +_strfile= games/fortune/strfile +.endif +.if !defined(NOPERL) +_perl= gnu/usr.bin/perl/perl +.endif +.if !defined(NOSHARE) && exists(${.CURDIR}/share) +_scrnmaps= share/syscons/scrnmaps +.endif +.if !defined(NOLKM) && exists(${.CURDIR}/lkm) && ${OBJFORMAT} == "aout" +_linux= lkm/linux +.endif +.if ${OBJFORMAT} == "aout" +_netboot= sys/i386/boot/netboot +.endif + +BTMAKEFLAGS= ${MK_FLAGS} -D_BUILD_TOOLS + +# +# build-tools - build and install any other tools needed to complete the +# compile and install. +# ifdef stale +# bc and cpp are required to build groff. Otherwise, the order here is +# mostly historical, i.e., bogus. +# chmod is used to build gcc's tmpmultilib[2] at obscure times. +# endif stale +# XXX uname is a bug - the target should not depend on the host. +# +build-tools: +.for d in \ + bin/cat \ + bin/chmod \ + bin/cp \ + bin/date \ + bin/dd \ + bin/echo \ + bin/expr \ + bin/hostname \ + bin/ln \ + bin/ls \ + bin/mkdir \ + bin/mv \ + bin/rm \ + bin/test \ + ${_caesar} \ + ${_strfile} \ + gnu/usr.bin/awk \ + gnu/usr.bin/bc \ + gnu/usr.bin/grep \ + gnu/usr.bin/groff \ + gnu/usr.bin/gzip \ + gnu/usr.bin/man/makewhatis \ + gnu/usr.bin/patch \ + ${_perl} \ + gnu/usr.bin/sort \ + gnu/usr.bin/texinfo \ + usr.bin/basename \ + usr.bin/cap_mkdb \ + usr.bin/chflags \ + usr.bin/cmp \ + usr.bin/col \ + usr.bin/colldef \ + usr.bin/cpp \ + usr.bin/expand \ + usr.bin/file2c \ + usr.bin/find \ + usr.bin/gencat \ + usr.bin/id \ + usr.bin/join \ + usr.bin/lorder \ + usr.bin/m4 \ + usr.bin/mkdep \ + usr.bin/mklocale \ + usr.bin/paste \ + usr.bin/sed \ + ${_aout_size} \ + usr.bin/soelim \ + usr.bin/symorder \ + usr.bin/touch \ + usr.bin/tr \ + usr.bin/true \ + usr.bin/uname \ + usr.bin/uuencode \ + usr.bin/vgrind \ + usr.bin/vi \ + usr.bin/wc \ + usr.bin/xargs \ + usr.bin/yacc \ + usr.sbin/chown \ + usr.sbin/mtree \ + usr.sbin/zic \ + bin/sh + cd ${.CURDIR}/$d; ${MAKE} ${BTMAKEFLAGS} ${_DEPEND}; \ + ${MAKE} ${BTMAKEFLAGS} all; \ + ${MAKE} ${BTMAKEFLAGS} -B install ${CLEANDIR} ${OBJDIR} +.endfor +.if !defined(NOGAMES) && exists(${.CURDIR}/games) + cd ${DESTDIR}/usr/games; cp -p caesar strfile ${DESTDIR}/usr/bin +.endif +.for d in \ + bin/sh \ + ${_adventure} \ + ${_hack} \ + ${_phantasia} \ + gnu/usr.bin/cc/cc_tools \ + lib/libmytinfo \ + ${_linux} \ + ${_scrnmaps} \ + ${_netboot} + cd ${.CURDIR}/$d; ${MAKE} ${BTMAKEFLAGS} build-tools +.endfor + cd ${.CURDIR}/usr.bin/tn3270/tools; ${MAKE} ${BTMAKEFLAGS} all + +# +# Build aout versions of things that provide legacy support when all the +# rest of the world is elf. +# +legacy-build: +.if ${MACHINE_ARCH} == "i386" && ${OBJFORMAT} == "aout" + @echo + @echo "--------------------------------------------------------------" + @echo " Making hierarchy" + @echo "--------------------------------------------------------------" + mkdir -p ${WORLDTMP} + cd ${.CURDIR}; ${XMAKE} -f Makefile.inc1 hierarchy + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding the ${OBJFORMAT} obj tree" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; ${XMAKE} -f Makefile.inc1 par-${OBJDIR} + @echo + @echo "--------------------------------------------------------------" + @echo " Rebuilding ${DESTDIR}/usr/include" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; SHARED=copies ${XMAKE} -f Makefile.inc1 includes + @echo + @echo "--------------------------------------------------------------" + @echo " Building legacy libraries" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}; \ + ${XMAKE} -DNOINFO -DNOMAN -f Makefile.inc1 bootstrap-libraries + cd ${.CURDIR}; \ + ${XMAKE} -DNOINFO -DNOMAN -f Makefile.inc1 libraries + @echo + @echo "--------------------------------------------------------------" + @echo " Building legacy rtld" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/libexec/rtld-aout; \ + ${XMAKE} -DNOMAN depend; ${XMAKE} -DNOMAN all; + @echo + @echo "--------------------------------------------------------------" + @echo " Building legacy lkms" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/lkm; \ + ${XMAKE} -DNOMAN depend; ${XMAKE} -DNOMAN all; + @echo + @echo "--------------------------------------------------------------" + @echo " Building legacy boot" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/sys/i386/boot; \ + ${XMAKE} -DNOMAN depend; ${XMAKE} -DNOMAN all; +.endif + +# +# Install aout versions of things that provide legacy support when all the +# rest of the world is elf. +# +legacy-install: +.if ${MACHINE_ARCH} == "i386" && ${OBJFORMAT} == "aout" + @echo + @echo "--------------------------------------------------------------" + @echo " Installing legacy libraries" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/lib; ${MAKE} -B install + cd ${.CURDIR}/gnu/lib; ${MAKE} -B install + @echo + @echo "--------------------------------------------------------------" + @echo " Installing legacy rtld" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/libexec/rtld-aout; ${MAKE} -DNOMAN install + @echo + @echo "--------------------------------------------------------------" + @echo " Installing legacy lkms" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/lkm; ${MAKE} -DNOMAN install + @echo + @echo "--------------------------------------------------------------" + @echo " Installing legacy boot" + @echo "--------------------------------------------------------------" + cd ${.CURDIR}/sys/i386/boot; ${MAKE} -DNOMAN install +.endif + + +.for __target in clean cleandepend cleandir depend obj +.for entry in ${SUBDIR} +${entry}.${__target}__D: .PHONY + @if test -d ${.CURDIR}/${entry}.${MACHINE}; then \ + ${ECHODIR} "===> ${DIRPRFX}${entry}.${MACHINE}"; \ + edir=${entry}.${MACHINE}; \ + cd ${.CURDIR}/$${edir}; \ + else \ + ${ECHODIR} "===> ${DIRPRFX}${entry}"; \ + edir=${entry}; \ + cd ${.CURDIR}/$${edir}; \ + fi; \ + ${MAKE} ${__target} DIRPRFX=${DIRPRFX}$${edir}/ +.endfor +par-${__target}: ${SUBDIR:S/$/.${__target}__D/} +.endfor + +.include diff --git a/Makefile.upgrade b/Makefile.upgrade new file mode 100644 index 000000000000..7a6141345237 --- /dev/null +++ b/Makefile.upgrade @@ -0,0 +1,230 @@ +# +# $Id$ +# +# This makefile contains rules for preforming upgrades that are outside +# the scope of the normal build world process. +# + +# +# Build things relative to the user's preferred object directory, +# defaulting to /usr/obj if not defined. +# +MAKEOBJDIRPREFIX?=/usr/obj + +# +# The installed operating system release gives us the hint as to whether +# we need to build a kernel too. +# +INSTALLEDVERSION!=uname -r + +# +# Upgrade the installed make to the current version using the installed +# headers, libraries and build tools. This is required on installed versions +# prior to 2.2.5 in which the installed make doesn't support the -m argument. +# +make : + @echo + @echo "--------------------------------------------------------------" + @echo " Upgrading the installed make" + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}/usr.bin/make; \ + make obj && make depend && make all && make install + +# +# Upgrade from aout to elf, doing an aout build first to ensure that there +# are up-to-date tools before building the initial elf world. The aout +# tools just built into the object directory tree and executed from there +# during the elf build. Then install the aout tools, build an aout kernel +# with them (in case the installed kernel is an older version), then +# install the elf world. +# +aout-to-elf aout-to-elf-install : \ + ${MAKEOBJDIRPREFIX}/do_aout_buildworld \ + ${MAKEOBJDIRPREFIX}/do_elf_buildworld \ + ${MAKEOBJDIRPREFIX}/do_aout_installworld \ + ${MAKEOBJDIRPREFIX}/do_aout_kernel \ + ${MAKEOBJDIRPREFIX}/do_elf_installworld \ + ${MAKEOBJDIRPREFIX}/do_set_objformat \ + ${MAKEOBJDIRPREFIX}/do_install_kernel_reboot + +# +# Just do the build parts of the transition build. +# +aout-to-elf-build : \ + ${MAKEOBJDIRPREFIX}/do_aout_buildworld \ + ${MAKEOBJDIRPREFIX}/do_elf_buildworld + +# +# The installed system may not have tools capable of building an elf +# aware world, so a complete aout buildworld is required to get a known +# set of tools. +# +${MAKEOBJDIRPREFIX}/do_aout_buildworld : + @echo + @echo "--------------------------------------------------------------" + @echo " Doing an aout buildworld to get an up-to-date set of tools" + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}; MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/aout \ + OBJFORMAT=aout \ + make -f Makefile.inc1 -m ${.CURDIR}/share/mk buildworld + @touch ${MAKEOBJDIRPREFIX}/do_aout_buildworld + +# +# Temporary path for initial elf build. +# +AOUTTMPPATH= ${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp/sbin:${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp/bin:${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp/usr/sbin:${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp/usr/bin:${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp/usr/games + +# +# Use the aout tools from the aout buildworld to do an elf buildworld. +# +${MAKEOBJDIRPREFIX}/do_elf_buildworld : + @echo + @echo "--------------------------------------------------------------" + @echo " Doing an elf buildworld using the aout tools in the aout" + @echo " obj tree." + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}; MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/elf \ + PATH=${AOUTTMPPATH} OBJFORMAT=elf NOTOOLS=1 \ + TOOLROOT=${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp \ + make -f Makefile.inc1 -m ${.CURDIR}/share/mk buildworld + @touch ${MAKEOBJDIRPREFIX}/do_elf_buildworld + +# +# Before installing the aout world, allow for the possibility that the +# world about to be installed has some different syscalls to the installed +# kernel which will make shutting the system down problematic. We set aside +# copies of certain programs which match the running kernel. +# +# Install the aout world so that anything that isn't replaced by the +# elf world will be updated. +# +${MAKEOBJDIRPREFIX}/do_aout_installworld : + @echo + @echo "--------------------------------------------------------------" + @echo " You are about to update the installed system (or the system" + @echo " that your DESTDIR points to). You can type Ctrl-C to abort" + @echo " now or press return to start the first phase of the update." + @echo "--------------------------------------------------------------" + @/bin/sh -c "read -p \"Return to continue or Ctrl-C to abort: \" _e" +.if ${INSTALLEDVERSION} != "3.0-CURRENT" + @echo + @echo "--------------------------------------------------------------" + @echo " Saving a copy of programs required to shut the system down" + @echo "--------------------------------------------------------------" + @cp /bin/sh ${MAKEOBJDIRPREFIX} + @cp /sbin/reboot ${MAKEOBJDIRPREFIX} +.endif + @echo + @echo "--------------------------------------------------------------" + @echo " Doing an aout installworld using the aout tools in the aout" + @echo " obj tree." + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}; MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/aout \ + PATH=${AOUTTMPPATH} OBJFORMAT=aout NOTOOLS=1 \ + TOOLROOT=${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp \ + make -f Makefile.inc1 -m ${.CURDIR}/share/mk installworld + @touch ${MAKEOBJDIRPREFIX}/do_aout_installworld + +# +# The installed kernel may not match the world that is installed, so build +# a generic kernel, but don't install it. The user can decide if the kernel +# needs to be installed. Perhaps we should install it in the root +# directory as an obscure name just in case a reboot is required? +# +${MAKEOBJDIRPREFIX}/do_aout_kernel : +.if ${INSTALLEDVERSION} == "3.0-CURRENT" + @echo + @echo "--------------------------------------------------------------" + @echo " You are already running 3.0-CURRENT, so a kernel build" + @echo " is probably not required." + @echo "--------------------------------------------------------------" +.else + @echo + @echo "--------------------------------------------------------------" + @echo " Building a generic kernel using the new aout tools" + @echo "--------------------------------------------------------------" +.if exists(${.CURDIR}/sys/compile/GENERICupgrade) + @rm -rf ${.CURDIR}/sys/compile/GENERICupgrade +.endif + @cd ${.CURDIR}/sys/i386/conf; config GENERICupgrade + @-cd ${.CURDIR}/sys/compile/GENERICupgrade; make depend && make all + @cd ${.CURDIR}/sys/compile/GENERICupgrade; make depend && make all +.endif + @touch ${MAKEOBJDIRPREFIX}/do_aout_kernel + +# +# Install the elf world overwriting just about all the previously installed +# aout world. Any aout things that need to be kept have already been +# installed in different places (typically in aout subdirectories). +# +${MAKEOBJDIRPREFIX}/do_elf_installworld : + @echo + @echo "--------------------------------------------------------------" + @echo " You are about to update the installed system (or the system" + @echo " that your DESTDIR points to) with the elf versions of" + @echo " everything, replacing the aout versions. You can type Ctrl-C" + @echo " to abort now, leaving just the aout world installed, or" + @echo " press return to start the second phase of the update." + @echo "--------------------------------------------------------------" + @/bin/sh -c "read -p \"Return to continue or Ctrl-C to abort: \" _e" + @echo + @echo "--------------------------------------------------------------" + @echo " Doing an elf installworld using the aout tools in the aout" + @echo " obj tree." + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}; MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}/elf \ + PATH=${AOUTTMPPATH} OBJFORMAT=elf NOTOOLS=1 \ + TOOLROOT=${MAKEOBJDIRPREFIX}/aout${.CURDIR}/tmp \ + make -f Makefile.inc1 -m ${.CURDIR}/share/mk installworld + @touch ${MAKEOBJDIRPREFIX}/do_elf_installworld + +# +# Now that the elf world has been installed, we can set the default +# object format to elf. +# +${MAKEOBJDIRPREFIX}/do_set_objformat : + @echo + @echo "--------------------------------------------------------------" + @echo " Setting the default object format to elf" + @echo "--------------------------------------------------------------" + @echo "OBJFORMAT=elf" > /etc/objformat + @touch ${MAKEOBJDIRPREFIX}/do_set_objformat + +# +# If not already running a current kernel, install the GENERICupgrade kernel +# and reboot. +# +${MAKEOBJDIRPREFIX}/do_install_kernel_reboot : +.if ${INSTALLEDVERSION} == "3.0-CURRENT" + @echo + @echo "--------------------------------------------------------------" + @echo " Your system has been updated to run elf by default!" + @echo + @echo " You should reboot your system now." + @echo "--------------------------------------------------------------" + @touch ${MAKEOBJDIRPREFIX}/do_install_kernel_reboot +.else + @echo + @echo "--------------------------------------------------------------" + @echo " Your system has been updated to run elf by default!" + @echo + @echo " Since you are running ${INSTALLEDVERSION}, the kernel must" + @echo " be installed before the system is rebooted. You can type" + @echo " Ctrl-C to abort the kernel installation (at your own risk)," + @echo " or press return for the kernel to be installed and the" + @echo " system rebooted." + @echo "--------------------------------------------------------------" + @${MAKEOBJDIRPREFIX}/sh -c "read -p \"Return to continue or Ctrl-C to abort: \" _e" + @echo + @echo "--------------------------------------------------------------" + @echo " Installing a new GENERICupgrade kernel" + @echo "--------------------------------------------------------------" + @cd ${.CURDIR}/sys/compile/GENERICupgrade; make install + @echo + @echo "--------------------------------------------------------------" + @echo " Rebooting......." + @echo "--------------------------------------------------------------" + @touch ${MAKEOBJDIRPREFIX}/do_install_kernel_reboot + @-${MAKEOBJDIRPREFIX}/reboot +.endif + -- cgit v1.2.3