From 31b7057f617d98f143fe076a2a53e3e9ee40202f Mon Sep 17 00:00:00 2001 From: lukem Date: Thu, 23 Jan 2003 16:24:08 +0000 Subject: [PATCH] Rework how build.sh functions, so that command line options set various parameters, and a list of "operations" defines what to do. The full usage is show below. Notes: `-b' has been deprecated (it always occurs now) `-d' is replaced by "distribution" `-R rel' onlys sets RELEASEDIR; use "release" to build a release `-k kern' has been replaced by "kernel=kern" `-i idir' has been replaced by "install=idir" -r now occurs before nbmake is rebuilt Add a copyright (long due!). Rework the code to (a KNF inspired) ShellNF. Use functions appropriately. Allow `nb' prefix to be easily changed to something else. Solve world peace (just kidding) This is part of the (never achievable) goal of attempting to make NetBSD easier to build... --8<-- new usage follows --8<-- Usage: build.sh [-EnorUu] [-a arch] [-B buildid] [-D dest] [-j njob] [-M obj] [-m mach] [-O obj] [-R release] [-T tools] [-V var=[value]] [-w wrapper] [operation [...] ] System build operations (all imply "obj" and "tools"): build Run "make build" distribution Run "make distribution" (includes etc/ files) release Run "make release" (includes kernels & distrib media) Other operations: obj Run "make obj" (default unless -o) tools Build and install tools kernel=conf Build kernel with config file `conf' install=idir Run "make installworld" to `idir' (useful after 'distribution' or 'release') Options: -a arch Set MACHINE_ARCH to arch (otherwise deduced from MACHINE) -B buildId Set BUILDID to buildId -D dest Set DESTDIR to dest -E Set "expert" mode; disables some DESTDIR checks -j njob Run up to njob jobs in parallel; see make(1) -M obj Set obj root directory to obj (sets MAKEOBJDIRPREFIX) -m mach Set MACHINE to mach (not required if NetBSD native) -n Show commands that would be executed, but do not execute them -O obj Set obj root directory to obj (sets a MAKEOBJDIR pattern) -o Set MKOBJDIRS=no (do not create objdirs at start of build) -R release Set RELEASEDIR to release -r Remove contents of TOOLDIR and DESTDIR before building -T tools Set TOOLDIR to tools. If unset, and TOOLDIR is not set in the environment, nbmake will be (re)built unconditionally. -U Set UNPRIVED -u Set UPDATE -V v=[val] Set variable `v' to `val' -w wrapper Create nbmake script as wrapper (default: ${TOOLDIR}/bin/nbmake-${MACHINE}) --- BUILDING | 102 ++-- build.sh | 1125 +++++++++++++++++++++++++++------------------ doc/BUILDING.mdoc | 203 ++++---- 3 files changed, 848 insertions(+), 582 deletions(-) diff --git a/BUILDING b/BUILDING index 87131e0f2886..462bc0913807 100644 --- a/BUILDING +++ b/BUILDING @@ -30,8 +30,8 @@ REQUIREMENTS toolchain (make is not required); all other tools are created as part of the NetBSD build process. - Note: A couple host toolchain components are not yet available in - the tools directory. Also, some tools use non-POSIX, non-ANSI C + Note: A couple of host toolchain components are not yet available + in the tools directory. Also, some tools use non-POSIX, non-ANSI C extensions and need to be standardized. As a result, cross-compil- ing from systems other than NetBSD is not currently supported. @@ -410,7 +410,8 @@ BUILDING the proper order. distribution Do a ``make build'', and then install a full distribution - into DESTDIR. + into DESTDIR, including files in /dev, /etc, /root and + /var. buildworld As per ``make distribution'', except that it ensures that DESTDIR is not the root directory. @@ -423,9 +424,10 @@ BUILDING Note: It is highly recommended that you upgrade your kernel and reboot before performing this operation. - release Do a ``make build'', then package the system into a stan- - dard release layout as described by release(7). This re- - quires that RELEASEDIR be set (see above). + release Do a ``make distribution'', build kernels, distribution me- + dia, and install sets, and then package the system into a + standard release layout as described by release(7). This + requires that RELEASEDIR be set (see above). regression-tests Can only be run after building the regression tests in the @@ -449,8 +451,38 @@ BUILDING of options below, variables that are automatically set by build.sh are noted where applicable. - The following are available command line options that may be supplied to - build.sh: + The following operations are supported by build.sh: + + build Build the system as per ``make build''. This option im- + plies the obj and tools operations. + + distribution Build a full distribution as per ``make distribution''. + This option implies the build operation. + + release Build a full release as per ``make release''. This option + implies the distribution operation. + + obj Perform ``make obj''. + + tools Build and install the host tools from src/tools. + + kernel=kconf Build a new kernel. The kconf argument is the name of a + configuration file suitable for use by config(8). If kconf + does not contain any `/' characters, the configuration file + is expected to be found in the KERNCONFDIR directory, which + is typically sys/arch/MACHINE/conf. The new kernel will be + built in a subdirectory of KERNOBJDIR, which is typically + sys/arch/MACHINE/compile or an associated object directory. + In order to ensure that the kernel is built using up-to- + date tools, it is strongly recommended that the tools be + rebuilt (using the tools operation). + + install=idir Install the contents of DESTDIR to idir, using ``make + installworld''. + + The following command line options alter the behaviour of the above oper- + ations: The following command line options alter the behaviour of the + build.sh operations described above: -a arch Set the value of MACHINE_ARCH to arch. @@ -460,43 +492,16 @@ BUILDING that the resulting name is of the form ``nbmake-MACHINE- BUILDID''. - -b Bootstrap ``make'' and create a nbmake-MACHINE script (see be- - low). - -D dest Set the value of DESTDIR to dest. - -d Build a full distribution. This differs from a default build - in that files will also be installed to /dev, /etc, /root and - /var. Note this does not build a ``release''; no release sets - are placed in ${RELEASEDIR}. -d is implied by -R. - -E Set `expert' mode; DESTDIR does not have to be set to a non- root path for builds when this is set. - -i installworlddir - Install the contents of DESTDIR to installworlddir after all - other operations have completed, using the top level - ``installworld'' target. - -j njob Passed through to make(1). Makefiles should use .WAIT or have explicit dependancies as necessary to enforce build ordering. If you see build failures with -j, please save complete build logs so the failures can be analyzed. - -k kernel - Build a new kernel. The kernel argument is the name of a con- - figuration file suitable for use by config(8). If kernel does - not contain any `/' characters, the configuration file is ex- - pected to be found in the KERNCONFDIR directory, which is typi- - cally sys/arch/MACHINE/conf. The new kernel will be built in a - subdirectory of KERNOBJDIR, which is typically - sys/arch/MACHINE/compile or an associated object directory. In - order to ensure that the kernel is built using up-to-date - tools, it is strongly recommended that the tools be rebuilt - (using the -t option) in a separate invocation of build.sh pri- - or to using the -k option, or that the -t and -k options be - used together in a single invocation of build.sh. - -M obj Set MAKEOBJDIRPREFIX to obj. -m mach Set the value of MACHINE to mach. This will also override any @@ -516,9 +521,7 @@ BUILDING -o Set the value of MKOBJDIRS to ``no''. - -R rel Set the value of RELEASEDIR to rel. Setting this option will - cause build.sh to run ``make release'' instead of ``make - build''. + -R rel Set the value of RELEASEDIR to rel. -r Remove the contents of DESTDIR and TOOLDIR before building (provides a clean starting point). This will skip deleting @@ -528,9 +531,6 @@ BUILDING ``make'' will only be rebuilt as needed (when the source files for make(1) change). - -t Build and install the host tools from src/tools only. This op- - tion implies -b. - -U Set the UNPRIVED variable. -u Set the UPDATE variable. @@ -558,7 +558,7 @@ BUILDING with an absolute path. EXAMPLES - ./build.sh -t + ./build.sh tools Build a new toolchain. cd ${KERNCONFDIR} ; ${TOOLDIR}/bin/nbconfig GENERIC @@ -568,15 +568,23 @@ EXAMPLES cd ${KERNOBJDIR}/GENERIC ; ${TOOLDIR}/bin/nbmake-${MACHINE} dependall Use the new toolchain to build a new GENERIC kernel. - ./build.sh -t -k GENERIC + ./build.sh tools kernel=GENERIC Build a new toolchain, and use the new toolchain to configure - and build a new GENERIC kernel. + and build a new GENERIC kernel. This is a simpler way to + achieve what the first three examples do. - ./build.sh -U -d + ./build.sh -U distribution Using unprivileged mode, build a complete distribution in DESTDIR. - ./build.sh -U -R /some/dir/RELEASE + # ./build.sh -U installworld=/ + As root, install the distribution that was built with unprivi- + leged mode from DESTDIR to /. (Even though this is run as + root, -U is required so that the permissions stored in + DESTDIR/METALOG are correctly applied to the files as they're + copied to /). + + ./build.sh -U -R /some/dir/RELEASE release Using unprivileged mode, build a complete release in the speci- fied release directory. @@ -597,4 +605,4 @@ HISTORY BUGS A few platforms are not yet using this build system. -NetBSD January 4, 2003 10 +NetBSD January 24, 2003 10 diff --git a/build.sh b/build.sh index d0be4f95c5d2..d6a84df663b7 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,40 @@ #! /usr/bin/env sh -# $NetBSD: build.sh,v 1.83 2003/01/22 11:26:11 lukem Exp $ +# $NetBSD: build.sh,v 1.84 2003/01/23 16:24:08 lukem Exp $ +# +# Copyright (c) 2001-2003 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Todd Vierling and Luke Mewburn. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the NetBSD +# Foundation, Inc. and its contributors. +# 4. Neither the name of The NetBSD Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# # # Top level build wrapper, for a system containing no tools. # @@ -11,8 +46,10 @@ # to take any further action. # -trap "exit 1" 1 2 3 15 +progname=${0##*/} toppid=$$ +trap "exit 1" 1 2 3 15 + bomb() { cat >&2 </dev/null) -uname_m=$(uname -m 2>/dev/null) +initdefaults() +{ + cd "$(dirname $0)" + [ -d usr.bin/make ] || + bomb "build.sh must be run from the top source level" + [ -f share/mk/bsd.own.mk ] || + bomb "src/share/mk is missing; please re-fetch the source tree" -# If $PWD is a valid name of the current directory, POSIX mandates that pwd -# return it by default which causes problems in the presence of symlinks. -# Unsetting PWD is simpler than changing every occurrence of pwd to use -P. -# -# XXX Except that doesn't work on Solaris. -unset PWD -if [ "${uname_s}" = "SunOS" ]; then - TOP=$(pwd -P) -else - TOP=$(pwd) -fi + uname_s=$(uname -s 2>/dev/null) + uname_m=$(uname -m 2>/dev/null) + + # If $PWD is a valid name of the current directory, POSIX mandates + # that pwd return it by default which causes problems in the + # presence of symlinks. Unsetting PWD is simpler than changing + # every occurrence of pwd to use -P. + # + # XXX Except that doesn't work on Solaris. + unset PWD + if [ "${uname_s}" = "SunOS" ]; then + TOP=$(pwd -P) + else + TOP=$(pwd) + fi + + # Set defaults. + toolprefix=nb + MAKEFLAGS= + makeenv= + makewrapper= + runcmd= + operations= + removedirs= + do_expertmode=false + do_rebuildmake=false + do_removedirs=false + + # do_{operation}=true if given operation is requested. + # + do_tools=false + do_obj=false + do_build=false + do_distribution=false + do_release=false + do_kernel=false + do_install=false +} getarch() { # Translate a MACHINE into a default MACHINE_ARCH. + # case $MACHINE in - acorn26|acorn32|cats|netwinder|shark|*arm) - MACHINE_ARCH=arm;; - sun2) - MACHINE_ARCH=m68000;; + acorn26|acorn32|cats|netwinder|shark|*arm) + MACHINE_ARCH=arm + ;; - amiga|atari|cesfic|hp300|sun3|*68k) - MACHINE_ARCH=m68k;; + sun2) + MACHINE_ARCH=m68000 + ;; - mipsco|newsmips|sbmips|sgimips) - MACHINE_ARCH=mipseb;; + amiga|atari|cesfic|hp300|sun3|*68k) + MACHINE_ARCH=m68k + ;; - algor|arc|cobalt|evbmips|hpcmips|playstation2|pmax) - MACHINE_ARCH=mipsel;; + mipsco|newsmips|sbmips|sgimips) + MACHINE_ARCH=mipseb + ;; - pc532) - MACHINE_ARCH=ns32k;; + algor|arc|cobalt|evbmips|hpcmips|playstation2|pmax) + MACHINE_ARCH=mipsel + ;; - bebox|prep|sandpoint|*ppc) - MACHINE_ARCH=powerpc;; + pc532) + MACHINE_ARCH=ns32k + ;; - evbsh3|mmeye) - MACHINE_ARCH=sh3eb;; + bebox|prep|sandpoint|*ppc) + MACHINE_ARCH=powerpc + ;; - dreamcast|hpcsh) - MACHINE_ARCH=sh3el;; + evbsh3|mmeye) + MACHINE_ARCH=sh3eb + ;; - hp700) - MACHINE_ARCH=hppa;; + dreamcast|hpcsh) + MACHINE_ARCH=sh3el + ;; - evbsh5) - MACHINE_ARCH=sh5el;; + hp700) + MACHINE_ARCH=hppa + ;; - alpha|i386|sparc|sparc64|vax|x86_64) - MACHINE_ARCH=$MACHINE;; + evbsh5) + MACHINE_ARCH=sh5el + ;; + + alpha|i386|sparc|sparc64|vax|x86_64) + MACHINE_ARCH=$MACHINE + ;; + + *) + bomb "unknown target MACHINE: $MACHINE" + ;; - *) bomb "unknown target MACHINE: $MACHINE";; esac } validatearch() { # Ensure that the MACHINE_ARCH exists (and is supported by build.sh). + # case $MACHINE_ARCH in - alpha|arm|armeb|hppa|i386|m68000|m68k|mipse[bl]|ns32k|powerpc|sh[35]e[bl]|sparc|sparc64|vax|x86_64) - ;; - *) bomb "unknown target MACHINE_ARCH: $MACHINE_ARCH";; + alpha|arm|armeb|hppa|i386|m68000|m68k|mipse[bl]|ns32k|powerpc|sh[35]e[bl]|sparc|sparc64|vax|x86_64) + ;; + + *) + bomb "unknown target MACHINE_ARCH: $MACHINE_ARCH" + ;; + esac } @@ -111,12 +197,15 @@ _x_: EOF } -# getmakevar doesn't work properly if $make hasn't yet been built, which -# can happen when running with the "-n" option. safe_getmakevar deals -# with this by emitting a literal '$' followed by the variable name, -# instead of trying to find the variable's value. safe_getmakevar() { + # getmakevar() doesn't work properly if $make hasn't yet been built, + # which can happen when running with the "-n" option. + # safe_getmakevar() deals with this by emitting a literal '$' + # followed by the variable name, instead of trying to find the + # variable's value. + # + if [ -x $make ]; then getmakevar "$1" else @@ -127,456 +216,604 @@ safe_getmakevar() resolvepath() { case $OPTARG in - /*) ;; - *) OPTARG="$TOP/$OPTARG";; + /*) + ;; + *) + OPTARG="$TOP/$OPTARG" + ;; esac } usage() { + if [ -n "$*" ]; then + echo "" + echo "${progname}: $*" + fi cat <<_usage_ -Usage: $(basename $0) [-bdEnortUu] [-a arch] [-B buildid] [-D dest] - [-i instdir] [-j njob] [-k kernel] [-M obj] [-m mach] - [-O obj] [-R release] [-T tools] [-V var=[value]] [-w wrapper] - Mutually exclusive build operations (last specified takes precedence): - -b Build nbmake and nbmake wrapper script (if necessary) - -t Build and install tools only (performs -b first) - (default) "make build" into DESTDIR - -d "make distribution" into DESTDIR (including etc files) - -R release "make release" (and set RELEASEDIR to release) - -k kernel Build a kernel using the named configuration file +Usage: ${progname} [-EnorUu] [-a arch] [-B buildid] [-D dest] [-j njob] [-M obj] + [-m mach] [-O obj] [-R release] [-T tools] [-V var=[value]] + [-w wrapper] [operation [...] ] - Options to set various parameters: + System build operations (all imply "obj" and "tools"): + build Run "make build" + distribution Run "make distribution" (includes etc/ files) + release Run "make release" (includes kernels & distrib media) + + Other operations: + obj Run "make obj" (default unless -o) + tools Build and install tools + kernel=conf Build kernel with config file \`conf' + install=idir Run "make installworld" to \`idir' + (useful after 'distribution' or 'release') + + Options: -a arch Set MACHINE_ARCH to arch (otherwise deduced from MACHINE) - -B buildid Set BUILDID to buildid + -B buildId Set BUILDID to buildId -D dest Set DESTDIR to dest -E Set "expert" mode; disables some DESTDIR checks - -i instdir "make installworld" from DESTDIR to instdir - (after build completes) -j njob Run up to njob jobs in parallel; see make(1) -M obj Set obj root directory to obj (sets MAKEOBJDIRPREFIX) -m mach Set MACHINE to mach (not required if NetBSD native) -n Show commands that would be executed, but do not execute them -O obj Set obj root directory to obj (sets a MAKEOBJDIR pattern) -o Set MKOBJDIRS=no (do not create objdirs at start of build) + -R release Set RELEASEDIR to release -r Remove contents of TOOLDIR and DESTDIR before building - -T tools Set TOOLDIR to tools. + -T tools Set TOOLDIR to tools. If unset, and TOOLDIR is not set in + the environment, ${toolprefix}make will be (re)built unconditionally. -U Set UNPRIVED -u Set UPDATE -V v=[val] Set variable \`v' to \`val' - -w wrapper Create nbmake script as wrapper - (default: \${TOOLDIR}/bin/nbmake-\${MACHINE} ) + -w wrapper Create ${toolprefix}make script as wrapper + (default: \${TOOLDIR}/bin/${toolprefix}make-\${MACHINE}) -Note: - + If -T is unset and TOOLDIR is not set in the environment, - nbmake will be [re]built unconditionally. _usage_ exit 1 } -# Set defaults. -MAKEFLAGS= -buildtarget=build -do_buildsystem=true -do_buildkernel=false -do_buildtools=false -do_rebuildmake=false -do_removedirs=false -expert_mode=false -makeenv= -makewrapper= -installworlddir= -opt_a=no -opts='a:B:bD:dEhi:j:k:M:m:nO:oR:rT:tUuV:w:' -runcmd= +parseoptions() +{ + opts='a:B:bD:dEhi:j:k:M:m:nO:oR:rT:tUuV:w:' + opt_a=no -if type getopts >/dev/null 2>&1; then - # Use POSIX getopts. - getoptcmd='getopts $opts opt && opt=-$opt' - optargcmd=':' -else - type getopt >/dev/null 2>&1 || - bomb "/bin/sh shell is too old; try ksh or bash" + if type getopts >/dev/null 2>&1; then + # Use POSIX getopts. + getoptcmd='getopts $opts opt && opt=-$opt' + optargcmd=':' + optremcmd='shift $(($OPTIND -1))' + else + type getopt >/dev/null 2>&1 || + bomb "/bin/sh shell is too old; try ksh or bash" - # Use old-style getopt(1) (doesn't handle whitespace in args). - args="$(getopt $opts $*)" - [ $? = 0 ] || usage - set -- $args + # Use old-style getopt(1) (doesn't handle whitespace in args). + args="$(getopt $opts $*)" + [ $? = 0 ] || usage + set -- $args - getoptcmd='[ $# -gt 0 ] && opt="$1" && shift' - optargcmd='OPTARG="$1"; shift' -fi + getoptcmd='[ $# -gt 0 ] && opt="$1" && shift' + optargcmd='OPTARG="$1"; shift' + optremcmd=':' + fi -# Parse command line options. -while eval $getoptcmd; do - case $opt in - -a) eval $optargcmd - MACHINE_ARCH=$OPTARG; opt_a=yes;; + # Parse command line options. + # + while eval $getoptcmd; do + case $opt in - -B) eval $optargcmd - BUILDID=$OPTARG;; - - -b) do_buildsystem=false;; - - -D) eval $optargcmd; resolvepath - DESTDIR="$OPTARG"; export DESTDIR - makeenv="$makeenv DESTDIR";; - - -d) buildtarget=distribution;; - - -E) expert_mode=true;; - - -i) eval $optargcmd - installworlddir=$OPTARG;; - - -j) eval $optargcmd - parallel="-j $OPTARG";; - - -k) do_buildkernel=true; do_buildsystem=false - eval $optargcmd - kernconfname=$OPTARG;; - - -M) eval $optargcmd; resolvepath - MAKEOBJDIRPREFIX="$OPTARG"; export MAKEOBJDIRPREFIX - makeobjdir=$OPTARG - makeenv="$makeenv MAKEOBJDIRPREFIX";; - - # -m overrides MACHINE_ARCH unless "-a" is specified - -m) eval $optargcmd - MACHINE=$OPTARG; [ "$opt_a" != "yes" ] && getarch;; - - -n) runcmd=echo;; - - -O) eval $optargcmd; resolvepath - MAKEOBJDIR="\${.CURDIR:C,^$TOP,$OPTARG,}"; export MAKEOBJDIR - makeobjdir=$OPTARG - makeenv="$makeenv MAKEOBJDIR";; - - -o) MKOBJDIRS=no;; - - -R) eval $optargcmd; resolvepath - RELEASEDIR=$OPTARG; export RELEASEDIR - makeenv="$makeenv RELEASEDIR" - buildtarget=release;; - - -r) do_removedirs=true; do_rebuildmake=true;; - - -T) eval $optargcmd; resolvepath - TOOLDIR="$OPTARG"; export TOOLDIR;; - - -t) do_buildtools=true; do_buildsystem=false;; - - -U) UNPRIVED=yes; export UNPRIVED - makeenv="$makeenv UNPRIVED";; - - -u) UPDATE=yes; export UPDATE - makeenv="$makeenv UPDATE";; - - -V) eval $optargcmd - case "${OPTARG}" in - # XXX: consider restricting which variables can be changed? - [a-zA-Z_][a-zA-Z_0-9]*=*) - var=${OPTARG%%=*} - value=${OPTARG#*=} - eval "${var}=\"${value}\"; export ${var}" - makeenv="$makeenv ${var}" + -a) + eval $optargcmd + MACHINE_ARCH=$OPTARG + opt_a=yes ;; - *) - echo "-V argument must be of the form 'var=[value]'" - usage;; + + -B) + eval $optargcmd + BUILDID=$OPTARG + ;; + + -b) + usage "'-b' has been removed; it is the default operation" + ;; + + -D) + eval $optargcmd; resolvepath + DESTDIR="$OPTARG" + export DESTDIR + makeenv="$makeenv DESTDIR" + ;; + + -d) + usage "'-d' has been replaced by 'distribution'" + ;; + + -E) + do_expertmode=true + ;; + + -i) + usage "'-i idir' has been replaced by 'install=idir'" + ;; + + -j) + eval $optargcmd + parallel="-j $OPTARG" + ;; + + -k) + usage "'-k conf' has been replaced by 'kernel=conf'" + ;; + + -M) + eval $optargcmd; resolvepath + MAKEOBJDIRPREFIX="$OPTARG" + export MAKEOBJDIRPREFIX + makeobjdir=$OPTARG + makeenv="$makeenv MAKEOBJDIRPREFIX" + ;; + + # -m overrides MACHINE_ARCH unless "-a" is specified + -m) + eval $optargcmd + MACHINE=$OPTARG + [ "$opt_a" != "yes" ] && getarch + ;; + + -n) + runcmd=echo + ;; + + -O) + eval $optargcmd; resolvepath + MAKEOBJDIR="\${.CURDIR:C,^$TOP,$OPTARG,}" + export MAKEOBJDIR + makeobjdir=$OPTARG + makeenv="$makeenv MAKEOBJDIR" + ;; + + -o) + MKOBJDIRS=no + ;; + + -R) + eval $optargcmd; resolvepath + RELEASEDIR=$OPTARG + export RELEASEDIR + makeenv="$makeenv RELEASEDIR" + ;; + + -r) + do_removedirs=true + do_rebuildmake=true + ;; + + -T) + eval $optargcmd; resolvepath + TOOLDIR="$OPTARG" + export TOOLDIR + ;; + + -t) + usage "'-t' has been replaced by 'tools'" + ;; + + -U) + UNPRIVED=yes + export UNPRIVED + makeenv="$makeenv UNPRIVED" + ;; + + -u) + UPDATE=yes + export UPDATE + makeenv="$makeenv UPDATE" + ;; + + -V) + eval $optargcmd + case "${OPTARG}" in + # XXX: consider restricting which variables can be changed? + [a-zA-Z_][a-zA-Z_0-9]*=*) + var=${OPTARG%%=*} + value=${OPTARG#*=} + eval "${var}=\"${value}\"; export ${var}" + makeenv="$makeenv ${var}" + ;; + *) + usage "-V argument must be of the form 'var=[value]'" + ;; + esac + ;; + + -w) + eval $optargcmd; resolvepath + makewrapper="$OPTARG" + ;; + + --) + break + ;; + + -'?'|-h) + usage + ;; + esac - ;; - - -w) eval $optargcmd; resolvepath - makewrapper="$OPTARG";; - - --) break;; - -'?'|-h) usage;; - esac -done - -# Set up MACHINE*. On a NetBSD host, these are allowed to be unset. -if [ -z "$MACHINE" ]; then - if [ "${uname_s}" != "NetBSD" ]; then - echo "MACHINE must be set, or -m must be used, for cross builds." - echo ""; usage - fi - MACHINE=${uname_m} -fi -[ -n "$MACHINE_ARCH" ] || getarch -validatearch - -# Set up default make(1) environment. -makeenv="$makeenv TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS" -if [ ! -z "$BUILDID" ]; then - makeenv="$makeenv BUILDID" -fi -MAKEFLAGS="-m $TOP/share/mk $MAKEFLAGS MKOBJDIRS=${MKOBJDIRS-yes}" -export MAKEFLAGS MACHINE MACHINE_ARCH - -# Test make source file timestamps against installed nbmake binary, -# if TOOLDIR is pre-set. -# -# Note that we do NOT try to grovel "mk.conf" here to find out if TOOLDIR -# is set there, because it can contain make variable expansions and other -# stuff only parseable *after* we have a working nbmake. So this logic -# can only work if the user has pre-set TOOLDIR in the environment or -# used the -T option to build.sh. -# -make="${TOOLDIR-nonexistent}/bin/nbmake" -if [ -x $make ]; then - for f in usr.bin/make/*.[ch] usr.bin/make/lst.lib/*.[ch]; do - if [ $f -nt $make ]; then - do_rebuildmake=true; break - fi done -else - do_rebuildmake=true -fi -# Build bootstrap nbmake if needed. -if $do_rebuildmake; then - $runcmd echo "===> Bootstrapping nbmake" - tmpdir="${TMPDIR-/tmp}/nbbuild$$" + # Validate operations. + # + eval $optremcmd + while [ $# -gt 0 ]; do + op=$1; shift + operations="$operations $op" - $runcmd mkdir "$tmpdir" || bomb "cannot mkdir: $tmpdir" - trap "cd /; rm -r -f \"$tmpdir\"" 0 - $runcmd cd "$tmpdir" + case "$op" in - $runcmd env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \ - CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \ - "$TOP/tools/make/configure" \ - || bomb "configure of nbmake failed" - $runcmd sh buildmake.sh || bomb "build of nbmake failed" + tools|obj|build|distribution|release) + ;; - make="$tmpdir/nbmake" - $runcmd cd "$TOP" - $runcmd rm -f usr.bin/make/*.o usr.bin/make/lst.lib/*.o -fi + kernel=*) + arg=${op#*=} + op=${op%%=*} + if [ "${arg}" = "" ]; then + bomb "Must supply a kernel name with \`kernel=...'" + fi + ;; -if [ "$runcmd" = "echo" ]; then - TOOLCHAIN_MISSING=no - EXTERNAL_TOOLCHAIN="" -else - TOOLCHAIN_MISSING=$(getmakevar TOOLCHAIN_MISSING) - EXTERNAL_TOOLCHAIN=$(getmakevar EXTERNAL_TOOLCHAIN) -fi -if [ "${TOOLCHAIN_MISSING}" = "yes" -a \ - "${EXTERNAL_TOOLCHAIN}" = "" ]; then - echo "ERROR: build.sh (in-tree cross-toolchain) is not yet available for" - echo - echo "MACHINE: ${MACHINE}" - echo "MACHINE_ARCH: ${MACHINE_ARCH}" - echo - echo "All builds for this platform should be done via a traditional make" - echo - echo "If you wish to use an external cross-toolchain, set" - echo - echo "EXTERNAL_TOOLCHAIN=" - echo - echo "in either the environment or mk.conf and rerun" - echo - echo "$0 $*" - exit 1 -fi + install=*) + arg=${op#*=} + op=${op%%=*} + if [ "${arg}" = "" ]; then + bomb "Must supply a directory with \`install=...'" + fi + if [ "${arg}" = "/" ] && \ + ( [ "${uname_s}" != "NetBSD" ] || \ + [ "${uname_m}" != "$MACHINE" ] ); then + bomb "'install=${arg}' must != / for cross builds." + fi + ;; -# If TOOLDIR isn't already set, make objdirs in "tools" in case the -# default setting from is used. -if [ -z "$TOOLDIR" ] && [ "$MKOBJDIRS" != "no" ]; then - $runcmd cd tools - $runcmd $make -m ${TOP}/share/mk obj NOSUBDIR= \ - || bomb "make obj failed in tools" - $runcmd cd "$TOP" -fi + *) + usage "Unknown operation \`${op}'" + ;; -# -# If setting -M or -O to root an obj dir make sure the base directory is made -# before continuing as bsd.own.mk will need this to pick up _SRC_TOP_OBJ_ -# -if [ "$MKOBJDIRS" != "no" ] && [ ! -z "$makeobjdir" ]; then - $runcmd mkdir -p "$makeobjdir" -fi - -# Find DESTDIR and TOOLDIR. -DESTDIR=$(safe_getmakevar DESTDIR) -$runcmd echo "===> DESTDIR path: $DESTDIR" -TOOLDIR=$(safe_getmakevar TOOLDIR) -$runcmd echo "===> TOOLDIR path: $TOOLDIR" -export DESTDIR TOOLDIR - -# Check validity of TOOLDIR and DESTDIR. -if [ -z "$TOOLDIR" ] || [ "$TOOLDIR" = "/" ]; then - bomb "TOOLDIR '$TOOLDIR' invalid" -fi -removedirs="$TOOLDIR" - -if [ -z "$DESTDIR" ] || [ "$DESTDIR" = "/" ]; then - if $do_buildsystem; then - if [ "$buildtarget" != "build" ] || \ - [ "${uname_s}" != "NetBSD" ] || \ - [ "${uname_m}" != "$MACHINE" ]; then - bomb "DESTDIR must be set to a non-root path for cross builds or -d or -R." - fi - if ! $expert_mode; then - bomb "DESTDIR must be set to a non-root path for non -E (expert) builds" - fi - $runcmd echo "===> WARNING: Building to /, in expert mode." - $runcmd echo "===> This may cause your system to break! Reasons include:" - $runcmd echo "===> - your kernel is not up to date" - $runcmd echo "===> - the libraries or toolchain have changed" - $runcmd echo "===> YOU HAVE BEEN WARNED!" - fi -else - removedirs="$removedirs $DESTDIR" -fi - -if [ "$installworlddir" = "/" ]; then - if [ "${uname_s}" != "NetBSD" ] || \ - [ "${uname_m}" != "$MACHINE" ]; then - bomb "-i installworlddir must be set to a non-root path for cross builds." - fi -fi - -# Remove the target directories. -if $do_removedirs; then - for f in $removedirs; do - $runcmd echo "===> Removing $f" - $runcmd rm -r -f $f + esac + eval do_$op=true done -fi -# Recreate $TOOLDIR. -$runcmd mkdir -p "$TOOLDIR/bin" || bomb "mkdir of '$TOOLDIR/bin' failed" + # Set up MACHINE*. On a NetBSD host, these are allowed to be unset. + # + if [ -z "$MACHINE" ]; then + if [ "${uname_s}" != "NetBSD" ]; then + bomb "MACHINE must be set, or -m must be used, for cross builds." + fi + MACHINE=${uname_m} + fi + [ -n "$MACHINE_ARCH" ] || getarch + validatearch -# Install nbmake if it was built. -if $do_rebuildmake; then - $runcmd rm -f "$TOOLDIR/bin/nbmake" - $runcmd cp $make "$TOOLDIR/bin/nbmake" \ - || bomb "failed to install \$TOOLDIR/bin/nbmake" - make="$TOOLDIR/bin/nbmake" - $runcmd rm -r -f "$tmpdir" - trap 0 -fi - -# Build a nbmake wrapper script, usable by hand as well as by build.sh. -if [ -z "$makewrapper" ]; then - makewrapper="$TOOLDIR/bin/nbmake-$MACHINE" + # Set up default make(1) environment. + # + makeenv="$makeenv TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS" if [ ! -z "$BUILDID" ]; then - makewrapper="$makewrapper-$BUILDID" + makeenv="$makeenv BUILDID" fi -fi + MAKEFLAGS="-m $TOP/share/mk $MAKEFLAGS MKOBJDIRS=${MKOBJDIRS-yes}" + export MAKEFLAGS MACHINE MACHINE_ARCH +} -$runcmd rm -f "$makewrapper" -if [ "$runcmd" = "echo" ]; then - echo 'cat <'$makewrapper - makewrapout= -else - makewrapout=">>\$makewrapper" -fi +rebuildmake() +{ + # Test make source file timestamps against installed ${toolprefix}make + # binary, if TOOLDIR is pre-set. + # + # Note that we do NOT try to grovel "mk.conf" here to find out if + # TOOLDIR is set there, because it can contain make variable + # expansions and other stuff only parseable *after* we have a working + # ${toolprefix}make. So this logic can only work if the user has + # pre-set TOOLDIR in the environment or used the -T option to build.sh. + # + make="${TOOLDIR-nonexistent}/bin/${toolprefix}make" + if [ -x $make ]; then + for f in usr.bin/make/*.[ch] usr.bin/make/lst.lib/*.[ch]; do + if [ $f -nt $make ]; then + do_rebuildmake=true + break + fi + done + else + do_rebuildmake=true + fi -eval cat < Bootstrapping ${toolprefix}make" + tmpdir="${TMPDIR-/tmp}/nbbuild$$" + + $runcmd mkdir "$tmpdir" || bomb "cannot mkdir: $tmpdir" + trap "cd /; rm -r -f \"$tmpdir\"" 0 + $runcmd cd "$tmpdir" + + $runcmd env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \ + CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \ + "$TOP/tools/make/configure" || + bomb "configure of ${toolprefix}make failed" + $runcmd sh buildmake.sh || + bomb "build of ${toolprefix}make failed" + + make="$tmpdir/${toolprefix}make" + $runcmd cd "$TOP" + $runcmd rm -f usr.bin/make/*.o usr.bin/make/lst.lib/*.o + fi +} + +validatemakeparams() +{ + if [ "$runcmd" = "echo" ]; then + TOOLCHAIN_MISSING=no + EXTERNAL_TOOLCHAIN="" + else + TOOLCHAIN_MISSING=$(getmakevar TOOLCHAIN_MISSING) + EXTERNAL_TOOLCHAIN=$(getmakevar EXTERNAL_TOOLCHAIN) + fi + if [ "${TOOLCHAIN_MISSING}" = "yes" ] && \ + [ "${EXTERNAL_TOOLCHAIN}" = "" ]; then + $runcmd echo "ERROR: build.sh (in-tree cross-toolchain) is not yet available for" + $runcmd echo " MACHINE: ${MACHINE}" + $runcmd echo " MACHINE_ARCH: ${MACHINE_ARCH}" + $runcmd echo "" + $runcmd echo "All builds for this platform should be done via a traditional make" + $runcmd echo "If you wish to use an external cross-toolchain, set" + $runcmd echo " EXTERNAL_TOOLCHAIN=" + $runcmd echo "in either the environment or mk.conf and rerun" + $runcmd echo " $progname $*" + exit 1 + fi + + # If TOOLDIR isn't already set, make objdirs in "tools" in case the + # default setting from is used. + # + if [ -z "$TOOLDIR" ] && [ "$MKOBJDIRS" != "no" ]; then + $runcmd cd tools + $runcmd $make -m ${TOP}/share/mk obj NOSUBDIR= || + bomb "make obj failed in tools" + $runcmd cd "$TOP" + fi + + # If setting -M or -O to root an obj dir make sure the base directory + # is made before continuing as bsd.own.mk will need this to pick up + # _SRC_TOP_OBJ_ + # + if [ "$MKOBJDIRS" != "no" ] && [ ! -z "$makeobjdir" ]; then + $runcmd mkdir -p "$makeobjdir" + fi + + # Find DESTDIR and TOOLDIR. + # + DESTDIR=$(safe_getmakevar DESTDIR) + $runcmd echo "===> DESTDIR path: $DESTDIR" + TOOLDIR=$(safe_getmakevar TOOLDIR) + $runcmd echo "===> TOOLDIR path: $TOOLDIR" + export DESTDIR TOOLDIR + + # Check validity of TOOLDIR and DESTDIR. + # + if [ -z "$TOOLDIR" ] || [ "$TOOLDIR" = "/" ]; then + bomb "TOOLDIR '$TOOLDIR' invalid" + fi + removedirs="$TOOLDIR" + + if [ -z "$DESTDIR" ] || [ "$DESTDIR" = "/" ]; then + if $do_build || $do_distribution || $do_release; then + if ! $do_build || \ + [ "${uname_s}" != "NetBSD" ] || \ + [ "${uname_m}" != "$MACHINE" ]; then + bomb "DESTDIR must != / for cross builds, or ${progname} 'distribution' or 'release'." + fi + if ! $do_expertmode; then + bomb "DESTDIR must != / for non -E (expert) builds" + fi + $runcmd echo "===> WARNING: Building to /, in expert mode." + $runcmd echo "===> This may cause your system to break! Reasons include:" + $runcmd echo "===> - your kernel is not up to date" + $runcmd echo "===> - the libraries or toolchain have changed" + $runcmd echo "===> YOU HAVE BEEN WARNED!" + fi + else + removedirs="$removedirs $DESTDIR" + fi +} + + +createmakewrapper() +{ + # Remove the target directories. + # + if $do_removedirs; then + for f in $removedirs; do + $runcmd echo "===> Removing $f" + $runcmd rm -r -f $f + done + fi + + # Recreate $TOOLDIR. + # + $runcmd mkdir -p "$TOOLDIR/bin" || bomb "mkdir of '$TOOLDIR/bin' failed" + + # Install ${toolprefix}make if it was built. + # + if $do_rebuildmake; then + $runcmd rm -f "$TOOLDIR/bin/${toolprefix}make" + $runcmd cp $make "$TOOLDIR/bin/${toolprefix}make" || + bomb "failed to install \$TOOLDIR/bin/${toolprefix}make" + make="$TOOLDIR/bin/${toolprefix}make" + $runcmd echo "===> Created ${make}" + $runcmd rm -r -f "$tmpdir" + trap 0 + fi + + # Build a ${toolprefix}make wrapper script, usable by hand as + # well as by build.sh. + # + if [ -z "$makewrapper" ]; then + makewrapper="$TOOLDIR/bin/${toolprefix}make-$MACHINE" + if [ ! -z "$BUILDID" ]; then + makewrapper="$makewrapper-$BUILDID" + fi + fi + + $runcmd rm -f "$makewrapper" + if [ "$runcmd" = "echo" ]; then + echo 'cat <'$makewrapper + makewrapout= + else + makewrapout=">>\$makewrapper" + fi + + eval cat < Updated ${makewrapper}" +} -if $do_buildsystem; then - # Build everything. - ${runcmd-exec} "$makewrapper" $parallel $buildtarget \ - || bomb "failed to make $buildtarget" -else - # One or more of do_buildtools and do_buildkernel - # might be set. Do them in the appropriate order. - if $do_buildtools; then - if [ "$MKOBJDIRS" != "no" ]; then - $runcmd "$makewrapper" $parallel obj-tools \ - || bomb "failed to make obj-tools" - fi - $runcmd cd tools - if [ "$UPDATE" = "" ]; then - $runcmd "$makewrapper" cleandir dependall install \ - || bomb "failed to make tools" - else - $runcmd "$makewrapper" dependall install \ - || bomb "failed to make tools" - fi +buildtools() +{ + if [ "$MKOBJDIRS" != "no" ]; then + $runcmd "$makewrapper" $parallel obj-tools || + bomb "failed to make obj-tools" fi - if $do_buildkernel; then - if ! $do_buildtools; then - # Building tools every time we build a kernel - # is clearly unnecessary. We could try to - # figure out whether rebuilding the tools is - # necessary this time, but it doesn't seem - # worth the trouble. Instead, we say it's the - # user's responsibility to rebuild the tools if - # necessary. - $runcmd echo "===> Building kernel" \ - "without building new tools" - fi - $runcmd echo "===> Building kernel ${kernconfname}" - if [ "$MKOBJDIRS" != "no" ] && [ ! -z "$makeobjdir" ]; then - # The correct value of KERNOBJDIR might - # depend on a prior "make obj" in - # ${KERNSRCDIR}/${KERNARCHDIR}/compile. - KERNSRCDIR="$(safe_getmakevar KERNSRCDIR)" - KERNARCHDIR="$(safe_getmakevar KERNARCHDIR)" - $runcmd cd "${KERNSRCDIR}/${KERNARCHDIR}/compile" - $runcmd "$makewrapper" obj \ - || bomb "failed to make obj in " \ - "${KERNSRCDIR}/${KERNARCHDIR}/compile" - $runcmd cd "$TOP" - fi - KERNCONFDIR="$(safe_getmakevar KERNCONFDIR)" - KERNOBJDIR="$(safe_getmakevar KERNOBJDIR)" - case "${kernconfname}" in - */*) - kernconfpath="${kernconfname}" - kernconfbase="$(basename "${kernconfname}")" - ;; - *) - kernconfpath="${KERNCONFDIR}/${kernconfname}" - kernconfbase="${kernconfname}" - ;; - esac - kernbuilddir="${KERNOBJDIR}/${kernconfbase}" - $runcmd echo "===> Kernel build directory: ${kernbuilddir}" - $runcmd mkdir -p "${kernbuilddir}" \ - || bomb "cannot mkdir: ${kernbuilddir}" - if [ "$UPDATE" = "" ]; then - $runcmd cd "${kernbuilddir}" - $runcmd "$makewrapper" cleandir \ - || bomb "make cleandir failed in " \ - "${kernbuilddir}" - $runcmd cd "$TOP" - fi - $runcmd "${TOOLDIR}/bin/nbconfig" \ - -b "${kernbuilddir}" \ - -s "${TOP}/sys" "${kernconfpath}" \ - || bomb "nbconfig failed for ${kernconfname}" + $runcmd cd tools + if [ "$UPDATE" = "" ]; then + cleandir=cleandir + else + cleandir= + fi + $runcmd "$makewrapper" ${cleandir} dependall install || + bomb "failed to make tools" +} + +buildkernel() +{ + kernconf="$1" + if ! $do_tools; then + # Building tools every time we build a kernel is clearly + # unnecessary. We could try to figure out whether rebuilding + # the tools is necessary this time, but it doesn't seem worth + # the trouble. Instead, we say it's the user's responsibility + # to rebuild the tools if necessary. + # + $runcmd echo "===> Building kernel without building new tools" + fi + $runcmd echo "===> Building kernel ${kernconf}" + if [ "$MKOBJDIRS" != "no" ] && [ ! -z "$makeobjdir" ]; then + # The correct value of KERNOBJDIR might + # depend on a prior "make obj" in + # ${KERNSRCDIR}/${KERNARCHDIR}/compile. + # + KERNSRCDIR="$(safe_getmakevar KERNSRCDIR)" + KERNARCHDIR="$(safe_getmakevar KERNARCHDIR)" + $runcmd cd "${KERNSRCDIR}/${KERNARCHDIR}/compile" + $runcmd "$makewrapper" obj || + bomb "failed to make obj in ${KERNSRCDIR}/${KERNARCHDIR}/compile" + $runcmd cd "$TOP" + fi + KERNCONFDIR="$(safe_getmakevar KERNCONFDIR)" + KERNOBJDIR="$(safe_getmakevar KERNOBJDIR)" + case "${kernconf}" in + */*) + kernconfpath="${kernconf}" + kernconfbase="$(basename "${kernconf}")" + ;; + *) + kernconfpath="${KERNCONFDIR}/${kernconf}" + kernconfbase="${kernconf}" + ;; + esac + kernbuilddir="${KERNOBJDIR}/${kernconfbase}" + $runcmd echo "===> Kernel build directory: ${kernbuilddir}" + $runcmd mkdir -p "${kernbuilddir}" || + bomb "cannot mkdir: ${kernbuilddir}" + if [ "$UPDATE" = "" ]; then $runcmd cd "${kernbuilddir}" - $runcmd "$makewrapper" depend \ - || bomb "make depend failed in ${kernbuilddir}" - $runcmd "$makewrapper" $parallel all \ - || bomb "make all failed in ${kernbuilddir}" - $runcmd echo "===> New kernel should be in ${kernbuilddir}" + $runcmd "$makewrapper" cleandir || + bomb "make cleandir failed in ${kernbuilddir}" + $runcmd cd "$TOP" fi -fi + $runcmd "${TOOLDIR}/bin/${toolprefix}config" -b "${kernbuilddir}" \ + -s "${TOP}/sys" "${kernconfpath}" || + bomb "${toolprefix}config failed for ${kernconf}" + $runcmd cd "${kernbuilddir}" + $runcmd "$makewrapper" depend || + bomb "make depend failed in ${kernbuilddir}" + $runcmd "$makewrapper" $parallel all || + bomb "make all failed in ${kernbuilddir}" + $runcmd echo "===> New kernel should be in:" + $runcmd echo " ${kernbuilddir}" +} -if [ -n "$installworlddir" ]; then - ${runcmd-exec} "$makewrapper" INSTALLWORLDDIR=${installworlddir} \ - installworld || bomb "failed to make installworld" -fi +installworld() +{ + dir="$1" + ${runcmd} "$makewrapper" INSTALLWORLDDIR="${dir}" installworld || + bomb "failed to make installworld to ${dir}" +} + + +main() +{ + initdefaults + parseoptions "$@" + rebuildmake + validatemakeparams + createmakewrapper + + # Perform the operations. + # + for op in $operations; do + case "$op" in + + tools) + buildtools + ;; + + obj|build|distribution|release) + ${runcmd} "$makewrapper" $parallel $op || + bomb "failed to make $op" + ;; + + kernel=*) + arg=${op#*=} + buildkernel "${arg}" + ;; + + install=*) + arg=${op#*=} + installworld "${arg}" + ;; + + *) + bomb "Unknown operation \`${op}'" + ;; + + esac + done +} + +main "$@" diff --git a/doc/BUILDING.mdoc b/doc/BUILDING.mdoc index cb1d83e209e9..04aee747c345 100644 --- a/doc/BUILDING.mdoc +++ b/doc/BUILDING.mdoc @@ -1,10 +1,10 @@ -.\" $NetBSD: BUILDING.mdoc,v 1.8 2003/01/04 12:55:33 lukem Exp $ +.\" $NetBSD: BUILDING.mdoc,v 1.9 2003/01/23 16:24:08 lukem Exp $ .\" -.\" Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. +.\" Copyright (c) 2001-2003 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" This code is derived from software contributed to The NetBSD Foundation -.\" by Todd Vierling. +.\" by Todd Vierling and Luke Mewburn. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions @@ -38,7 +38,7 @@ .\" NOTE: After changing this file, run "make build-docs" to generate the .\" proper plaintext versions, and check in all BUILDING.* files! .\" -.Dd January 4, 2003 +.Dd January 24, 2003 .Dt BUILDING 8 .Os NetBSD . @@ -95,7 +95,7 @@ build process. .Pp .Bd -ragged -offset indent .Em Note : -A couple host toolchain components are not yet available in the tools +A couple of host toolchain components are not yet available in the tools directory. Also, some tools use non-POSIX, non-ANSI C extensions and need to be standardized. @@ -754,7 +754,13 @@ will be built in the proper order. Do a .Dq make build , and then install a full distribution into -.Sy DESTDIR . +.Sy DESTDIR , +including files in +.Pa /dev , +.Pa /etc , +.Pa /root +and +.Pa /var . . .It Sy buildworld As per @@ -763,7 +769,6 @@ except that it ensures that .Sy DESTDIR is not the root directory. . -. .It Sy installworld Install the distribution from .Sy DESTDIR @@ -780,7 +785,8 @@ before performing this operation. . .It Sy release Do a -.Dq make build , +.Dq make distribution , +build kernels, distribution media, and install sets, and then package the system into a standard release layout as described by .Xr release 7 . This requires that @@ -829,10 +835,84 @@ process. In the list of options below, variables that are automatically set by .Sy build.sh are noted where applicable. +. .Pp -The following are available command line options that may be supplied to +The following operations are supported by .Sy build.sh : . +.Bl -tag -width "distribution" +. +.It Sy build +Build the system as per +.Dq make build . +This option implies the +.Sy obj +and +.Sy tools +operations. +. +.It Sy distribution +Build a full distribution as per +.Dq make distribution . +This option implies the +.Sy build +operation. +. +.It Sy release +Build a full release as per +.Dq make release . +This option implies the +.Sy distribution +operation. +. +.It Sy obj +Perform +.Dq make obj . +.It Sy tools +Build and install the host tools from +.Pa src/tools . +.It Sy kernel Ns = Ns Ar kconf +Build a new kernel. +The +.Ar kconf +argument is the name of a configuration file suitable +for use by +.Xr config 8 . +If +.Ar kconf +does not contain any +.Sq / +characters, the configuration file is expected to be found in the +.Sy KERNCONFDIR +directory, which is typically +.Sy sys/arch/MACHINE/conf . +The new kernel will be built in a subdirectory of +.Sy KERNOBJDIR , +which is typically +.Sy sys/arch/MACHINE/compile +or an associated object directory. +In order to ensure that the kernel is built using up-to-date tools, +it is strongly recommended that the tools be rebuilt (using the +.Sy tools +operation). +. +.It Sy install Ns = Ns Ar idir +Install the contents of +.Dv DESTDIR +to +.Ar idir , +using +.Dq make installworld . +. +.El +. +.Pp +The following command line options alter the behaviour of the above +operations: +The following command line options alter the behaviour of the +.Sy build.sh +operations described above: +. .Bl -tag -width "-T tools" . .It Fl a Ar arch @@ -851,34 +931,12 @@ This will also append the build idenfitier to the name of the wrapper script so that the resulting name is of the form .Dq Sy nbmake-MACHINE-BUILDID . . -.It Fl b -Bootstrap -.Dq make -and create a -.Sy nbmake-MACHINE -script (see below). -. .It Fl D Ar dest Set the value of .Sy DESTDIR to .Ar dest . . -.It Fl d -Build a full distribution. -This differs from a default build in that files will also be installed to -.Pa /dev , -.Pa /etc , -.Pa /root -and -.Pa /var . -Note this does not build a -.Dq release ; -no release sets are placed in ${RELEASEDIR}. -.Fl d -is implied by -.Fl R . -. .It Fl E Set .Sq expert @@ -886,15 +944,6 @@ mode; .Sy DESTDIR does not have to be set to a non-root path for builds when this is set. . -.It Fl i Ar installworlddir -Install the contents of -.Dv DESTDIR -to -.Ar installworlddir -after all other operations have completed, using the top level -.Dq installworld -target. -. .It Fl j Ar njob Passed through to .Xr make 1 . @@ -903,40 +952,6 @@ as necessary to enforce build ordering. If you see build failures with -j, please save complete build logs so the failures can be analyzed. . -.It Fl k Em kernel -Build a new kernel. -The -.Ar kernel -argument is the name of a configuration file suitable -for use by -.Xr config 8 . -If -.Ar kernel -does not contain any -.Sq / -characters, the configuration file is expected to be found in the -.Sy KERNCONFDIR -directory, which is typically -.Sy sys/arch/MACHINE/conf . -The new kernel will be built in a subdirectory of -.Sy KERNOBJDIR , -which is typically -.Sy sys/arch/MACHINE/compile -or an associated object directory. -In order to ensure that the kernel is built using up-to-date tools, -it is strongly recommended that the tools be rebuilt (using the -.Fl t -option) in a separate invocation of -.Nm build.sh -prior to using the -.Fl k -option, or that the -.Fl t -and -.Fl k -options be used together in a single invocation of -.Nm build.sh . -. .It Fl M Ar obj Set .Sy MAKEOBJDIRPREFIX @@ -989,12 +1004,6 @@ Set the value of .Sy RELEASEDIR to .Ar rel . -Setting this option will cause -.Sy build.sh -to run -.Dq make release -instead of -.Dq make build . . .It Fl r Remove the contents of @@ -1017,13 +1026,6 @@ will only be rebuilt as needed (when the source files for .Xr make 1 change). . -.It Fl t -Build and install the host tools from -.Pa src/tools -only. -This option implies -.Fl b . -. .It Fl U Set the .Sy UNPRIVED @@ -1094,22 +1096,41 @@ or called with an absolute path. . .Sh EXAMPLES .Bl -tag -width "build.sh" -.It Li "./build.sh -t" +. +.It Li "./build.sh tools" Build a new toolchain. +. .It Li "cd ${KERNCONFDIR} ; ${TOOLDIR}/bin/nbconfig GENERIC" Use the new version of .Xr config 8 to prepare to build a new GENERIC kernel. +. .It Li "cd ${KERNOBJDIR}/GENERIC ; ${TOOLDIR}/bin/nbmake-${MACHINE} dependall" Use the new toolchain to build a new GENERIC kernel. -.It Li "./build.sh -t -k GENERIC" +. +.It Li "./build.sh tools kernel=GENERIC" Build a new toolchain, and use the new toolchain to configure and build a new GENERIC kernel. -.It Li "./build.sh -U -d" +This is a simpler way to achieve what the first three examples do. +. +.It Li "./build.sh -U distribution" Using unprivileged mode, build a complete distribution in .Sy DESTDIR . -.It Li "./build.sh -U -R /some/dir/RELEASE" +. +.It Li "# ./build.sh -U installworld=/" +As root, install the distribution that was built with unprivileged mode from +.Sy DESTDIR +to +.Pa / . +(Even though this is run as root, +.Fl U +is required so that the permissions stored in +.Sy DESTDIR Ns Pa /METALOG +are correctly applied to the files as they're copied to +.Pa / ) . +. +.It Li "./build.sh -U -R /some/dir/RELEASE release" Using unprivileged mode, build a complete release in the specified release directory. .El