1 #!/usr/bin/ksh93
   2 #
   3 # CDDL HEADER START
   4 #
   5 # The contents of this file are subject to the terms of the
   6 # Common Development and Distribution License (the "License").
   7 # You may not use this file except in compliance with the License.
   8 #
   9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10 # or http://www.opensolaris.org/os/licensing.
  11 # See the License for the specific language governing permissions
  12 # and limitations under the License.
  13 #
  14 # When distributing Covered Code, include this CDDL HEADER in each
  15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16 # If applicable, add the following below this CDDL HEADER, with the
  17 # fields enclosed by brackets "[]" replaced with your own identifying
  18 # information: Portions Copyright [yyyy] [name of copyright owner]
  19 #
  20 # CDDL HEADER END
  21 #
  22 
  23 #
  24 # Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
  25 # Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  26 # Copyright 2014 Garrett D'Amore <garrett@damore.org>
  27 # Copyright 2018 Joyent, Inc.
  28 #
  29 # Uses supplied "env" file, based on /opt/onbld/etc/env, to set shell variables
  30 # before spawning a shell for doing a release-style builds interactively
  31 # and incrementally.
  32 #
  33 
  34 function fatal_error
  35 {
  36         print -u2 "${progname}: $*"
  37         exit 1
  38 }
  39 
  40 function usage
  41 {
  42     OPTIND=0
  43     getopts -a "${progname}" "${USAGE}" OPT '-?'
  44     exit 2
  45 }
  46 
  47 typeset -r USAGE=$'+
  48 [-?\n@(#)\$Id: bldenv (OS/Net) 2008-04-06 \$\n]
  49 [-author?OS/Net community <tools-discuss@opensolaris.org>]
  50 [+NAME?bldenv - spawn shell for interactive incremental OS-Net
  51     consolidation builds]
  52 [+DESCRIPTION?bldenv is a useful companion to the nightly(1) script for
  53     doing interactive and incremental builds in a workspace
  54     already built with nightly(1). bldenv spawns a shell set up
  55     with the same environment variables taken from an env_file,
  56     as prepared for use with nightly(1).]
  57 [+?In addition to running a shell for interactive use, bldenv
  58     can optionally run a single command in the given environment,
  59     in the vein of sh -c or su -c. This is useful for
  60     scripting, when an interactive shell would not be. If the
  61     command is composed of multiple shell words or contains
  62     other shell metacharacters, it must be quoted appropriately.]
  63 [+?bldenv is particularly useful for testing Makefile targets
  64     like clobber, install and _msg, which otherwise require digging
  65     through large build logs to figure out what is being
  66     done.]
  67 [+?By default, bldenv will invoke the shell specified in
  68     $SHELL. If $SHELL is not set or is invalid, csh will be
  69     used.]
  70 [c?force the use of csh, regardless of the  value  of $SHELL.]
  71 [f?invoke csh with the -f (fast-start) option. This option is valid
  72     only if $SHELL is unset or if it points to csh.]
  73 [d?set up environment for doing DEBUG builds. The default is non-DEBUG,
  74     unless the -F flag is specified in the nightly file.]
  75 [t?set up environment to use the tools in usr/src/tools (this is the
  76     default, use +t to use the tools from /opt/onbld)]
  77 
  78 <env_file> [command]
  79 
  80 [+EXAMPLES]{
  81     [+?Example 1: Interactive use]{
  82         [+?Use bldenv to spawn a shell to perform  a  DEBUG  build  and
  83             testing of the  Makefile  targets  clobber and install for
  84             usr/src/cmd/true.]
  85         [+\n% rlogin wopr-2 -l gk
  86 {root::wopr-2::49} bldenv -d /export0/jg/on10-se.env
  87 Build type   is  DEBUG
  88 RELEASE      is  5.10
  89 VERSION      is  wopr-2::on10-se::11/01/2001
  90 RELEASE_DATE is  May 2004
  91 The top-level `setup\' target is available to build headers
  92 and tools.
  93 Using /usr/bin/tcsh as shell.
  94 {root::wopr-2::49}
  95 {root::wopr-2::49} cd $SRC/cmd/true
  96 {root::wopr-2::50} make
  97 {root::wopr-2::51} make clobber
  98 /usr/bin/rm -f true true.po
  99 {root::wopr-2::52} make
 100 /usr/bin/rm -f true
 101 cat true.sh > true
 102 chmod +x true
 103 {root::wopr-2::53} make install
 104 install -s -m 0555 -u root -g bin -f /export0/jg/on10-se/proto/root_sparc/usr/bin true
 105 `install\' is up to date.]
 106     }
 107     [+?Example 2: Non-interactive use]{
 108         [+?Invoke bldenv to create SUNWonbld with a single command:]
 109         [+\nexample% bldenv onnv_06 \'cd $SRC/tools && make pkg\']
 110         }
 111 }
 112 [+SEE ALSO?\bnightly\b(1)]
 113 '
 114 
 115 # main
 116 builtin basename
 117 
 118 # boolean flags (true/false)
 119 typeset flags=(
 120         typeset c=false
 121         typeset f=false
 122         typeset d=false
 123         typeset O=false
 124         typeset o=false
 125         typeset t=true
 126         typeset s=(
 127                 typeset e=false
 128                 typeset h=false
 129                 typeset d=false
 130                 typeset o=false
 131         )
 132         typeset d_set=false
 133         typeset DF_build=false
 134 )
 135 
 136 typeset progname="$(basename -- "${0}")"
 137 
 138 OPTIND=1
 139 
 140 while getopts -a "${progname}" "${USAGE}" OPT ; do
 141     case ${OPT} in
 142           c)    flags.c=true  ;;
 143           +c)   flags.c=false ;;
 144           f)    flags.f=true  ;;
 145           +f)   flags.f=false ;;
 146           d)    flags.d=true ; flags.d_set=true ;;
 147           +d)   flags.d=false ; flags.d_set=true ;;
 148           t)    flags.t=true  ;;
 149           +t)   flags.t=false ;;
 150           \?)   usage ;;
 151     esac
 152 done
 153 shift $((OPTIND-1))
 154 
 155 # test that the path to the environment-setting file was given
 156 if (( $# < 1 )) ; then
 157         usage
 158 fi
 159 
 160 # force locale to C
 161 export \
 162         LANG=C \
 163         LC_ALL=C \
 164         LC_COLLATE=C \
 165         LC_CTYPE=C \
 166         LC_MESSAGES=C \
 167         LC_MONETARY=C \
 168         LC_NUMERIC=C \
 169         LC_TIME=C
 170 
 171 # clear environment variables we know to be bad for the build
 172 unset \
 173         LD_OPTIONS \
 174         LD_LIBRARY_PATH \
 175         LD_AUDIT \
 176         LD_BIND_NOW \
 177         LD_BREADTH \
 178         LD_CONFIG \
 179         LD_DEBUG \
 180         LD_FLAGS \
 181         LD_LIBRARY_PATH_64 \
 182         LD_NOVERSION \
 183         LD_ORIGIN \
 184         LD_LOADFLTR \
 185         LD_NOAUXFLTR \
 186         LD_NOCONFIG \
 187         LD_NODIRCONFIG \
 188         LD_NOOBJALTER \
 189         LD_PRELOAD \
 190         LD_PROFILE \
 191         CONFIG \
 192         GROUP \
 193         OWNER \
 194         REMOTE \
 195         ENV \
 196         ARCH \
 197         CLASSPATH
 198 
 199 #
 200 # Setup environment variables
 201 #
 202 if [[ -f /etc/nightly.conf ]]; then
 203         source /etc/nightly.conf
 204 fi
 205 
 206 if [[ -f "$1" ]]; then
 207         if [[ "$1" == */* ]]; then
 208                 source "$1"
 209         else
 210                 source "./$1"
 211         fi
 212 else
 213         if [[ -f "/opt/onbld/env/$1" ]]; then
 214                 source "/opt/onbld/env/$1"
 215         else
 216                 printf \
 217                     'Cannot find env file as either %s or /opt/onbld/env/%s\n' \
 218                     "$1" "$1"
 219                 exit 1
 220         fi
 221 fi
 222 shift
 223 
 224 # Check if we have sufficient data to continue...
 225 [[ -v CODEMGR_WS ]] || fatal_error "Error: Variable CODEMGR_WS not set."
 226 [[ -d "${CODEMGR_WS}" ]] || fatal_error "Error: ${CODEMGR_WS} is not a directory."
 227 [[ -f "${CODEMGR_WS}/usr/src/Makefile" ]] || fatal_error "Error: ${CODEMGR_WS}/usr/src/Makefile not found."
 228 
 229 # must match the getopts in nightly.sh
 230 OPTIND=1
 231 NIGHTLY_OPTIONS="-${NIGHTLY_OPTIONS#-}"
 232 while getopts '+0ABCDdFfGIilMmNnpRrtUuwW' FLAG $NIGHTLY_OPTIONS
 233 do
 234         case "$FLAG" in
 235           t)    flags.t=true  ;;
 236           +t)   flags.t=false ;;
 237           F)    flags.DF_build=true ;;
 238           *)    ;;
 239         esac
 240 done
 241 
 242 # DEBUG is a little bit complicated.  First, bldenv -d/+d over-rides
 243 # the env file.  Otherwise, we'll default to DEBUG iff we are *not*
 244 # building non-DEBUG bits at all.
 245 if [ "${flags.d_set}" != "true" ] && "${flags.DF_build}"; then
 246         flags.d=true
 247 fi
 248 
 249 POUND_SIGN="#"
 250 # have we set RELEASE_DATE in our env file?
 251 if [ -z "$RELEASE_DATE" ]; then
 252         RELEASE_DATE=$(LC_ALL=C date +"%B %Y")
 253 fi
 254 BUILD_DATE=$(LC_ALL=C date +%Y-%b-%d)
 255 BASEWSDIR=$(basename -- "${CODEMGR_WS}")
 256 DEV_CM="\"@(#)SunOS Internal Development: $LOGNAME $BUILD_DATE [$BASEWSDIR]\""
 257 export DEV_CM RELEASE_DATE POUND_SIGN
 258 
 259 print 'Build type   is  \c'
 260 if ${flags.d} ; then
 261         print 'DEBUG'
 262         SUFFIX=""
 263         unset RELEASE_BUILD
 264         unset EXTRA_OPTIONS
 265         unset EXTRA_CFLAGS
 266 else
 267         # default is a non-DEBUG build
 268         print 'non-DEBUG'
 269         SUFFIX="-nd"
 270         export RELEASE_BUILD=
 271         unset EXTRA_OPTIONS
 272         unset EXTRA_CFLAGS
 273 fi
 274 
 275 # update build-type variables
 276 PKGARCHIVE="${PKGARCHIVE}${SUFFIX}"
 277 
 278 #       Set PATH for a build
 279 PATH="/opt/onbld/bin:/opt/onbld/bin/${MACH}:/opt/SUNWspro/bin:/usr/ccs/bin:/usr/bin:/usr/sbin:/usr/ucb:/usr/etc:/usr/openwin/bin:/usr/sfw/bin:/opt/sfw/bin:."
 280 if [[ "${SUNWSPRO}" != "" ]]; then
 281         export PATH="${SUNWSPRO}/bin:$PATH"
 282 fi
 283 
 284 if [[ -n "${MAKE}" ]]; then
 285         if [[ -x "${MAKE}" ]]; then
 286                 export PATH="$(dirname -- "${MAKE}"):$PATH"
 287         else
 288                 print "\$MAKE (${MAKE}) is not a valid executible"
 289                 exit 1
 290         fi
 291 fi
 292 
 293 TOOLS="${SRC}/tools"
 294 TOOLS_PROTO="${TOOLS}/proto/root_${MACH}-nd" ; export TOOLS_PROTO
 295 
 296 if "${flags.t}" ; then
 297         export ONBLD_TOOLS="${ONBLD_TOOLS:=${TOOLS_PROTO}/opt/onbld}"
 298 
 299         export STABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/stabs"
 300         export CTFSTABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfstabs"
 301         export GENOFFSETS="${TOOLS_PROTO}/opt/onbld/bin/genoffsets"
 302 
 303         export CTFCONVERT="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfconvert"
 304         export CTFMERGE="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfmerge"
 305         export NDRGEN="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ndrgen"
 306 
 307         PATH="${TOOLS_PROTO}/opt/onbld/bin/${MACH}:${PATH}"
 308         PATH="${TOOLS_PROTO}/opt/onbld/bin:${PATH}"
 309         export PATH
 310 fi
 311 
 312 export DMAKE_MODE=${DMAKE_MODE:-parallel}
 313 
 314 #
 315 # Work around folks who have historically used GCC_ROOT and convert it to
 316 # GNUC_ROOT. We leave GCC_ROOT in the environment for now (though this could
 317 # mess up the case where multiple different gcc versions are being used to
 318 # shadow).
 319 #
 320 if [[ -n "${GCC_ROOT}" ]]; then
 321         export GNUC_ROOT=${GCC_ROOT}
 322 fi
 323 
 324 DEF_STRIPFLAG="-s"
 325 
 326 TMPDIR="/tmp"
 327 
 328 export \
 329         PATH TMPDIR \
 330         POUND_SIGN \
 331         DEF_STRIPFLAG \
 332         RELEASE_DATE
 333 unset \
 334         CFLAGS \
 335         LD_LIBRARY_PATH
 336 
 337 # a la ws
 338 ENVLDLIBS1=
 339 ENVLDLIBS2=
 340 ENVLDLIBS3=
 341 ENVCPPFLAGS1=
 342 ENVCPPFLAGS2=
 343 ENVCPPFLAGS3=
 344 ENVCPPFLAGS4=
 345 PARENT_ROOT=
 346 PARENT_TOOLS_ROOT=
 347 
 348 if [[ "$MULTI_PROTO" != "yes" && "$MULTI_PROTO" != "no" ]]; then
 349         printf \
 350             'WARNING: invalid value for MULTI_PROTO (%s); setting to "no".\n' \
 351             "$MULTI_PROTO"
 352         export MULTI_PROTO="no"
 353 fi
 354 
 355 [[ "$MULTI_PROTO" == "yes" ]] && export ROOT="${ROOT}${SUFFIX}"
 356 
 357 ENVLDLIBS1="-L$ROOT/lib -L$ROOT/usr/lib"
 358 ENVCPPFLAGS1="-I$ROOT/usr/include"
 359 MAKEFLAGS=e
 360 
 361 export \
 362         ENVLDLIBS1 \
 363         ENVLDLIBS2 \
 364         ENVLDLIBS3 \
 365         ENVCPPFLAGS1 \
 366         ENVCPPFLAGS2 \
 367         ENVCPPFLAGS3 \
 368         ENVCPPFLAGS4 \
 369         MAKEFLAGS \
 370         PARENT_ROOT \
 371         PARENT_TOOLS_ROOT
 372 
 373 printf 'RELEASE      is %s\n'   "$RELEASE"
 374 printf 'VERSION      is %s\n'   "$VERSION"
 375 printf 'RELEASE_DATE is %s\n\n' "$RELEASE_DATE"
 376 
 377 if [[ -f "$SRC/Makefile" ]] && egrep -s '^setup:' "$SRC/Makefile" ; then
 378         print "The top-level 'setup' target is available \c"
 379         print "to build headers and tools."
 380         print ""
 381 
 382 elif "${flags.t}" ; then
 383         printf \
 384             'The tools can be (re)built with the install target in %s.\n\n' \
 385             "${TOOLS}"
 386 fi
 387 
 388 #
 389 # place ourselves in a new task, respecting BUILD_PROJECT if set.
 390 #
 391 /usr/bin/newtask -c $$ ${BUILD_PROJECT:+-p$BUILD_PROJECT}
 392 
 393 if [[ "${flags.c}" == "false" && -x "$SHELL" && \
 394     "$(basename -- "${SHELL}")" != "csh" ]]; then
 395         # $SHELL is set, and it's not csh.
 396 
 397         if "${flags.f}" ; then
 398                 print 'WARNING: -f is ignored when $SHELL is not csh'
 399         fi
 400 
 401         printf 'Using %s as shell.\n' "$SHELL"
 402         exec "$SHELL" ${@:+-c "$@"}
 403 
 404 elif "${flags.f}" ; then
 405         print 'Using csh -f as shell.'
 406         exec csh -f ${@:+-c "$@"}
 407 
 408 else
 409         print 'Using csh as shell.'
 410         exec csh ${@:+-c "$@"}
 411 fi
 412 
 413 # not reached