1 6594 petede #!/usr/bin/ksh93 2 0 stevel # 3 0 stevel # CDDL HEADER START 4 0 stevel # 5 0 stevel # The contents of this file are subject to the terms of the 6 2294 meem # Common Development and Distribution License (the "License"). 7 2294 meem # You may not use this file except in compliance with the License. 8 0 stevel # 9 0 stevel # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 0 stevel # or http://www.opensolaris.org/os/licensing. 11 0 stevel # See the License for the specific language governing permissions 12 0 stevel # and limitations under the License. 13 0 stevel # 14 0 stevel # When distributing Covered Code, include this CDDL HEADER in each 15 0 stevel # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 0 stevel # If applicable, add the following below this CDDL HEADER, with the 17 0 stevel # fields enclosed by brackets "[]" replaced with your own identifying 18 0 stevel # information: Portions Copyright [yyyy] [name of copyright owner] 19 0 stevel # 20 0 stevel # CDDL HEADER END 21 0 stevel # 22 4162 kupfer 23 0 stevel # 24 9990 Gavin # Copyright 2009 Sun Microsystems, Inc. All rights reserved. 25 0 stevel # Use is subject to license terms. 26 0 stevel # 27 0 stevel # Uses supplied "env" file, based on /opt/onbld/etc/env, to set shell variables 28 0 stevel # before spawning a shell for doing a release-style builds interactively 29 0 stevel # and incrementally. 30 0 stevel # 31 0 stevel 32 6594 petede function usage 33 6594 petede { 34 6594 petede OPTIND=0 35 6594 petede getopts -a "${progname}" "${USAGE}" OPT '-?' 36 6594 petede exit 2 37 6594 petede } 38 0 stevel 39 6594 petede function is_source_build 40 6594 petede { 41 6594 petede "${flags.s.e}" || "${flags.s.d}" || "${flags.s.h}" || "${flags.s.o}" 42 2947 kupfer return $? 43 2947 kupfer } 44 2947 kupfer 45 2947 kupfer # 46 2947 kupfer # single function for setting -S flag and doing error checking. 47 2947 kupfer # usage: set_S_flag <type> 48 2947 kupfer # where <type> is the source build type ("E", "D", ...). 49 2947 kupfer # 50 6594 petede function set_S_flag 51 6594 petede { 52 2947 kupfer if is_source_build; then 53 6594 petede print 'Can only build one source variant at a time.' 54 2947 kupfer exit 1 55 2947 kupfer fi 56 6594 petede 57 6594 petede case "$1" in 58 6594 petede "E") flags.s.e=true ;; 59 6594 petede "D") flags.s.d=true ;; 60 6594 petede "H") flags.s.h=true ;; 61 6594 petede "O") flags.s.o=true ;; 62 6594 petede *) usage ;; 63 6594 petede esac 64 2947 kupfer } 65 6594 petede 66 6594 petede typeset -r USAGE=$'+ 67 6594 petede [-?\n@(#)\$Id: bldenv (OS/Net) 2008-04-06 \$\n] 68 6594 petede [-author?OS/Net community <tools-discuss (at] opensolaris.org>] 69 6594 petede [+NAME?bldenv - spawn shell for interactive incremental OS-Net 70 6594 petede consolidation builds] 71 6594 petede [+DESCRIPTION?bldenv is a useful companion to the nightly(1) script for 72 6594 petede doing interactive and incremental builds in a workspace 73 6594 petede already built with nightly(1). bldenv spawns a shell set up 74 6594 petede with the same environment variables taken from an env_file, 75 6594 petede as prepared for use with nightly(1).] 76 6594 petede [+?In addition to running a shell for interactive use, bldenv 77 6594 petede can optionally run a single command in the given environment, 78 6594 petede in the vein of sh -c or su -c. This is useful for 79 6594 petede scripting, when an interactive shell would not be. If the 80 6594 petede command is composed of multiple shell words or contains 81 6594 petede other shell metacharacters, it must be quoted appropriately.] 82 6594 petede [+?bldenv is particularly useful for testing Makefile targets 83 6594 petede like clobber, install and _msg, which otherwise require digging 84 6594 petede through large build logs to figure out what is being 85 6594 petede done.] 86 6594 petede [+?bldenv is also useful if you run into build issues with the 87 6594 petede source product or when generating OpenSolaris deliverables. 88 6594 petede If a source product build is flagged, the environment is set 89 6594 petede up for building the indicated source product tree, which is 90 6594 petede assumed to have already been created. If the OpenSolaris 91 6594 petede deliverables flag (-O) is set in NIGHTLY_OPTIONS, the 92 6594 petede environment is set up for building just the open source. 93 6594 petede This includes using an alternate proto area, as well as 94 6594 petede using the closed binaries in $CODEMGR_WS/closed.skel (which 95 6594 petede is assumed to already exist).] 96 6594 petede [+?By default, bldenv will invoke the shell specified in 97 6594 petede $SHELL. If $SHELL is not set or is invalid, csh will be 98 6594 petede used.] 99 6594 petede [c?force the use of csh, regardless of the value of $SHELL.] 100 6594 petede [f?invoke csh with the -f (fast-start) option. This option is valid 101 6594 petede only if $SHELL is unset or if it points to csh.] 102 6594 petede [d?set up environment for doing DEBUG builds (default is non-DEBUG)] 103 6594 petede [t?set up environment to use the tools in usr/src/tools (this is the 104 6594 petede default, use +t to use the tools from /opt/onbld)] 105 6594 petede [S]:[option?Build a variant of the source product. 106 6594 petede The value of \aoption\a must be one of the following:]{ 107 6594 petede [+E?build the exportable source variant of the source product.] 108 6594 petede [+D?build the domestic source (exportable + crypt) variant of 109 6594 petede the source product.] 110 6594 petede [+H?build hybrid source (binaries + deleted source).] 111 6594 petede [+O?simulate an OpenSolaris (open source only) build.] 112 6594 petede } 113 6594 petede 114 6594 petede <env_file> [command] 115 6594 petede 116 6594 petede [+EXAMPLES]{ 117 6594 petede [+?Example 1: Interactive use]{ 118 6594 petede [+?Use bldenv to spawn a shell to perform a DEBUG build and 119 6594 petede testing of the Makefile targets clobber and install for 120 6594 petede usr/src/cmd/true.] 121 6594 petede [+\n% rlogin wopr-2 -l gk 122 6594 petede {root::wopr-2::49} bldenv -d /export0/jg/on10-se.env 123 6594 petede Build type is DEBUG 124 6594 petede RELEASE is 5.10 125 6594 petede VERSION is wopr-2::on10-se::11/01/2001 126 6594 petede RELEASE_DATE is May 2004 127 6594 petede The top-level `setup\' target is available to build headers 128 6594 petede and tools. 129 6594 petede Using /usr/bin/tcsh as shell. 130 6594 petede {root::wopr-2::49} 131 6594 petede {root::wopr-2::49} cd $SRC/cmd/true 132 6594 petede {root::wopr-2::50} make 133 6594 petede {root::wopr-2::51} make clobber 134 6594 petede /usr/bin/rm -f true true.po 135 6594 petede {root::wopr-2::52} make 136 6594 petede /usr/bin/rm -f true 137 6594 petede cat true.sh > true 138 6594 petede chmod +x true 139 6594 petede {root::wopr-2::53} make install 140 6594 petede install -s -m 0555 -u root -g bin -f /export0/jg/on10-se/proto/root_sparc/usr/bin true 141 6594 petede `install\' is up to date.] 142 6594 petede } 143 6594 petede [+?Example 2: Non-interactive use]{ 144 6594 petede [+?Invoke bldenv to create SUNWonbld with a single command:] 145 6594 petede [+\nexample% bldenv onnv_06 \'cd $SRC/tools && make pkg\'] 146 6594 petede } 147 6594 petede } 148 6594 petede [+SEE ALSO?\bnightly\b(1)] 149 6594 petede ' 150 6594 petede 151 6594 petede # main 152 6594 petede builtin basename 153 6594 petede 154 6594 petede # boolean flags (true/false) 155 6594 petede typeset flags=( 156 6594 petede typeset c=false 157 6594 petede typeset f=false 158 6594 petede typeset d=false 159 6594 petede typeset O=false 160 6594 petede typeset o=false 161 6594 petede typeset t=true 162 6594 petede typeset s=( 163 6594 petede typeset e=false 164 6594 petede typeset h=false 165 6594 petede typeset d=false 166 6594 petede typeset o=false 167 6594 petede ) 168 6594 petede ) 169 6594 petede 170 6594 petede typeset progname="$(basename "${0}")" 171 0 stevel 172 0 stevel OPTIND=1 173 0 stevel SUFFIX="-nd" 174 6594 petede 175 6594 petede while getopts -a "${progname}" "${USAGE}" OPT ; do 176 6594 petede case ${OPT} in 177 6594 petede c) flags.c=true ;; 178 6594 petede +c) flags.c=false ;; 179 6594 petede f) flags.f=true ;; 180 6594 petede +f) flags.f=false ;; 181 6594 petede d) flags.d=true SUFFIX="" ;; 182 6594 petede +d) flags.d=false SUFFIX="-nd" ;; 183 6594 petede t) flags.t=true ;; 184 6594 petede +t) flags.t=false ;; 185 6594 petede S) set_S_flag "$OPTARG" ;; 186 6594 petede \?) usage ;; 187 6594 petede esac 188 0 stevel done 189 6594 petede shift $((OPTIND-1)) 190 0 stevel 191 0 stevel # test that the path to the environment-setting file was given 192 6594 petede if (( $# < 1 )) ; then 193 6594 petede usage 194 0 stevel fi 195 0 stevel 196 0 stevel # force locale to C 197 6594 petede export \ 198 6594 petede LC_COLLATE=C \ 199 6594 petede LC_CTYPE=C \ 200 6594 petede LC_MESSAGES=C \ 201 6594 petede LC_MONETARY=C \ 202 6594 petede LC_NUMERIC=C \ 203 6594 petede LC_TIME=C 204 0 stevel 205 0 stevel # clear environment variables we know to be bad for the build 206 6594 petede unset \ 207 6594 petede LD_OPTIONS \ 208 6594 petede LD_LIBRARY_PATH \ 209 6594 petede LD_AUDIT \ 210 6594 petede LD_BIND_NOW \ 211 6594 petede LD_BREADTH \ 212 6594 petede LD_CONFIG \ 213 6594 petede LD_DEBUG \ 214 6594 petede LD_FLAGS \ 215 6594 petede LD_LIBRARY_PATH_64 \ 216 6594 petede LD_NOVERSION \ 217 6594 petede LD_ORIGIN \ 218 6594 petede LD_LOADFLTR \ 219 6594 petede LD_NOAUXFLTR \ 220 6594 petede LD_NOCONFIG \ 221 6594 petede LD_NODIRCONFIG \ 222 6594 petede LD_NOOBJALTER \ 223 6594 petede LD_PRELOAD \ 224 6594 petede LD_PROFILE \ 225 6594 petede CONFIG \ 226 6594 petede GROUP \ 227 6594 petede OWNER \ 228 6594 petede REMOTE \ 229 6594 petede ENV \ 230 6594 petede ARCH \ 231 6594 petede CLASSPATH 232 0 stevel 233 9990 Gavin # 234 9990 Gavin # Setup environment variables 235 9990 Gavin # 236 9990 Gavin if [[ -f /etc/nightly.conf ]]; then 237 9990 Gavin source /etc/nightly.conf 238 9990 Gavin fi 239 9990 Gavin 240 6594 petede if [[ -f "$1" ]]; then 241 6594 petede if [[ "$1" == */* ]]; then 242 6594 petede source "$1" 243 0 stevel else 244 6594 petede source "./$1" 245 0 stevel fi 246 0 stevel else 247 6594 petede if [[ -f "/opt/onbld/env/$1" ]]; then 248 6594 petede source "/opt/onbld/env/$1" 249 0 stevel else 250 6594 petede printf \ 251 6594 petede 'Cannot find env file as either %s or /opt/onbld/env/%s\n' \ 252 6594 petede "$1" "$1" 253 0 stevel exit 1 254 0 stevel fi 255 0 stevel fi 256 0 stevel shift 257 0 stevel 258 2947 kupfer # contents of stdenv.sh inserted after next line: 259 2947 kupfer # STDENV_START 260 2947 kupfer # STDENV_END 261 2947 kupfer 262 6594 petede #MACH=$(uname -p) 263 0 stevel 264 0 stevel # must match the getopts in nightly.sh 265 0 stevel OPTIND=1 266 6594 petede NIGHTLY_OPTIONS="-${NIGHTLY_OPTIONS#-}" 267 10517 Mark while getopts '+0AaBCDdFfGIilMmNnOopRrS:tUuWwXxz' FLAG "$NIGHTLY_OPTIONS" 268 0 stevel do 269 6594 petede case "$FLAG" in 270 6594 petede O) flags.O=true ;; 271 6594 petede +O) flags.O=false ;; 272 6594 petede o) flags.o=true ;; 273 6594 petede +o) flags.o=false ;; 274 6594 petede t) flags.t=true ;; 275 6594 petede +t) flags.t=false ;; 276 6594 petede S) set_S_flag "$OPTARG" ;; 277 6594 petede *) ;; 278 0 stevel esac 279 0 stevel done 280 0 stevel 281 10738 James POUND_SIGN="#" 282 10738 James # have we set RELEASE_DATE in our env file? 283 10738 James if [ -z "$RELEASE_DATE" ]; then 284 10738 James RELEASE_DATE=$(LC_ALL=C date +"%B %Y") 285 10738 James fi 286 10738 James BUILD_DATE=$(LC_ALL=C date +%Y-%b-%d) 287 10738 James BASEWSDIR=$(basename $CODEMGR_WS) 288 10738 James DEV_CM="\"@(#)SunOS Internal Development: $LOGNAME $BUILD_DATE [$BASEWSDIR]\"" 289 10738 James export DEV_CM RELEASE_DATE POUND_SIGN 290 10738 James 291 6594 petede export INTERNAL_RELEASE_BUILD= 292 6594 petede 293 6594 petede print 'Build type is \c' 294 6594 petede if ${flags.d} ; then 295 6594 petede print 'DEBUG' 296 0 stevel unset RELEASE_BUILD 297 0 stevel unset EXTRA_OPTIONS 298 0 stevel unset EXTRA_CFLAGS 299 0 stevel else 300 0 stevel # default is a non-DEBUG build 301 6594 petede print 'non-DEBUG' 302 6594 petede export RELEASE_BUILD= 303 0 stevel unset EXTRA_OPTIONS 304 0 stevel unset EXTRA_CFLAGS 305 4162 kupfer fi 306 4162 kupfer 307 6594 petede if ${flags.O} ; then 308 6594 petede export MULTI_PROTO="yes" 309 6594 petede if [[ "$CLOSED_IS_PRESENT" == "yes" ]]; then 310 6594 petede print "CLOSED_IS_PRESENT is 'no' (because of '-O')" 311 4162 kupfer fi 312 4162 kupfer export CLOSED_IS_PRESENT=no 313 6594 petede export ON_CLOSED_BINS="$CODEMGR_WS/closed.skel" 314 0 stevel fi 315 0 stevel 316 0 stevel # update build-type variables 317 6594 petede CPIODIR="${CPIODIR}${SUFFIX}" 318 6594 petede PKGARCHIVE="${PKGARCHIVE}${SUFFIX}" 319 0 stevel 320 0 stevel # Append source version 321 6594 petede if "${flags.s.e}" ; then 322 6594 petede VERSION+=":EXPORT" 323 6594 petede SRC="${EXPORT_SRC}/usr/src" 324 0 stevel fi 325 0 stevel 326 6594 petede if "${flags.s.d}" ; then 327 6594 petede VERSION+=":DOMESTIC" 328 6594 petede SRC="${EXPORT_SRC}/usr/src" 329 0 stevel fi 330 0 stevel 331 6594 petede if "${flags.s.h}" ; then 332 6594 petede VERSION+=":HYBRID" 333 6594 petede SRC="${EXPORT_SRC}/usr/src" 334 0 stevel fi 335 0 stevel 336 6594 petede if "${flags.s.o}" ; then 337 6594 petede VERSION+=":OPEN_ONLY" 338 6594 petede SRC="${OPEN_SRCDIR}/usr/src" 339 2947 kupfer fi 340 2947 kupfer 341 7078 mjnelson # 342 7078 mjnelson # Keep track of this now, before we manipulate $PATH 343 7078 mjnelson # 344 7078 mjnelson WHICH_SCM=$(dirname $(whence $0))/which_scm 345 7078 mjnelson if [[ ! -x $WHICH_SCM ]]; then 346 7078 mjnelson WHICH_SCM=which_scm 347 7078 mjnelson fi 348 7078 mjnelson $WHICH_SCM | read SCM_TYPE junk 349 7078 mjnelson 350 7078 mjnelson 351 0 stevel # Set PATH for a build 352 2294 meem 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:." 353 6594 petede if [[ "${SUNWSPRO}" != "" ]]; then 354 6594 petede export PATH="${SUNWSPRO}/bin:$PATH" 355 0 stevel fi 356 2947 kupfer 357 6594 petede if [[ -z "$CLOSED_IS_PRESENT" ]]; then 358 6594 petede if [[ -d $SRC/../closed ]]; then 359 6594 petede export CLOSED_IS_PRESENT="yes" 360 2947 kupfer else 361 6594 petede export CLOSED_IS_PRESENT="no" 362 2947 kupfer fi 363 2947 kupfer fi 364 0 stevel 365 6594 petede TOOLS="${SRC}/tools" 366 6594 petede TOOLS_PROTO="${TOOLS}/proto" 367 0 stevel 368 6594 petede if "${flags.t}" ; then 369 6594 petede export ONBLD_TOOLS="${ONBLD_TOOLS:=${TOOLS_PROTO}/opt/onbld}" 370 0 stevel 371 6594 petede export STABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/stabs" 372 6594 petede export CTFSTABS="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfstabs" 373 6594 petede export GENOFFSETS="${TOOLS_PROTO}/opt/onbld/bin/genoffsets" 374 0 stevel 375 6594 petede export CTFCONVERT="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfconvert" 376 6594 petede export CTFMERGE="${TOOLS_PROTO}/opt/onbld/bin/${MACH}/ctfmerge" 377 0 stevel 378 6594 petede export CTFCVTPTBL="${TOOLS_PROTO}/opt/onbld/bin/ctfcvtptbl" 379 6594 petede export CTFFINDMOD="${TOOLS_PROTO}/opt/onbld/bin/ctffindmod" 380 0 stevel 381 0 stevel PATH="${TOOLS_PROTO}/opt/onbld/bin/${MACH}:${PATH}" 382 0 stevel PATH="${TOOLS_PROTO}/opt/onbld/bin:${PATH}" 383 0 stevel export PATH 384 0 stevel fi 385 0 stevel 386 9990 Gavin export DMAKE_MODE=${DMAKE_MODE:-parallel} 387 6594 petede 388 6594 petede if "${flags.o}" ; then 389 6594 petede export CH= 390 6594 petede else 391 6594 petede unset CH 392 0 stevel fi 393 0 stevel DEF_STRIPFLAG="-s" 394 0 stevel 395 0 stevel TMPDIR="/tmp" 396 0 stevel 397 6594 petede # "o_FLAG" is used by "nightly.sh" and "makebfu.sh" (it may be useful to 398 6594 petede # rename this variable using a more descriptive name later) 399 6594 petede export o_FLAG="$(${flags.o} && print 'y' || print 'n')" 400 6594 petede 401 6594 petede export \ 402 6594 petede PATH TMPDIR \ 403 6594 petede POUND_SIGN \ 404 10738 James DEF_STRIPFLAG \ 405 10738 James RELEASE_DATE 406 6594 petede unset \ 407 6594 petede CFLAGS \ 408 6594 petede LD_LIBRARY_PATH 409 0 stevel 410 0 stevel # a la ws 411 0 stevel ENVLDLIBS1= 412 0 stevel ENVLDLIBS2= 413 0 stevel ENVLDLIBS3= 414 0 stevel ENVCPPFLAGS1= 415 0 stevel ENVCPPFLAGS2= 416 0 stevel ENVCPPFLAGS3= 417 0 stevel ENVCPPFLAGS4= 418 0 stevel PARENT_ROOT= 419 0 stevel 420 6594 petede "${flags.O}" && export ROOT="$ROOT-open" 421 4162 kupfer 422 6594 petede if [[ "$MULTI_PROTO" != "yes" && "$MULTI_PROTO" != "no" ]]; then 423 6594 petede printf \ 424 6594 petede 'WARNING: invalid value for MULTI_PROTO (%s);setting to "no".\n' \ 425 6594 petede "$MULTI_PROTO" 426 6594 petede export MULTI_PROTO="no" 427 4162 kupfer fi 428 4162 kupfer 429 6594 petede [[ "$MULTI_PROTO" == "yes" ]] && export ROOT="${ROOT}${SUFFIX}" 430 4162 kupfer 431 0 stevel ENVLDLIBS1="-L$ROOT/lib -L$ROOT/usr/lib" 432 0 stevel ENVCPPFLAGS1="-I$ROOT/usr/include" 433 0 stevel MAKEFLAGS=e 434 0 stevel 435 6594 petede export \ 436 6594 petede ENVLDLIBS1 \ 437 6594 petede ENVLDLIBS2 \ 438 6594 petede ENVLDLIBS3 \ 439 6594 petede ENVCPPFLAGS1 \ 440 6594 petede ENVCPPFLAGS2 \ 441 6594 petede ENVCPPFLAGS3 \ 442 6594 petede ENVCPPFLAGS4 \ 443 6594 petede MAKEFLAGS \ 444 7078 mjnelson PARENT_ROOT \ 445 7078 mjnelson SCM_TYPE 446 0 stevel 447 6594 petede printf 'RELEASE is %s\n' "$RELEASE" 448 6594 petede printf 'VERSION is %s\n' "$VERSION" 449 6594 petede printf 'RELEASE_DATE is %s\n\n' "$RELEASE_DATE" 450 0 stevel 451 6594 petede if [[ -f "$SRC/Makefile" ]] && egrep -s '^setup:' "$SRC/Makefile" ; then 452 6594 petede print "The top-level 'setup' target is available \c" 453 6594 petede print "to build headers and tools." 454 6594 petede print "" 455 0 stevel 456 6594 petede elif "${flags.t}" ; then 457 6594 petede printf \ 458 6594 petede 'The tools can be (re)built with the install target in %s.\n\n' \ 459 6594 petede "${TOOLS}" 460 0 stevel fi 461 0 stevel 462 9990 Gavin # 463 9990 Gavin # place ourselves in a new task, respecting BUILD_PROJECT if set. 464 9990 Gavin # 465 9990 Gavin /usr/bin/newtask -c $$ ${BUILD_PROJECT:+-p$BUILD_PROJECT} 466 0 stevel 467 6594 petede if [[ "${flags.c}" == "false" && -x "$SHELL" && \ 468 6594 petede "$(basename "${SHELL}")" != "csh" ]]; then 469 0 stevel # $SHELL is set, and it's not csh. 470 0 stevel 471 6594 petede if "${flags.f}" ; then 472 6594 petede print 'WARNING: -f is ignored when $SHELL is not csh' 473 0 stevel fi 474 0 stevel 475 6594 petede printf 'Using %s as shell.\n' "$SHELL" 476 6594 petede exec "$SHELL" ${@:+-c "$@"} 477 0 stevel 478 6594 petede elif "${flags.f}" ; then 479 6594 petede print 'Using csh -f as shell.' 480 0 stevel exec csh -f ${@:+-c "$@"} 481 0 stevel 482 0 stevel else 483 6594 petede print 'Using csh as shell.' 484 0 stevel exec csh ${@:+-c "$@"} 485 0 stevel fi 486 6594 petede 487 6594 petede # not reached 488