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