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