Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/build.sh,v rcsdiff: /ftp/cvs/cvsroot/src/build.sh,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.255.2.3 retrieving revision 1.255.2.4 diff -u -p -r1.255.2.3 -r1.255.2.4 --- src/build.sh 2013/06/23 06:26:12 1.255.2.3 +++ src/build.sh 2014/08/19 23:45:10 1.255.2.4 @@ -1,5 +1,5 @@ #! /usr/bin/env sh -# $NetBSD: build.sh,v 1.255.2.3 2013/06/23 06:26:12 tls Exp $ +# $NetBSD: build.sh,v 1.255.2.4 2014/08/19 23:45:10 tls Exp $ # # Copyright (c) 2001-2011 The NetBSD Foundation, Inc. # All rights reserved. @@ -278,6 +278,51 @@ ERRORMESSAGE exit 1 } +# Quote args to make them safe in the shell. +# Usage: quotedlist="$(shell_quote args...)" +# +# After building up a quoted list, use it by evaling it inside +# double quotes, like this: +# eval "set -- $quotedlist" +# or like this: +# eval "\$command $quotedlist \$filename" +# +shell_quote() +{( + local result='' + local arg qarg + LC_COLLATE=C ; export LC_COLLATE # so [a-zA-Z0-9] works in ASCII + for arg in "$@" ; do + case "${arg}" in + '') + qarg="''" + ;; + *[!-./a-zA-Z0-9]*) + # Convert each embedded ' to '\'', + # then insert ' at the beginning of the first line, + # and append ' at the end of the last line. + # Finally, elide unnecessary '' pairs at the + # beginning and end of the result and as part of + # '\'''\'' sequences that result from multiple + # adjacent quotes in he input. + qarg="$(printf "%s\n" "$arg" | \ + ${SED:-sed} -e "s/'/'\\\\''/g" \ + -e "1s/^/'/" -e "\$s/\$/'/" \ + -e "1s/^''//" -e "\$s/''\$//" \ + -e "s/'''/'/g" + )" + ;; + *) + # Arg is not the empty string, and does not contain + # any unsafe characters. Leave it unchanged for + # readability. + qarg="${arg}" + ;; + esac + result="${result}${result:+ }${qarg}" + done + printf "%s\n" "$result" +)} statusmsg() { @@ -579,20 +624,35 @@ MACHINE=arc MACHINE_ARCH=mips64el ALIAS MACHINE=arc MACHINE_ARCH=mipsel DEFAULT MACHINE=atari MACHINE_ARCH=m68k MACHINE=bebox MACHINE_ARCH=powerpc -MACHINE=cats MACHINE_ARCH=arm DEFAULT -MACHINE=cats MACHINE_ARCH=earm +MACHINE=cats MACHINE_ARCH=arm ALIAS=ocats +MACHINE=cats MACHINE_ARCH=earmv4 ALIAS=ecats DEFAULT MACHINE=cesfic MACHINE_ARCH=m68k MACHINE=cobalt MACHINE_ARCH=mips64el ALIAS=cobalt64 MACHINE=cobalt MACHINE_ARCH=mipsel DEFAULT MACHINE=dreamcast MACHINE_ARCH=sh3el MACHINE=emips MACHINE_ARCH=mipseb MACHINE=epoc32 MACHINE_ARCH=arm -MACHINE=evbarm MACHINE_ARCH=arm ALIAS=evbarm-el DEFAULT -MACHINE=evbarm MACHINE_ARCH=armeb ALIAS=evbarm-eb -MACHINE=evbarm MACHINE_ARCH=earm ALIAS=evbearm-el +MACHINE=evbarm MACHINE_ARCH=arm ALIAS=evboarm-el +MACHINE=evbarm MACHINE_ARCH=armeb ALIAS=evboarm-eb +MACHINE=evbarm MACHINE_ARCH=earm ALIAS=evbearm-el DEFAULT MACHINE=evbarm MACHINE_ARCH=earmeb ALIAS=evbearm-eb MACHINE=evbarm MACHINE_ARCH=earmhf ALIAS=evbearmhf-el MACHINE=evbarm MACHINE_ARCH=earmhfeb ALIAS=evbearmhf-eb +MACHINE=evbarm MACHINE_ARCH=earmv4 ALIAS=evbearmv4-el +MACHINE=evbarm MACHINE_ARCH=earmv4eb ALIAS=evbearmv4-eb +MACHINE=evbarm MACHINE_ARCH=earmv5 ALIAS=evbearmv5-el +MACHINE=evbarm MACHINE_ARCH=earmv5eb ALIAS=evbearmv5-eb +MACHINE=evbarm MACHINE_ARCH=earmv6 ALIAS=evbearmv6-el +MACHINE=evbarm MACHINE_ARCH=earmv6hf ALIAS=evbearmv6hf-el +MACHINE=evbarm MACHINE_ARCH=earmv6eb ALIAS=evbearmv6-eb +MACHINE=evbarm MACHINE_ARCH=earmv6hfeb ALIAS=evbearmv6hf-eb +MACHINE=evbarm MACHINE_ARCH=earmv7 ALIAS=evbearmv7-el +MACHINE=evbarm MACHINE_ARCH=earmv7eb ALIAS=evbearmv7-eb +MACHINE=evbarm MACHINE_ARCH=earmv7hf ALIAS=evbearmv7hf-el +MACHINE=evbarm MACHINE_ARCH=earmv7hfeb ALIAS=evbearmv7hf-eb +MACHINE=evbarm64 MACHINE_ARCH=aarch64 ALIAS=evbarm64-el +MACHINE=evbarm64 MACHINE_ARCH=aarch64eb ALIAS=evbarm64-eb +MACHINE=evbcf MACHINE_ARCH=coldfire MACHINE=evbmips MACHINE_ARCH= NO_DEFAULT MACHINE=evbmips MACHINE_ARCH=mips64eb ALIAS=evbmips64-eb MACHINE=evbmips MACHINE_ARCH=mips64el ALIAS=evbmips64-el @@ -605,15 +665,16 @@ MACHINE=evbsh3 MACHINE_ARCH=sh3eb ALIAS MACHINE=evbsh3 MACHINE_ARCH=sh3el ALIAS=evbsh3-el MACHINE=ews4800mips MACHINE_ARCH=mipseb MACHINE=hp300 MACHINE_ARCH=m68k -MACHINE=hp700 MACHINE_ARCH=hppa -MACHINE=hpcarm MACHINE_ARCH=arm +MACHINE=hppa MACHINE_ARCH=hppa +MACHINE=hpcarm MACHINE_ARCH=arm ALIAS=hpcoarm +MACHINE=hpcarm MACHINE_ARCH=earmv4 ALIAS=hpcearm DEFAULT MACHINE=hpcmips MACHINE_ARCH=mipsel MACHINE=hpcsh MACHINE_ARCH=sh3el MACHINE=i386 MACHINE_ARCH=i386 MACHINE=ia64 MACHINE_ARCH=ia64 MACHINE=ibmnws MACHINE_ARCH=powerpc -MACHINE=iyonix MACHINE_ARCH=arm DEFAULT -MACHINE=iyonix MACHINE_ARCH=earm +MACHINE=iyonix MACHINE_ARCH=arm ALIAS=oiyonix +MACHINE=iyonix MACHINE_ARCH=earm ALIAS=eiyonix DEFAULT MACHINE=landisk MACHINE_ARCH=sh3el MACHINE=luna68k MACHINE_ARCH=m68k MACHINE=mac68k MACHINE_ARCH=m68k @@ -623,13 +684,14 @@ MACHINE=mipsco MACHINE_ARCH=mipseb MACHINE=mmeye MACHINE_ARCH=sh3eb MACHINE=mvme68k MACHINE_ARCH=m68k MACHINE=mvmeppc MACHINE_ARCH=powerpc -MACHINE=netwinder MACHINE_ARCH=arm DEFAULT -MACHINE=netwinder MACHINE_ARCH=earm +MACHINE=netwinder MACHINE_ARCH=arm ALIAS=onetwinder +MACHINE=netwinder MACHINE_ARCH=earmv4 ALIAS=enetwinder DEFAULT MACHINE=news68k MACHINE_ARCH=m68k MACHINE=newsmips MACHINE_ARCH=mipseb MACHINE=next68k MACHINE_ARCH=m68k MACHINE=ofppc MACHINE_ARCH=powerpc DEFAULT MACHINE=ofppc MACHINE_ARCH=powerpc64 ALIAS=ofppc64 +MACHINE=playstation2 MACHINE_ARCH=mipsel MACHINE=pmax MACHINE_ARCH=mips64el ALIAS=pmax64 MACHINE=pmax MACHINE_ARCH=mipsel DEFAULT MACHINE=prep MACHINE_ARCH=powerpc @@ -642,22 +704,23 @@ MACHINE=sbmips MACHINE_ARCH=mipseb ALIA MACHINE=sbmips MACHINE_ARCH=mipsel ALIAS=sbmips-el MACHINE=sgimips MACHINE_ARCH=mips64eb ALIAS=sgimips64 MACHINE=sgimips MACHINE_ARCH=mipseb DEFAULT -MACHINE=shark MACHINE_ARCH=arm DEFAULT -MACHINE=shark MACHINE_ARCH=earm +MACHINE=shark MACHINE_ARCH=arm ALIAS=oshark +MACHINE=shark MACHINE_ARCH=earmv4 ALIAS=eshark DEFAULT MACHINE=sparc MACHINE_ARCH=sparc MACHINE=sparc64 MACHINE_ARCH=sparc64 MACHINE=sun2 MACHINE_ARCH=m68000 MACHINE=sun3 MACHINE_ARCH=m68k MACHINE=vax MACHINE_ARCH=vax MACHINE=x68k MACHINE_ARCH=m68k -MACHINE=zaurus MACHINE_ARCH=arm DEFAULT -MACHINE=zaurus MACHINE_ARCH=earm +MACHINE=zaurus MACHINE_ARCH=arm ALIAS=ozaurus +MACHINE=zaurus MACHINE_ARCH=earm ALIAS=ezaurus DEFAULT ' # getarch -- find the default MACHINE_ARCH for a MACHINE, # or convert an alias to a MACHINE/MACHINE_ARCH pair. # -# Saves MACHINE in makewrappermachine before possibly modifying MACHINE. +# Saves the original value of MACHINE in makewrappermachine before +# alias processing. # # Sets MACHINE and MACHINE_ARCH if the input MACHINE value is # recognised as an alias, or recognised as a machine that has a default @@ -680,7 +743,7 @@ getarch() line="${line%%#*}" # ignore comments line="$( IFS=" ${tab}" ; echo $line )" # normalise white space case "${line} " in - "") + " ") # skip blank lines or comment lines continue ;; @@ -706,7 +769,7 @@ getarch() # remember that there was more than one match. case "$found" in '') found="$line" ;; - *) found="MULTIPLE_MATCHES" ; break ;; + *) found="MULTIPLE_MATCHES" ;; esac ;; esac @@ -755,7 +818,7 @@ validatearch() line="${line%%#*}" # ignore comments line="$( IFS=" ${tab}" ; echo $line )" # normalise white space case "${line} " in - "") + " ") # skip blank lines or comment lines continue ;; @@ -787,6 +850,57 @@ validatearch() esac } +# listarch -- list valid MACHINE/MACHINE_ARCH/ALIAS values, +# optionally restricted to those where the MACHINE and/or MACHINE_ARCH +# match specifed glob patterns. +# +listarch() +{ + local machglob="$1" archglob="$2" + local IFS + local wildcard="*" + local line xline frag + local line_matches_machine line_matches_arch + local found=false + + # Empty machglob or archglob should match anything + : "${machglob:=${wildcard}}" + : "${archglob:=${wildcard}}" + + IFS="${nl}" + for line in ${valid_MACHINE_ARCH}; do + line="${line%%#*}" # ignore comments + xline="$( IFS=" ${tab}" ; echo $line )" # normalise white space + [ -z "${xline}" ] && continue # skip blank or comment lines + + line_matches_machine=false + line_matches_arch=false + + IFS=" " + for frag in ${xline}; do + case "${frag}" in + MACHINE=${machglob}) + line_matches_machine=true ;; + ALIAS=${machglob}) + line_matches_machine=true ;; + MACHINE_ARCH=${archglob}) + line_matches_arch=true ;; + esac + done + + if $line_matches_machine && $line_matches_arch; then + found=true + echo "$line" + fi + done + if ! $found; then + echo >&2 "No match for" \ + "MACHINE=${machglob} MACHINE_ARCH=${archglob}" + return 1 + fi + return 0 +} + # nobomb_getmakevar -- # Given the name of a make variable in $1, print make's idea of the # value of that variable, or return 1 if there's an error. @@ -907,6 +1021,8 @@ Usage: ${progname} [-EhnorUuxy] [-a arch 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' releasekernel=conf Install kernel built by kernel=conf to RELEASEDIR. installmodules=idir Run "make installmodules" to \`idir' to install all kernel modules. @@ -927,6 +1043,9 @@ Usage: ${progname} [-EhnorUuxy] [-a arch disk-image=target Creae bootable disk image in RELEASEDIR/RELEASEMACHINEDIR/binary/gzimg/target.img.gz. params Display various make(1) parameters. + list-arch Display a list of valid MACHINE/MACHINE_ARCH values, + and exit. The list may be narrowed by passing glob + patterns or exact values in MACHINE or MACHINE_ARCH. Options: -a arch Set MACHINE_ARCH to arch. [Default: deduced from MACHINE] @@ -939,7 +1058,10 @@ Usage: ${progname} [-EhnorUuxy] [-a arch -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. - -m mach Set MACHINE to mach; not required if NetBSD native. + -m mach Set MACHINE to mach. Some mach values are actually + aliases that set MACHINE/MACHINE_ARCH pairs. + [Default: deduced from the host system if the host + OS is NetBSD] -N noisy Set the noisyness (MAKEVERBOSE) level of the build: 0 Minimal output ("quiet") 1 Describe what is occurring @@ -977,7 +1099,7 @@ _usage_ parseoptions() { opts='a:B:C:D:Ehj:M:m:N:nO:oR:rS:T:UuV:w:X:xY:yZ:' - opt_a=no + opt_a=false if type getopts >/dev/null 2>&1; then # Use POSIX getopts. @@ -1008,7 +1130,7 @@ parseoptions() -a) eval ${optargcmd} MACHINE_ARCH=${OPTARG} - opt_a=yes + opt_a=true ;; -B) @@ -1055,7 +1177,6 @@ parseoptions() -m) eval ${optargcmd} MACHINE="${OPTARG}" - [ "${opt_a}" != "yes" ] && getarch ;; -N) @@ -1186,6 +1307,11 @@ parseoptions() usage ;; + list-arch) + listarch "${MACHINE}" "${MACHINE_ARCH}" + exit $? + ;; + makewrapper|cleandir|obj|tools|build|distribution|release|sets|sourcesets|syspkgs|params) ;; @@ -1205,7 +1331,7 @@ parseoptions() op=install_image # used as part of a variable name ;; - kernel=*|releasekernel=*) + kernel=*|releasekernel=*|kernel.gdb=*) arg=${op#*=} op=${op%%=*} [ -n "${arg}" ] || @@ -1246,21 +1372,28 @@ parseoptions() # Set up MACHINE*. On a NetBSD host, these are allowed to be unset. # + # MACHINE_ARCH from the environment may be overridden by getarch + # (based on the MACHINE), but MACHINE_ARCH from the -a option should + # not be overridden. + # if [ -z "${MACHINE}" ]; then [ "${uname_s}" = "NetBSD" ] || bomb "MACHINE must be set, or -m must be used, for cross builds." MACHINE=${uname_m} fi - [ -n "${MACHINE_ARCH}" ] || getarch + $opt_a || getarch validatearch # Set up default make(1) environment. # makeenv="${makeenv} TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS" [ -z "${BUILDID}" ] || makeenv="${makeenv} BUILDID" + [ -z "${BUILDINFO}" ] || makeenv="${makeenv} BUILDINFO" MAKEFLAGS="-de -m ${TOP}/share/mk ${MAKEFLAGS}" MAKEFLAGS="${MAKEFLAGS} MKOBJDIRS=${MKOBJDIRS-yes}" export MAKEFLAGS MACHINE MACHINE_ARCH + setmakeenv USETOOLS "yes" + setmakeenv MAKEWRAPPERMACHINE "${makewrappermachine:-${MACHINE}}" } # sanitycheck -- @@ -1268,14 +1401,6 @@ parseoptions() # sanitycheck() { - # Non-root should always use either the -U or -E flag. - # - if ! ${do_expertmode} && \ - [ "$id_u" -ne 0 ] && \ - [ "${MKUNPRIVED}" = "no" ] ; then - bomb "-U or -E must be set for build as an unprivileged user." - fi - # Install as non-root is a bad idea. # if ${do_install} && [ "$id_u" -ne 0 ] ; then @@ -1501,6 +1626,22 @@ validatemakeparams() statusmsg2 "MAKECONF file:" "${MAKECONF} (File not found)" fi + # Normalise MKOBJDIRS, MKUNPRIVED, and MKUPDATE. + # These may be set as build.sh options or in "mk.conf". + # Don't export them as they're only used for tests in build.sh. + # + MKOBJDIRS=$(getmakevar MKOBJDIRS) + MKUNPRIVED=$(getmakevar MKUNPRIVED) + MKUPDATE=$(getmakevar MKUPDATE) + + # Non-root should always use either the -U or -E flag. + # + if ! ${do_expertmode} && \ + [ "$id_u" -ne 0 ] && \ + [ "${MKUNPRIVED}" = "no" ] ; then + bomb "-U or -E must be set for build as an unprivileged user." + fi + if [ "${runcmd}" = "echo" ]; then TOOLCHAIN_MISSING=no EXTERNAL_TOOLCHAIN="" @@ -1522,14 +1663,6 @@ validatemakeparams() exit 1 fi - # Normalise MKOBJDIRS, MKUNPRIVED, and MKUPDATE - # These may be set as build.sh options or in "mk.conf". - # Don't export them as they're only used for tests in build.sh. - # - MKOBJDIRS=$(getmakevar MKOBJDIRS) - MKUNPRIVED=$(getmakevar MKUNPRIVED) - MKUPDATE=$(getmakevar MKUPDATE) - if [ "${MKOBJDIRS}" != "no" ]; then # Create the top-level object directory. # @@ -1731,29 +1864,30 @@ createmakewrapper() eval cat <