ws.sh revision 7c478bd95313f5f23a4c958a745db2134aa03244
#!/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License"). You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
#
# This script sets up the environment variables for a SunOS
# codemgr workspace and spawns a shell with the environment
# setup.
#
# The following Environment variables are set:
# CODEMGR_WS
# ONBLD_DIR
# SRC
# TSRC
# ROOT
# PARENT_ROOT
# MACH
# MAKEFLAGS
# ENVCPPFLAGS{1-4}
# ENVLDLIBS{1-3}
#
# The MAKEFLAGS environment variable is set to force make
# to read default make variables from the environment.
#
# Workspace names can be specified in two forms: pathname
# and hostname:pathname. If the hostname:pathname form is used
# the script accesses the environment through the /net automounter
# map.
#
#
# function to produce a pathname from a workspace name or subdirectory.
# The workspace name can have hostname:pathname format.
#
fmtwsname(){
awk -F: '$1 != $0 { print "/net/"$1$2 } \
$1 == $0 { print $0 }'
}
#
# function to check to see if a proto area is new or old format
#
check_proto()
{
# Check for problematic parent specification and adjust
proto=`echo $1|fmtwsname`
#
# if proto contains a /usr/include directory we assume
# that this is an old style proto area
#
if [ -d $proto/usr/include ]; then
echo $proto
else
echo "${proto}/root_${MACH}"
fi
}
cleanup_env()
{
# keep the env. clean when returning
unset setenv osbld_flag os_rev wsosdir protofile wsname ofs proto \
pwd parent PROTO1 PROTO2 PROTO3 tmpwsname
return 0
}
if [ "$1" = "-e" ]; then
setenv=true
shift
else
setenv=false
fi
if [ $# -lt 1 ]; then
set -- `workspace name`
[ $# -eq 1 ] && echo "Defaulting to workspace $1"
fi
if [ $# -lt 1 ]; then
echo "usage: ws [-e] [workspace_name]" >&2
if $setenv; then
cleanup_env
return 1
else
exit 1
fi
fi
#
# This variable displays the nested activations of workspaces.
# This is done here to get the exact name the user entered.
#
WS_STACK="$1 $WS_STACK"; export WS_STACK
wsname=`echo $1|fmtwsname`
shift
#
# Checking for CODEMGR_WSPATH
#
if [ "(" "${CODEMGR_WSPATH}x" != "x" ")" -a "(" ! -d $wsname ")" -a \
"(" `expr "$wsname" : "\/"` = "0" ")" ]
then
ofs=$IFS
IFS=": "
for i in $CODEMGR_WSPATH
do
if [ -d ${i}/${wsname} ]; then
wsname=${i}/${wsname}
break
fi
done
IFS=$ofs
fi
# to translate it to an absolute pathname. We need an
# absolute pathname in order to set CODEMGR_WS.
#
if [ `expr "$wsname" : "\/"` = "0" ]
then
pwd=`pwd`
wsname="$pwd/$wsname"
fi
if [ ! -d $wsname/Codemgr_wsdata ]; then
echo "Error: $wsname is not a workspace" >&2
if $setenv; then
cleanup_env
return 1
else
exit 1
fi
fi
tmpwsname=`(cd $wsname >/dev/null && workspace name)`
if [ -z "$tmpwsname" ]; then
echo "Error: $wsname is not a workspace" >&2
if $setenv; then
cleanup_env
return 1
else
exit 1
fi
fi
wsname=$tmpwsname
#
# Check to see if this is a valid workspace
#
if [ ! -d $wsname ]; then
echo "$wsname . . . no such directory" >&2
if $setenv; then
cleanup_env
return 1
else
exit 1
fi
fi
if [ -d ${wsname}/Codemgr_wsdata ]; then
CM_DATA=Codemgr_wsdata
else
echo "$wsname is not a workspace" >&2
if $setenv; then
cleanup_env
return 1
else
exit 1
fi
fi
CODEMGR_WS=$wsname; export CODEMGR_WS
SRC=$CODEMGR_WS/usr/src; export SRC
TSRC=$CODEMGR_WS/usr/ontest; export TSRC
wsosdir=$CODEMGR_WS/$CM_DATA/sunos
protofile=$wsosdir/protodefs
if [ ! -f $protofile ]; then
if [ ! -w $CODEMGR_WS/$CM_DATA ]; then
#
# The workspace doesn't have a protodefs file and I am
# unable to create one. Tell user and use /tmp instead.
#
echo "Unable to create the proto defaults file ($protofile)."
# Just make one in /tmp
wsosdir=/tmp
protofile=$wsosdir/protodefs
fi
if [ ! -d $wsosdir ]; then
mkdir $wsosdir
fi
cat << PROTOFILE_EoF > $protofile
#!/bin/sh
#
# Set default proto areas for this workspace
# NOTE: This file was initially automatically generated.
#
# Feel free to edit this file. If this file is removed
# it will be rebuilt containing default values.
#
# The variable CODEMGR_WS is available to this script.
#
# PROTO1 is the first proto area searched and is typically set
# to a proto area associated with the workspace. The ROOT
# environment variable is set to the same as PROTO1. If you
# will be doing make installs this proto area needs to be writable.
#
# PROTO2 and PROTO3 are set to proto areas to search before the
# search proceeds to the local machine or the proto area specified by
# TERMPROTO.
#
# TERMPROTO (if specified) is the last place searched. If
# TERMPROTO is not specified the search will end at the local
# machine.
#
PROTO1=\$CODEMGR_WS/proto
if [ -f "\$CODEMGR_WS/Codemgr_wsdata/parent" ]; then
#
# If this workspace has an codemgr parent then set PROTO2 to
# point to the parents proto space.
#
parent=\`workspace parent \$CODEMGR_WS\`
if [ -n \$parent ]; then
PROTO2=\$parent/proto
fi
fi
PROTOFILE_EoF
fi
. $protofile
# This means you don't have to type make -e all of the time
MAKEFLAGS=e; export MAKEFLAGS
#
# Set up the environment variables
#
MACH=`uname -p`
ROOT=/proto/root_${MACH} # default
ENVCPPFLAGS1=
ENVCPPFLAGS2=
ENVCPPFLAGS3=
ENVCPPFLAGS4=
ENVLDLIBS1=
ENVLDLIBS2=
ENVLDLIBS3=
if [ "$PROTO1" != "" ]; then # first proto area specifed
PROTO1=`check_proto $PROTO1`
ROOT=$PROTO1
ENVCPPFLAGS1=-I$ROOT/usr/include
export ENVCPPFLAGS1
ENVLDLIBS1="-L$ROOT/lib -L$ROOT/usr/lib"
export ENVLDLIBS1
if [ "$PROTO2" != "" ]; then # second proto area specifed
PROTO2=`check_proto $PROTO2`
ENVCPPFLAGS2=-I$PROTO2/usr/include
export ENVCPPFLAGS2
ENVLDLIBS2="-L$PROTO2/lib -L$PROTO2/usr/lib"
export ENVLDLIBS2
if [ "$PROTO3" != "" ]; then # third proto area specifed
PROTO3=`check_proto $PROTO3`
ENVCPPFLAGS3=-I$PROTO3/usr/include
export ENVCPPFLAGS3
ENVLDLIBS3="-L$PROTO3/lib -L$PROTO3/usr/lib"
export ENVLDLIBS3
fi
fi
fi
export ROOT
if [ "$TERMPROTO" != "" ]; then # fallback area specifed
TERMPROTO=`check_proto $TERMPROTO`
ENVCPPFLAGS4="-Y I,$TERMPROTO/usr/include"
export ENVCPPFLAGS4
ENVLDLIBS3="$ENVLDLIBS3 -Y P,$TERMPROTO/lib:$TERMPROTO/usr/lib"
export ENVLDLIBS3
fi
#
# Now let's set those variables which are either 4.1.x specific
# or 5.0 specific
#
os_rev=`uname -r`
osbld_flag=0
if [ `expr $os_rev : "4\.1"` = "3" ]; then # This is a 4.1.x machine
#
# Enable all of the DOUBLECROSS_ROOT components for the 4.1.x compile
#
DOUBLECROSS_ROOT=${DOUBLECROSS_ROOT="/crossroot"}
PATH=$DOUBLECROSS_ROOT/usr/ccs/bin:$DOUBLECROSS_ROOT/usr/bin:$DOUBLECROSS_ROOT/usr/sbin:$PATH
export DOUBLECROSS_ROOT PATH
elif [ `expr $os_rev : "5\."` = "2" ]; then
#
# Enable any 5.x specific variables here
#
if [ ${ONBLD_DIR:-NULL} = "NULL" ]; then
if [ -d /opt/onbld/bin ]; then
ONBLD_DIR=/opt/onbld/bin
elif [ -d /usr/onbld/bin ]; then
ONBLD_DIR=/usr/onbld/bin
fi
fi
if [ -d ${ONBLD_DIR:-\\NULL} ] ; then
PATH=${ONBLD_DIR}:${PATH}
osbld_flag=1
export PATH
fi
if [ "$PROTO2" != "" ]; then
# This should point to the parent's proto
PARENT_ROOT=$PROTO2
export PARENT_ROOT
else
# Clear it in case it's already in the env.
PARENT_ROOT=
fi
export ONBLD_DIR
export MACH
else
#
# This is neither a 5.x machine nor a 4.1.x machine - something is wrong
#
echo "***WARNING: this script is meant to be run on a 4.1.x and/or a 5.x"
echo " operating system. This machine appears to be running:"
echo " $os_rev "
fi
echo ""
echo "Workspace (\$CODEMGR_WS) : $CODEMGR_WS"
if [ -n "$parent" ]; then
echo "Workspace Parent : $parent"
fi
echo "Proto area (\$ROOT) : $ROOT"
if [ -n "$PARENT_ROOT" ]; then
echo "Parent proto area (\$PARENT_ROOT) : $PARENT_ROOT"
fi
echo "Root of source (\$SRC) : $SRC"
echo "Root of test source (\$TSRC) : $TSRC"
if [ $osbld_flag = "1" ]; then
echo "Prepended to PATH : $ONBLD_DIR"
fi
echo "Current directory (\$PWD) : $CODEMGR_WS"
echo ""
cd $CODEMGR_WS
if $setenv; then
cleanup_env
else
exec ${SHELL:-sh} "$@"
fi