#!/bin/sh
##############################################################################
# Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. 
#
# genorasdksh.sh (SDK = Software Development Kit) -- AIX version
#
#    Creates single shared client library for OCI, Pro*C, and XA.
#
# Makes either the base SDK library or full library depending on the
# arguments given.  Default (no arguments) is to make the full library.
# If invoked with "-base", makes the base library.
#
#  MODIFIED   (MM/DD/YY)
#  msingal     11/17/09 - Bug/9108979 link libnnz11 static archive
#  spattnay    12/05/08 - Clean up 32bit reference
#  rchahal     08/26/08 - Add NZ lib to liborasdkbase.so linkline.
#  akaimale    10/14/07 - use RTL option for lib generation
#  akaimale    06/16/07 - Fix OBJECT_MODE issues & bug 6135078
#  akaimale    06/11/07 - Use .exp file instead of .bom
#  mlfallon    04/09/07 - Change C++ runtime library to be
#                         compatible with Gcc 3.4
#  jboyce      02/13/07 - 10->11
#  spattnay    03/08/07 - Bugz#21162
#  spattnay    03/01/07 - Bugz#21064
#  spattnay    03/01/07 - Bugz#21064
#  tnallath    01/19/07 - add gssapi lib
#  garnaiz     12/12/06 - establish dependency on skgxp unconditionally
#  shahmed     11/29/06 - Add OBJECT_MODE=32i, 64. Bug-5533357
#  skalyana    03/30/06 - 
#  bsthanik    03/09/06 - libn10.a dependency for xdk 
#  jboyce      11/04/05 - bom2def changes on linux
#  bsthanik    03/09/06 - libn10.a dependency for xdk
#  slahoran    05/10/05 - Port for AIX
#  mchengjr    03/02/05 - Add code snippet to fix issue with bom2def on Linux
#  mchengjr    02/15/05 - cleanup and add changes for new CRS symbols
#  imacky      01/25/05 - tweak for new syms 
#  imacky      10/29/04 - remove pctina.o 
#  imacky      10/07/04 - cleanup; addl syms; merge with base script
#  jboyce      07/09/04 - cleanup; xdk issues
#  jboyce      05/28/04 - Created genorasdksh.sh based on genclntsh.sh
###############################################################################

echo '$Id: genorasdksh.sh /aix64/3 2009/11/17 13:41:39 msingal Exp $'

PROGRAM=$0					# name of program (or symlink)
MAJOR=11					# major version#
MINOR=1						# minor version#

OLIB=$ORACLE_HOME/lib				# dir for Oracle libraries

# Explicit path to ensure that we're using the correct commands
###
PATH=/bin:/usr/bin:/usr/local/bin; export PATH

# Print archive table of contents
###
ARPRINT="/usr/bin/ar t"

#------------------------------------------------------------------------------
# Process arguments
#------------------------------------------------------------------------------

OSDK_BASE=
ARGUMENTS=
while [ x"$1" != x ]; do
    ARGUMENTS="${ARGUMENTS} $1"
    case $1 in
        -x)    set -x; shift ;;
     -base) OSDK_BASE=1; shift ;;
         *)     echo "Unknown argument $1"; exit 1 ;;
    esac
done
#     lib32) LIB32=1; LOOP=1; shift ;;

#------------------------------------------------------------------------------ 
# OraSDK client library names and locations
#------------------------------------------------------------------------------ 

# Library to generate
###
OSDK_NAM=orasdk					# (short) library name
OSDK_BASE_NAM=${OSDK_NAM}base			# (short) base library name

if [ "$OSDK_BASE" ]; then
    echo "Generating BASE ORASDK library..."
    OSDK_NAM=$OSDK_BASE_NAM
else
    echo "Generating FULL ORASDK library..."
fi

OSDK_VER=$MAJOR.$MINOR				# library version number
OSDK_LNK=lib$OSDK_NAM.so			# name of symlink to library
OSDK_LIB=$OSDK_LNK				# actual library file name

# OraSDK base library name and locations (used to build full library)
##
OSDK_BASE_LNK=lib$OSDK_BASE_NAM.so		# library version number
OSDK_BASE_LIB=$OSDK_BASE_LNK			# actual library file name

# Base library symbols list (NLSRTL, ORACORE, XDK)
###
OSDK_BASE_SHREPT_FILE=orasdkbase_shrept.lst
OSDK_BASE_SHREPT=$ORACLE_HOME/rdbms/admin/$OSDK_BASE_SHREPT_FILE

# Additional symbol list for full library
###
OSDK_SHREPT_FILE=orasdk_shrept.lst
OSDK_SHREPT=$ORACLE_HOME/rdbms/admin/$OSDK_SHREPT_FILE

