1 #!/bin/ksh -p
   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 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  24 # Use is subject to license terms.
  25 #
  26 # Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  27 #
  28 #       This script sets up the environment variables for a SunOS
  29 #       codemgr workspace and spawns a shell with the environment
  30 #       setup.  
  31 #
  32 #       The following Environment variables are set:
  33 #               CODEMGR_WS
  34 #               ONBLD_DIR
  35 #               SRC
  36 #               TSRC
  37 #               ROOT
  38 #               PARENT_ROOT
  39 #               MACH
  40 #               MAKEFLAGS
  41 #               ENVCPPFLAGS{1-4}
  42 #               ENVLDLIBS{1-3}
  43 #       
  44 #       The MAKEFLAGS environment variable is set to force make
  45 #       to read default make variables from the environment.    
  46 #
  47 #       Workspace names can be specified in two forms: pathname
  48 #       and hostname:pathname.  If the hostname:pathname form is used
  49 #       the script accesses the environment through the /net automounter
  50 #       map.
  51 #
  52 
  53 #
  54 # function to produce a pathname from a workspace name or subdirectory.
  55 # The workspace name can have hostname:pathname format.
  56 #
  57 
  58 fmtwsname()
  59 {
  60         awk -F: '$1 != $0 { print "/net/"$1$2 } \
  61                  $1 == $0 { print $0 }'
  62 }
  63 
  64 #
  65 # Return a valid proto area, if one exists.
  66 #
  67 check_proto()
  68 {
  69         if [[ -z $1 ]]; then
  70                 return
  71         fi
  72 
  73         if [[ "$SCM_MODE" = "teamware" ]]; then
  74                 # Check for problematic parent specification and adjust
  75                 proto=`echo $1|fmtwsname`
  76                 echo "${proto}/root_${MACH}"
  77         elif [[ "$SCM_MODE" = "mercurial" ]]; then
  78                 proto=$1
  79                 #
  80                 # If the proto is a local repository then we can use it
  81                 # to point to the parents proto area. Don't bother to
  82                 # check if it exists or not, we never did for Teamware,
  83                 # since it might appear later anyway.
  84                 #
  85                 if [[ "${proto##ssh://}" == "$proto" && \
  86                      "${proto##http://}" == "$proto" && \
  87                      "${proto##https://}" == "$proto" ]]; then
  88                         echo "${proto}/root_${MACH}"
  89                 fi
  90         elif [[ "$SCM_MODE" = "git" ]]; then
  91                 #
  92                 # For git, we make no attempt to deal with the possibility of
  93                 # remote parent workspaces because, in the protodefs file, we
  94                 # don't actually acknowledge the concept of a parent workspace
  95                 # at all, in keeping with the rest of our git support.
  96                 #
  97                 echo "${1}/root_${MACH}"
  98         fi
  99 }
 100 
 101 cleanup_env()
 102 {
 103         # keep the env. clean when returning
 104         unset setenv osbld_flag os_rev wsosdir protofile wsname ofs proto \
 105                 pwd parent PROTO1 PROTO2 PROTO3 tmpwsname
 106         return 0
 107 }
 108 
 109 if [[ "$1" = "-e" ]]; then
 110         setenv=true
 111         shift
 112 else
 113         setenv=false
 114 fi
 115 
 116 WHICH_SCM=$(/bin/dirname $(whence $0))/which_scm
 117 if [[ ! -x $WHICH_SCM ]]; then
 118         WHICH_SCM=which_scm
 119 fi
 120 
 121 #
 122 # No workspace/repository path was given, so try and detect one from our
 123 # current directory we're in
 124 #
 125 if [[ $# -lt 1 ]]; then
 126         if env CODEMGR_WS="" $WHICH_SCM | read SCM_MODE tmpwsname && \
 127             [[ $SCM_MODE != unknown ]]; then
 128                 echo "Defaulting to $SCM_MODE repository $tmpwsname"
 129         else
 130                 echo "usage: ws [-e] [workspace_name]" >&2
 131                 if $setenv; then
 132                         cleanup_env
 133                         return 1
 134                 else
 135                         exit 1
 136                 fi
 137         fi
 138 else
 139         #
 140         # A workspace/repository path was passed in, grab it and pop
 141         # it off the stack
 142         #
 143         tmpwsname=$1
 144         shift
 145 fi
 146 
 147 #
 148 #       This variable displays the nested activations of workspaces.
 149 #       This is done here to get the exact name the user entered.
 150 #
 151 WS_STACK="$tmpwsname $WS_STACK"; export WS_STACK
 152 
 153 #
 154 # Set the workspace name and unset tmpwsname (as we reuse it later)
 155 #
 156 wsname=`echo $tmpwsname|fmtwsname`
 157 unset tmpwsname
 158 
 159 #
 160 # Checking for CODEMGR_WSPATH
 161 #
 162 if [[ -n ${CODEMGR_WSPATH} && ( ! -d $wsname ) && \
 163      ( `expr "$wsname" : "\/"` = "0" ) ]] 
 164 then
 165         ofs=$IFS
 166         IFS=":  "
 167         for i in $CODEMGR_WSPATH 
 168         do
 169                 if [[ -d ${i}/${wsname} ]]; then
 170                         wsname=${i}/${wsname}
 171                         break
 172                 fi
 173         done
 174         IFS=$ofs
 175 fi
 176 
 177 #
 178 # to translate it to an absolute pathname.  We need an
 179 # absolute pathname in order to set CODEMGR_WS.
 180 #
 181 if [[ `expr "$wsname" : "\/"` = "0" ]] 
 182 then
 183         pwd=`pwd`
 184         wsname="$pwd/$wsname"
 185 fi
 186 
 187 #
 188 #       Check to see if this is a valid workspace
 189 #
 190 if [[ ! -d $wsname ]]; then
 191         echo "$wsname . . . no such directory" >&2
 192         if $setenv; then
 193                 cleanup_env
 194                 return 1
 195         else
 196                 exit 1
 197         fi
 198 fi
 199 
 200 #
 201 # This catches the case of a passed in workspace path
 202 # Check which type of SCM is in use by $wsname.
 203 #
 204 (cd $wsname && env CODEMGR_WS="" $WHICH_SCM) | read SCM_MODE tmpwsname
 205 if [[ $? != 0 || "$SCM_MODE" == unknown ]]; then
 206         echo "Error: Unable to detect a supported SCM repository in $wsname"
 207         if $setenv; then
 208                 cleanup_env
 209                 return 1
 210         else
 211                 exit 1
 212         fi
 213 fi
 214 
 215 wsname=$tmpwsname
 216 CODEMGR_WS=$wsname ; export CODEMGR_WS
 217 SRC=$wsname/usr/src; export SRC
 218 TSRC=$wsname/usr/ontest; export TSRC
 219 
 220 if [[ "$SCM_MODE" = "teamware" && -d ${wsname}/Codemgr_wsdata ]]; then
 221         CM_DATA="Codemgr_wsdata"
 222         wsosdir=$CODEMGR_WS/$CM_DATA/sunos
 223         protofile=$wsosdir/protodefs
 224 elif [[ "$SCM_MODE" = "mercurial" && -d ${wsname}/.hg ]]; then
 225         CM_DATA=".hg"
 226         wsosdir=$CODEMGR_WS/$CM_DATA
 227         protofile=$wsosdir/org.opensolaris.protodefs
 228 elif [[ "$SCM_MODE" = "git" && -d ${wsname}/.git ]]; then
 229         CM_DATA=".git"
 230         wsosdir=$CODEMGR_WS/$CM_DATA
 231         protofile=$wsosdir/org.opensolaris.protodefs
 232 else
 233         echo "$wsname is not a supported workspace; type is $SCM_MODE" >&2
 234         if $setenv; then
 235                 cleanup_env
 236                 return 1
 237         else
 238                 exit 1
 239         fi
 240 fi
 241 
 242 MACH=`uname -p`
 243 
 244 if [[ ! -f $protofile ]]; then
 245         if [[ ! -w $CODEMGR_WS/$CM_DATA ]]; then
 246                 #
 247                 # The workspace doesn't have a protodefs file and I am
 248                 # unable to create one.  Tell user and use /tmp instead.
 249                 #
 250                 echo "Unable to create the proto defaults file ($protofile)."
 251 
 252                 # Just make one in /tmp
 253                 wsosdir=/tmp
 254                 protofile=$wsosdir/protodefs
 255         fi
 256 
 257         if [[ ! -d $wsosdir ]]; then
 258                 mkdir $wsosdir
 259         fi
 260 
 261         cat << PROTOFILE_EoF > $protofile
 262 #!/bin/sh
 263 #
 264 #       Set default proto areas for this workspace
 265 #       NOTE: This file was initially automatically generated.
 266 #
 267 #       Feel free to edit this file.  If this file is removed
 268 #       it will be rebuilt containing default values.
 269 #
 270 #       The variable CODEMGR_WS is available to this script.
 271 #
 272 #       PROTO1 is the first proto area searched and is typically set
 273 #       to a proto area associated with the workspace.  The ROOT
 274 #       environment variable is set to the same as PROTO1.  If you
 275 #       will be doing make installs this proto area needs to be writable.
 276 #
 277 #       PROTO2 and PROTO3 are set to proto areas to search before the
 278 #       search proceeds to the local machine or the proto area specified by
 279 #       TERMPROTO.
 280 #
 281 #       TERMPROTO (if specified) is the last place searched.  If
 282 #       TERMPROTO is not specified the search will end at the local
 283 #       machine.
 284 #
 285 
 286 PROTO1=\$CODEMGR_WS/proto
 287 PROTOFILE_EoF
 288         
 289         if [[ "$SCM_MODE" = "teamware" ]]; then
 290                 cat << PROTOFILE_EoF >> $protofile
 291 if [[ -f "\$CODEMGR_WS/Codemgr_wsdata/parent" ]]; then
 292    #
 293    # If this workspace has an codemgr parent then set PROTO2 to
 294    # point to the parents proto space.
 295    #
 296    parent=\`workspace parent \$CODEMGR_WS\`
 297    if [[ -n \$parent ]]; then
 298            PROTO2=\$parent/proto
 299    fi
 300 fi
 301 PROTOFILE_EoF
 302         elif [[ "$SCM_MODE" = "mercurial" ]]; then
 303                 cat << PROTOFILE_EoF >> $protofile
 304 parent=\`(cd \$CODEMGR_WS && hg path default 2>/dev/null)\`
 305 if [[ \$? -eq 0 && -n \$parent ]]; then
 306    [[ -n \$(check_proto \$parent/proto) ]] && PROTO2=\$parent/proto
 307 fi
 308 PROTOFILE_EoF
 309         fi
 310 fi
 311 
 312 . $protofile
 313 
 314 # This means you don't have to type make -e all of the time
 315 
 316 MAKEFLAGS=e; export MAKEFLAGS
 317 
 318 #
 319 #       Set up the environment variables
 320 #
 321 ROOT=/proto/root_${MACH}        # default
 322 
 323 ENVCPPFLAGS1=
 324 ENVCPPFLAGS2=
 325 ENVCPPFLAGS3=
 326 ENVCPPFLAGS4=
 327 ENVLDLIBS1=
 328 ENVLDLIBS2=
 329 ENVLDLIBS3=
 330 
 331 PROTO1=`check_proto $PROTO1`
 332 if [[ -n "$PROTO1" ]]; then     # first proto area specifed
 333         ROOT=$PROTO1
 334         ENVCPPFLAGS1=-I$ROOT/usr/include
 335         export ENVCPPFLAGS1
 336         ENVLDLIBS1="-L$ROOT/lib -L$ROOT/usr/lib"
 337         export ENVLDLIBS1
 338 
 339         PROTO2=`check_proto $PROTO2`
 340         if [[ -n "$PROTO2" ]]; then     # second proto area specifed
 341                 ENVCPPFLAGS2=-I$PROTO2/usr/include
 342                 export ENVCPPFLAGS2
 343                 ENVLDLIBS2="-L$PROTO2/lib -L$PROTO2/usr/lib"
 344                 export ENVLDLIBS2
 345 
 346                 PROTO3=`check_proto $PROTO3`
 347                 if [[ -n "$PROTO3" ]]; then     # third proto area specifed
 348                         ENVCPPFLAGS3=-I$PROTO3/usr/include
 349                         export ENVCPPFLAGS3
 350                         ENVLDLIBS3="-L$PROTO3/lib -L$PROTO3/usr/lib"
 351                         export ENVLDLIBS3
 352                 fi
 353         fi
 354 fi
 355 
 356 export ROOT
 357 
 358 if [[ -n "$TERMPROTO" ]]; then  # fallback area specifed
 359         TERMPROTO=`check_proto $TERMPROTO`
 360         ENVCPPFLAGS4="-Y I,$TERMPROTO/usr/include"
 361         export ENVCPPFLAGS4
 362         ENVLDLIBS3="$ENVLDLIBS3 -Y P,$TERMPROTO/lib:$TERMPROTO/usr/lib"
 363         export ENVLDLIBS3
 364 fi
 365 
 366 osbld_flag=0
 367 
 368 if [[ ! -v CLOSED_IS_PRESENT ]]; then
 369         if [[ -d $SRC/../closed ]]; then
 370                 export CLOSED_IS_PRESENT="yes"
 371         else
 372                 export CLOSED_IS_PRESENT="no"
 373         fi
 374 fi
 375 
 376 if [[ -z "$ONBLD_DIR" ]]; then
 377         ONBLD_DIR=$(/bin/dirname $(whence $0))
 378 fi
 379 
 380 if ! echo ":$PATH:" | grep ":${ONBLD_DIR}:" > /dev/null; then
 381         PATH="${ONBLD_DIR}:${ONBLD_DIR}/${MACH}:${PATH}"
 382         osbld_flag=1
 383 fi
 384 
 385 export PATH
 386 
 387 if [[ -n "$PROTO2" ]]; then
 388    # This should point to the parent's proto
 389    PARENT_ROOT=$PROTO2
 390    export PARENT_ROOT
 391 else
 392    # Clear it in case it's already in the env.
 393    PARENT_ROOT=
 394 fi
 395 export ONBLD_DIR
 396 export MACH
 397 
 398 os_rev=`uname -r`
 399 os_name=`uname -s`
 400 
 401 if [[ $os_name != "SunOS" || `expr $os_rev : "5\."` != "2" ]]; then
 402    #
 403    # This is not a SunOS 5.x machine - something is wrong
 404    #
 405    echo "***WARNING: this script is meant to be run on SunOS 5.x."
 406    echo "            This machine appears to be running: $os_name $os_rev"
 407 fi
 408 
 409 echo ""
 410 echo "Workspace                    : $wsname"
 411 if [[ -n "$parent" ]]; then
 412    echo "Workspace Parent             : $parent"
 413 fi
 414 echo "Proto area (\$ROOT)           : $ROOT"
 415 if [[ -n "$PARENT_ROOT" ]]; then
 416    echo "Parent proto area (\$PARENT_ROOT) : $PARENT_ROOT"
 417 fi
 418 echo "Root of source (\$SRC)        : $SRC"
 419 echo "Root of test source (\$TSRC)  : $TSRC"
 420 if [[ $osbld_flag = "1" ]]; then
 421    echo "Prepended to PATH            : $ONBLD_DIR"
 422 fi
 423 echo "Current directory (\$PWD)     : $wsname"
 424 echo ""
 425 
 426 cd $wsname
 427 
 428 if $setenv; then
 429         cleanup_env
 430 else
 431         exec ${SHELL:-sh} "$@"
 432 fi