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