# Base library map file 
OSDK_BASE_DEF_FILE=liborasdkbase.exp
OSDK_BASE_DEF=$ORACLE_HOME/rdbms/admin/$OSDK_BASE_DEF_FILE

# Destination directory for produced library
###
LIB_DIR=$OLIB

# On AIX set OBJECT_MODE appropriately
# If there's a SRCHOME home, look there instead of ORACLE_HOME
###
if [ "$SRCHOME" ]; then
    OSDK_BASE_SHREPT=$SRCHOME/rdbms/admin/$OSDK_BASE_SHREPT_FILE
    OSDK_SHREPT=$SRCHOME/rdbms/admin/$OSDK_SHREPT_FILE
    OSDK_BASE_DEF=$SRCHOME/rdbms/admin/$OSDK_BASE_DEF_FILE
    LIB_DIR=$SRCHOME/rdbms/lib
    if [ "$LIB32" ]; then
      LIB_DIR=${SRCHOME}/rdbms/lib32
      OLIB=${SRCHOME}/lib32
      OBJECT_MODE=32
    fi
else
    OBJECT_MODE=64
    if [ "$LIB32" ]; then
      OLIB=${ORACLE_HOME}/lib32
      LIB_DIR=${OLIB}
      OBJECT_MODE=32
    fi
fi

export OBJECT_MODE

#------------------------------------------------------------------------------ 
# Linker options and system libraries
#------------------------------------------------------------------------------ 

# Linker command and options
###
LD="ld -bnoentry -bM:SRE -bexpall -bI:/usr/lib/aio.exp -L$OLIB"
LD_RUNTIME="-blibpath:$OLIB"
LD_OPT="-bnoipath -brtl"                              # name inserted into library
LD_DEST="$LIB_DIR/$OSDK_LIB"			# output library
LD_OUT="-o $LD_DEST"				# output specification
LD_SELF_CONTAINED=""

if [ "$OSDK_BASE" ]; then
    LD_OPT="$LD_OPT -bE:$OSDK_BASE_DEF"
    BASE_LIB=
else
    BASE_LIB=$LIB_DIR/$OSDK_BASE_LIB
fi

# Required system libraries
###
SYSLIBS="`cat $OLIB/sysliblist` -lm -lc"

#  Add C++ standard template and runtime libraries to base library
###
if [ "$OSDK_BASE" ]; then
    SYSLIBS="$SYSLIBS -lC"
fi


#------------------------------------------------------------------------------ 
# Oracle library definitions
#------------------------------------------------------------------------------ 

LNLSRTL="-lnls$MAJOR"		# NLSRTL (National Language)
LUNLSRTL="-lunls$MAJOR"
LSNLSRTL="-lsnls$MAJOR"

LCORE="-lcore$MAJOR"		# CORE

LXDK="-lxml$MAJOR"		# XML

LSQL="-lsql$MAJOR"		# Precomp

LPLSQL="-lpls$MAJOR"		# PL/SQL
LSLAX="-lslax$MAJOR"
LPLP="-lplp$MAJOR"

LMM="-lmm"			# RDBMS
LCLIENT="-lclient$MAJOR"
LCOMMON="-lcommon$MAJOR"
LGENERIC="-lgeneric$MAJOR"
LVSN="-lvsn$MAJOR"

LLDAP="-lldapclnt$MAJOR"	# LDAP

LNNET_ON="-lnnet$MAJOR"		# Native Net
LNNET_OFF="-lnnetd$MAJOR"
LSKGXP="-lskgxp$MAJOR"

LZTGSS="-lztkg$MAJOR"
LNENT=				# Network
[ -r $OLIB/libnent$MAJOR.a ] && LNENT="-lnent$MAJOR"
LNZ=				# NZ
[ -r $OLIB/libnnz$MAJOR.so ] && LNZ="-lnnz$MAJOR -lzt$MAJOR"
LNCRYPT="-lnsslb$MAJOR -lncrypt$MAJOR -ln$MAJOR -lnl$MAJOR -lnro$MAJOR $LZTGSS"
LNETONLY="-ln$MAJOR"
LNETWORK="`cat $OLIB/ldflags` $LNENT $LNZ $LNCRYPT"

#------------------------------------------------------------------------------ 
# Utility functions
#------------------------------------------------------------------------------ 

# Error: Print an error message and exit
###
Error () {
    Status=$1
    Msg="$2"
    echo "$PROGRAM: $Msg" 1>&2
    exit $Status
}

# Check_Status: Check an exit status, if non-zero, raise an error
###
Check_Status () {
    Status=$1
    Msg="$2"
    [ $Status -ne 0 ] && Error $Status "$Msg"
}

