Module Name: src Committed By: lukem Date: Mon Aug 15 10:06:00 UTC 2022
Modified Files: src: build.sh Log Message: build.sh: improve help and usage Split help into synopsis and help. Only display the synopsis for usage errors (not the full help). Print usage errors to stderr not stdout. Don't print a usage error for -? before the help message. Improve error messages for unknown options and missing arguments. Remove trailing "." present in some error messages. Alway use 'quote' instead of `quote' in some error messages. To generate a diff of this commit: cvs rdiff -u -r1.362 -r1.363 src/build.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/build.sh diff -u src/build.sh:1.362 src/build.sh:1.363 --- src/build.sh:1.362 Sun Aug 14 08:51:41 2022 +++ src/build.sh Mon Aug 15 10:06:00 2022 @@ -1,5 +1,5 @@ #! /usr/bin/env sh -# $NetBSD: build.sh,v 1.362 2022/08/14 08:51:41 lukem Exp $ +# $NetBSD: build.sh,v 1.363 2022/08/15 10:06:00 lukem Exp $ # # Copyright (c) 2001-2022 The NetBSD Foundation, Inc. # All rights reserved. @@ -272,6 +272,7 @@ bomb() cat >&2 <<ERRORMESSAGE ERROR: $@ + *** BUILD ABORTED *** ERRORMESSAGE kill ${toppid} # in case we were invoked from a subshell @@ -429,21 +430,21 @@ set_HOST_SH() case "${HOST_SH}" in /*) : ;; - *) bomb "HOST_SH=\"${HOST_SH}\" is not an absolute path." + *) bomb "HOST_SH=\"${HOST_SH}\" is not an absolute path" ;; esac # If HOST_SH is not executable, bomb. # [ -x "${HOST_SH}" ] || - bomb "HOST_SH=\"${HOST_SH}\" is not executable." + bomb "HOST_SH=\"${HOST_SH}\" is not executable" # If HOST_SH fails tests, bomb. # ("$0" may be a path that is no longer valid, because we have # performed "cd $(dirname $0)", so don't use $0 here.) # "${HOST_SH}" build.sh --shelltest || - bomb "HOST_SH=\"${HOST_SH}\" failed functionality tests." + bomb "HOST_SH=\"${HOST_SH}\" failed functionality tests" } # initdefaults -- @@ -812,7 +813,7 @@ validatearch() case "${MACHINE_ARCH}" in "") - bomb "No MACHINE_ARCH provided. Use 'build.sh -m ${MACHINE} list-arch' to show options." + bomb "No MACHINE_ARCH provided. Use 'build.sh -m ${MACHINE} list-arch' to show options" ;; esac @@ -1021,19 +1022,28 @@ resolvepath() eval ${var}=\"\${val}\" } -# Display help to stdout. -# -help() +# Display synopsis to stdout. +synopsis() { cat <<_usage_ -Usage: ${progname} [-EhnoPRrUuxy] [-a arch] [-B buildid] [-C cdextras] +Usage: ${progname} [-EnoPRrUuxy] [-a arch] [-B buildid] [-C cdextras] [-c compiler] [-D dest] [-j njob] [-M obj] [-m mach] [-N noisy] [-O obj] [-R release] [-S seed] [-T tools] [-V var=[value]] [-w wrapper] [-X x11src] [-Y extsrcsrc] [-Z var] operation [...] + ${progname} ( -h | -? ) + +_usage_ +} +# Display help to stdout. +# +help() +{ + synopsis + cat <<_usage_ Build operations (all imply "obj" and "tools"): build Run "make build". distribution Run "make distribution" (includes DESTDIR/etc/ files). @@ -1047,14 +1057,14 @@ Usage: ${progname} [-EhnoPRrUuxy] [-a ar dtb Build devicetree blobs. obj Run "make obj". [Default unless -o is used] tools Build and install tools. - install=idir Run "make installworld" to \`idir' to install all sets - except \`etc'. Useful after "distribution" or "release" - kernel=conf Build kernel with config file \`conf' + install=idir Run "make installworld" to 'idir' to install all sets + except 'etc'. Useful after "distribution" or "release" + kernel=conf Build kernel with config file 'conf' kernel.gdb=conf Build kernel (including netbsd.gdb) with config - file \`conf' + file 'conf' releasekernel=conf Install kernel built by kernel=conf to RELEASEDIR. kernels Build all kernels - installmodules=idir Run "make installmodules" to \`idir' to install all + installmodules=idir Run "make installmodules" to 'idir' to install all kernel modules. modules Build kernel modules. rumptest Do a linktest for rump (for developers). @@ -1092,7 +1102,7 @@ Usage: ${progname} [-EhnoPRrUuxy] [-a ar -E Set "expert" mode; disables various safety checks. Should not be used without expert knowledge of the build system. - -h Print this help message. + -h Print this help message, and exit. -j njob Run up to njob jobs in parallel; see make(1) -j. -M obj Set obj root directory to obj; sets MAKEOBJDIRPREFIX. Unsets MAKEOBJDIR. @@ -1124,14 +1134,15 @@ Usage: ${progname} [-EhnoPRrUuxy] [-a ar install from an UNPRIVED build with proper file permissions. -u Set MKUPDATE=yes; do not run "make cleandir" first. Without this, everything is rebuilt, including the tools. - -V var=[value] Set variable \`var' to \`value'. + -V var=[value] Set variable 'var' to 'value'. -w wrapper Create ${toolprefix}make script as wrapper. [Default: \${TOOLDIR}/bin/${toolprefix}make-\${MACHINE}] -X x11src Set X11SRCDIR to x11src. [Default: /usr/xsrc] -x Set MKX11=yes; build X11 from X11SRCDIR -Y extsrcsrc Set EXTSRCSRCDIR to extsrcsrc. [Default: /usr/extsrc] -y Set MKEXTSRC=yes; build extsrc from EXTSRCSRCDIR - -Z var Unset ("zap") variable \`var'. + -Z var Unset ("zap") variable 'var'. + -? Print this help message, and exit. _usage_ } @@ -1141,10 +1152,10 @@ _usage_ usage() { if [ -n "$*" ]; then - echo "" - echo "${progname}: $*" + echo 1>&2 "" + echo 1>&2 "${progname}: $*" fi - help 1>&2 + synopsis 1>&2 exit 1 } @@ -1157,7 +1168,7 @@ parseoptions() if type getopts >/dev/null 2>&1; then # Use POSIX getopts. # - getoptcmd='getopts ${opts} opt && opt=-${opt}' + getoptcmd='getopts :${opts} opt && opt=-${opt}' optargcmd=':' optremcmd='shift $((${OPTIND} -1))' else @@ -1363,11 +1374,27 @@ parseoptions() break ;; - -'?'|-h) + -h) help exit 0 ;; + '-?') + if [ "${OPTARG}" = '?' ]; then + help + exit 0 + fi + usage "Unknown option -${OPTARG}" + ;; + + -:) + usage "Missing argument for option -${OPTARG}" + ;; + + *) + usage "Unimplemented option ${opt}" + ;; + esac done @@ -1399,14 +1426,14 @@ parseoptions() arg=${op#*=} op=${op%%=*} [ -n "${arg}" ] || - bomb "Must supply a kernel name with \`${op}=...'" + bomb "Must supply a kernel name with '${op}=...'" ;; disk-image=*) arg=${op#*=} op=disk_image [ -n "${arg}" ] || - bomb "Must supply a target name with \`${op}=...'" + bomb "Must supply a target name with '${op}=...'" ;; @@ -1414,7 +1441,7 @@ parseoptions() arg=${op#*=} op=${op%%=*} [ -n "${arg}" ] || - bomb "Must supply a directory with \`install=...'" + bomb "Must supply a directory with 'install=...'" ;; distsets) @@ -1447,7 +1474,7 @@ parseoptions() ;; *) - usage "Unknown operation \`${op}'" + usage "Unknown operation '${op}'" ;; esac @@ -1456,13 +1483,13 @@ parseoptions() op="$( echo "$op" | tr -s '.-' '__')" eval do_${op}=true done - [ -n "${operations}" ] || usage "Missing operation to perform." + [ -n "${operations}" ] || usage "Missing operation to perform" # Set up MACHINE*. On a NetBSD host, these are allowed to be unset. # if [ -z "${MACHINE}" ]; then [ "${uname_s}" = "NetBSD" ] || - bomb "MACHINE must be set, or -m must be used, for cross builds." + bomb "MACHINE must be set, or -m must be used, for cross builds" MACHINE=${uname_m} MACHINE_ARCH=${uname_p} fi @@ -1496,9 +1523,9 @@ sanitycheck() # if ${do_install} && [ "$id_u" -ne 0 ] ; then if ${do_expertmode}; then - warning "Will install as an unprivileged user." + warning "Will install as an unprivileged user" else - bomb "-E must be set for install as an unprivileged user." + bomb "-E must be set for install as an unprivileged user" fi fi @@ -1766,7 +1793,7 @@ validatemakeparams() if ! ${do_expertmode} && \ [ "$id_u" -ne 0 ] && \ [ "${MKUNPRIVED}" = "no" ] ; then - bomb "-U or -E must be set for build as an unprivileged user." + bomb "-U or -E must be set for build as an unprivileged user" fi if [ "${runcmd}" = "echo" ]; then @@ -1877,7 +1904,7 @@ validatemakeparams() if ${do_distribution} || ${do_release} || \ [ "${uname_s}" != "NetBSD" ] || \ [ "${uname_m}" != "${MACHINE}" ]; then - bomb "DESTDIR must != / for cross builds, or ${progname} 'distribution' or 'release'." + bomb "DESTDIR must != / for cross builds, or ${progname} 'distribution' or 'release'" fi if ! ${do_expertmode}; then bomb "DESTDIR must != / for non -E (expert) builds" @@ -1891,7 +1918,7 @@ validatemakeparams() removedirs="${removedirs} ${DESTDIR}" fi if ${do_releasekernel} && [ -z "${RELEASEDIR}" ]; then - bomb "Must set RELEASEDIR with \`releasekernel=...'" + bomb "Must set RELEASEDIR with 'releasekernel=...'" fi # If a previous build.sh run used -U (and therefore created a @@ -1907,9 +1934,9 @@ validatemakeparams() if [ -e "${DESTDIR}/METALOG" ] && \ [ "${MKUNPRIVED}" = "no" ] ; then if $do_expertmode; then - warning "A previous build.sh run specified -U." + warning "A previous build.sh run specified -U" else - bomb "A previous build.sh run specified -U; you must specify it again now." + bomb "A previous build.sh run specified -U; you must specify it again now" fi fi ;; @@ -1922,7 +1949,7 @@ validatemakeparams() # if ${do_release} && ( ${do_live_image} || ${do_install_image} ) && \ [ "${MKUNPRIVED}" = "no" ] ; then - bomb "-U must be specified on building release to create images later." + bomb "-U must be specified on building release to create images later" fi } @@ -1991,7 +2018,7 @@ createmakewrapper() eval cat <<EOF ${makewrapout} #! ${HOST_SH} # Set proper variables to allow easy "make" building of a NetBSD subtree. -# Generated from: \$NetBSD: build.sh,v 1.362 2022/08/14 08:51:41 lukem Exp $ +# Generated from: \$NetBSD: build.sh,v 1.363 2022/08/15 10:06:00 lukem Exp $ # with these arguments: ${_args} # @@ -2120,7 +2147,7 @@ buildkernel() make_in_dir "${kernelbuildpath}" cleandir fi [ -x "${TOOLDIR}/bin/${toolprefix}config" ] \ - || bomb "${TOOLDIR}/bin/${toolprefix}config does not exist. You need to \"$0 tools\" first." + || bomb "${TOOLDIR}/bin/${toolprefix}config does not exist. You need to \"$0 tools\" first" CONFIGOPTS=$(getmakevar CONFIGOPTS) ${runcmd} "${TOOLDIR}/bin/${toolprefix}config" ${CONFIGOPTS} \ -b "${kernelbuildpath}" -s "${TOP}/sys" ${configopts} \ @@ -2264,7 +2291,7 @@ dorump() make_in_dir "${NETBSDSRCDIR}/sys/rump" obj fi ${runcmd} "${makewrapper}" ${parallel} do-distrib-dirs \ - || bomb 'could not create distrib-dirs' + || bomb "Could not create distrib-dirs" [ "${MKUPDATE}" = "no" ] && doclean="cleandir" targlist="${doclean} ${doobjs} dependall install" @@ -2464,7 +2491,7 @@ main() # built with UNPRIVED. Assume UNPRIVED build has been # performed if METALOG file is created in DESTDIR. if [ ! -e "${DESTDIR}/METALOG" ] ; then - bomb "The release binaries must have been built with -U to create images." + bomb "The release binaries must have been built with -U to create images" fi ${runcmd} "${makewrapper}" ${parallel} ${op} || bomb "Failed to make ${op}" @@ -2506,7 +2533,7 @@ main() if [ "${arg}" = "/" ] && \ ( [ "${uname_s}" != "NetBSD" ] || \ [ "${uname_m}" != "${MACHINE}" ] ); then - bomb "'${op}' must != / for cross builds." + bomb "'${op}' must != / for cross builds" fi installmodules "${arg}" ;; @@ -2516,7 +2543,7 @@ main() if [ "${arg}" = "/" ] && \ ( [ "${uname_s}" != "NetBSD" ] || \ [ "${uname_m}" != "${MACHINE}" ] ); then - bomb "'${op}' must != / for cross builds." + bomb "'${op}' must != / for cross builds" fi installworld "${arg}" ;; @@ -2536,7 +2563,7 @@ main() ;; *) - bomb "Unknown operation \`${op}'" + bomb "Unknown operation '${op}'" ;; esac