# Remove_File: Remove a file verifying it has been removed
###
Remove_File () {
    File=$1
    /bin/rm -f $File
    [ ! -r $File ]
    Check_Status $? "Failed to remove $File"
}

# listf2: List the required symbols from the given shrept.lst file
###
listf2 () {
    entryList=$1
    product=$2
    grep -v '#' $entryList | grep "$product  *:" | \
	    awk '{ printf (" -u %s", $3); }'
}

# listf: List the required symbols from a product's shrept.lst file
###
listf () {
    listf2 $ORACLE_HOME/$1/admin/shrept.lst $1
}

#------------------------------------------------------------------------------ 
# Main program starts here
#------------------------------------------------------------------------------ 

# Each product *must* provide a $PRODUCT/admin/shrept.lst
###
ErrFiles=
for product in rdbms precomp plsql ldap network; do
    SHREPT=$ORACLE_HOME/$product/admin/shrept.lst
    [ ! -f $SHREPT ] && ErrFiles="$ErrFiles $SHREPT"
done
[ "$ErrFiles" ] && Error 1 "$PROGRAM: Could not locate $ErrFiles"

# Create lists of symbols to pass to ld
###
if [ "$OSDK_BASE" ]; then
    SYMS_NLS="-bnogc $LNLSRTL $LUNLSRTL $LSNLSRTL -bgc"
    SYMS_CORE="-bnogc $LCORE -bgc"
    SYMS_XDK="`listf2 $OSDK_BASE_SHREPT xdk` $LXDK"

    LD_OBJS=""
    LD_SYMS="$SYMS_NLS $SYMS_CORE $SYMS_XDK"
    OLIBS="$LNETONLY $OLIB/libnnz$MAJOR.a"
else
    # Oracle library dependencies
    ###
    if [ -z "$LIB32" ]; then
      XAONDY="$ORACLE_HOME/rdbms/lib/xaondy.o"
    else
      XAONDY="$ORACLE_HOME/rdbms/lib32/xaondy.o"
    fi
    NAUTAB="$OLIB/nautab.o"
    NAETAB="$OLIB/naeet.o $OLIB/naect.o"
    NAEDHS="$OLIB/naedhs.o" 

    SYMS_RDBMS_AIX=" -u skgfgb0off"
    SYMS_OCIC="`listf rdbms` `listf2 $OSDK_SHREPT rdbms` $SYMS_RDBMS_AIX \
               $LCLIENT $LGENERIC"
    SYMS_SQL="`listf precomp` `listf2 $OSDK_SHREPT precomp` $LSQL"
    SYMS_PLSQL="`listf plsql` `listf2 $OSDK_SHREPT plsql` $LPLSQL"
    SYMS_SLAX="`listf2 $OSDK_SHREPT slax` $LSLAX"
    SYMS_LDAP="`listf ldap` `listf2 $OSDK_SHREPT ldap` $LLDAP"
    SYMS_NETWORK="`listf network` `listf2 $OSDK_SHREPT network` $LNETWORK"
    SYMS_XDK="`listf2 $OSDK_BASE_SHREPT xdkjni` \
		`listf2 $OSDK_SHREPT xdkjni` $LXDK"

    LD_OBJS="$NAUTAB $NAETAB $NAEDHS"
    LD_SYMS="$SYMS_XDK $SYMS_SQL $SYMS_PLSQL $SYMS_SLAX\
	     $SYMS_OCIC $SYMS_LDAP $SYMS_NETWORK"
    OLIBS="$LCLIENT $LSQL $LVSN $LNETWORK $LCLIENT \
	   $LCOMMON $LGENERIC $LMM $XAONDY $LNETWORK $LCLIENT $LCOMMON \
	   $LGENERIC $LTRACE $LNNET_ON $LSKGXP"

fi

# Create library
###
echo "Creating $LD_DEST"
Remove_File $LIB_DIR/$OSDK_LIB
$LD $LD_RUNTIME $LD_OPT $LD_OUT $LD_SELF_CONTAINED $BASE_LIB \
	$LD_OBJS $LD_SYMS $OLIBS $SYSLIBS $USRLIBS 2>&1 \
	| grep -v "already exported"
Check_Status $? "Failed to link $OSDK_LIB"
(cd $LIB_DIR; ls -l $OSDK_LIB)

# .so -> .so.11.1 is not needed on AIX

#Below has been commented to clean up 32bit reference
#if [ -z "${SRCHOME}" -a -d ${ORACLE_HOME}/lib32 ]
#then
#	if [ -z "$LOOP" ] 
#	then
#		${ORACLE_HOME}/bin/genorasdksh $ARGUMENTS lib32
#        fi
#fi

exit 0
