#!/bin/sh
#
# $Id: genclntsh.sh /stpl_db_11.2.0_aix.ppc64/3 2011/10/03 09:59:17 sksamudr Exp $
# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. 
#
# genclntsh.sh	(for Solaris 2.x)
# Script to create single shared client library for OCI, Pro*C, and XA
#
#  MODIFIED   (MM/DD/YY)
#  sksamudr    09/30/11 - bug 12916349: Reverting back the fix
#  sksamudr    08/30/11 - bug 12916349
#  akaimale    09/11/09 - Generate shared archive on AIX
#  akaimale    02/23/09 - Remove 32bit related stuff.
#  spattnay    12/05/08 - Clean up 32bit Refernece
#  rakkayaj    05/18/07 - Bug 5858821: resolving undefined symbols in
#                         Precompiler applications
#  jboyce      02/13/07 - 10->11
#  rpingte     03/01/07 - export everything from CORE and NLS
#  spattnay    03/08/07 - Bugz#21162
#  tnallath    08/31/06 - add gssapi library
#  ppallapo    05/09/06 - Use OBJECT_MODE to set ld options
#  ppallapo    04/19/06 - Use libnnz10.a for now.
#  tnallath    03/15/06 - Remove libnsslb
#  chesrini    03/23/06 - bugz/10939
#  tnallath    12/22/05 - new library libzt10 
#  slahoran    10/15/05 - Use libnnz.so for bugs 4417594 & 4417542
#  ppallapo    06/23/05 - Add roptr specific linker options.
#  slahoran    06/20/05 - Add version number to libclntsh.so name
#  ppallapo    08/11/04 - Add xdk symbols to export 
#  mosulliv    11/12/03 - merges for 031111 
#  mkrohan     10/28/03 - Do not auto generate static client library
#  ajgupta     07/24/03 -
#  jboyce      06/27/03 - remove xsd dependency (3024453)
#  jtao        02/27/03 - 
#  jboyce      11/20/02 - remove reference to $(SRCHOME)/lib/libcore9.a
#  mkrohan     11/14/02 - Use 10 libraries where available
#  mkrohan     11/21/02 - Remove wtc
#  vsridhar    12/05/02 - build ttsh as part of clntsh
#  jboyce      11/20/02 - remove reference to $(SRCHOME)/lib/libcore9.a
#  mkrohan     11/14/02 - Use 10 libraries where available
#  tkarren     11/07/02 - Make LNZ a lib.a file
#  jtao        10/29/02 - 
#  jciminsk    10/09/02 - refine native net linking
#  ycao        09/12/02 - Add LSNLSRTL into the shared lib
#  jtao        09/26/02 - 
#  juli        09/06/02 - 
#  jtao        05/23/02 - 
#  jciminsk    04/03/02 - add native net/skgxp
#  sawadhwa    12/19/01 - Disable post-wait kernel extension in AIX5L
#  sichandr    07/11/01 - add XDK
#  mkrohan     03/05/01 - Remove echo
#  mkrohan     03/05/01 - Drop libnent9
#  mkrohan     12/13/00 - Fix symlinking
#  mkrohan     12/07/00 - Final cleanup
#  mkrohan     11/27/00 - Add support static library map file
#  mkrohan     11/08/00 - Search for product 9 libraries
#  mkrohan     10/26/00 - Update to version 9
#  rachacos    11/25/98 - use naming adapter libraries
#  rachacos    07/30/98 - use GS LDAP package
#  hpiao       11/12/97 - Make libcommon$$.a writable
#  jweisz      06/30/97 - ADE support: if lib is symlink, copy it
#  mluong      05/30/97 - Read entry points from $PRODUCT/admin/shrept.lst
#  hpiao       04/04/97 - Modify for 803
#  dkozlows    05/01/95 - File created
#

#Below has been commented to clean up 32bit reference
#if [ "$1" = "-32" ] ; then
#    LIB=lib32
#    LOOP="DONE"
#    OBJECT_MODE=32
#else
#    LIB=lib
#    # Set object mode in customer environment
#    [ -z "${SRCHOME}" ] && OBJECT_MODE=64
#fi

LIB=lib
# Set object mode in customer environment
[ -z "${SRCHOME}" ] && OBJECT_MODE=64
export OBJECT_MODE


#
# List the required symbols from a product's shrept.lst file
listf () {
	product=$1
	entryList=$ORACLE_HOME/$product/admin/shrept.lst
	grep -v '#' $entryList | \
		grep $product | \
		awk '{ printf ("%s\n", $3); }'
}

#
# Main line starts here
#

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

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

EXPORT_LIST=${ORACLE_HOME}/${LIB}/clntsh.exp
SHARED_OBJ=${ORACLE_HOME}/${LIB}/shr.o
/bin/rm -f $EXPORT_LIST $SHARED_OBJ  

#
# 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
	if [ ! -f $SHREPT ]
	then
		ErrFiles="$ErrFiles $SHREPT"
	fi
done
if [ ! -z "$ErrFiles" ]
then
	echo "genclntsh: Could not locate $ErrFiles" 1>&2
	echo "genclntsh: exiting ..." 1>&2
	exit 1
fi

#
# library definitions

# OLIB: temp variable for v9 checking
OLIB=${ORACLE_HOME}/${LIB}
LIBVER="11"
# Precomp
LSQL="-lsql$LIBVER"

# PL/SQL
LPLSQL="-lpls$LIBVER"

# RDBMS
LMM="-lmm"
LCLIENT="-lclient$LIBVER"
LCOMMON="-lcommon$LIBVER"
LGENERIC="-lgeneric$LIBVER"

# NLSRTL & CORE
LNLSRTL="-lnls$LIBVER"
LUNLSRTL="-lunls$LIBVER"
LSNLSRTL="-lsnls$LIBVER"
LCORE="-lcore$LIBVER"
LXDK="-lxml$LIBVER"

# OTrace
#LTRACE="-ltrace9"
#[ -r ${OLIB}/libtrace10.a ] && LTRACE="-ltrace10"

# LDAP
LLDAP="-lldapclnt$LIBVER"

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

# Network
LDFLAGS="`cat ${ORACLE_HOME}/lib/ldflags`"
LNENT=
[ -r ${OLIB}/libnent$LIBVER.a ] && LNENT="-lnent$LIBVER"
# NZ
LNZ=
[ -r ${OLIB}/libnnz$LIBVER.so ] && LNZ="${OLIB}/libnnz$LIBVER.a ${OLIB}/libzt$LIBVER.a"
LNCRYPT="-lncrypt$LIBVER -ln$LIBVER -lnl$LIBVER -lnro$LIBVER"
LZTGSS="-lztkg$LIBVER"
LNETWORK="${LDFLAGS} ${LNENT} ${LNZ} ${LNCRYPT} ${LZTGSS} ${LDFLAGS}"


OSV=`/usr/bin/uname -v`
if [ "$OSV" = "4" ]; then
    AIXIMP="-bI:${ORACLE_HOME}/lib/pw-syscall.exp"
fi

#
# Create lists of symbols to pass to ld
SYMS_NLS="-bkeepfile:${OLIB}/libnls$LIBVER.a -bkeepfile:${OLIB}/libunls$LIBVER.a -bkeepfile:${OLIB}/libsnls$LIBVER.a"
SYMS_CORE="-bkeepfile:${OLIB}/libcore$LIBVER.a"
listf rdbms >> $EXPORT_LIST || exit 5
listf precomp >> $EXPORT_LIST || exit 6
listf plsql >> $EXPORT_LIST || exit 7
listf ldap >> $EXPORT_LIST || exit 8
listf network >> $EXPORT_LIST || exit 9
listf xdk >> $EXPORT_LIST || exit 10

if [ -r ${ORACLE_HOME}/lib/ocs.exp ]; then
    cat ${ORACLE_HOME}/lib/ocs.exp >> $EXPORT_LIST
fi

#
# Library names and locations
CLNT_NAM=clntsh					# (short) library name
CLNT_VER=$LIBVER.1                                   # library version number
CLNT_LIB=lib${CLNT_NAM}.a       		# actual library file name
CLNT_LNK=lib${CLNT_NAM}.so
CLNT_SOLIB=${CLNT_LNK}				# the new libclntsh.so 

#

LIB_DIR=${ORACLE_HOME}/${LIB}

if [ ! -z "$SRCHOME" ]
then
    TEMP_DIR="`ls -l ${SRCHOME}/${LIB}/${CLNT_LIB} 2>/dev/null | cut -f2 -d\> | cut -f3-4 -d/ `"
    if [ ! -z "$TEMP_DIR" ]
    then
        LIB_DIR=$SRCHOME/${TEMP_DIR}
    else
        LIB_DIR=${SRCHOME}/rdbms/${LIB} # lib. destination directory
    fi
fi
#
# If in ADE, the library may be a symlink to the label server.  If so,
# pull it over...
if [ -h ${LIB_DIR}/${CLNT_LIB} ]
then
        echo "Copying ${CLNT_LIB} to local disk"
	cp -p ${LIB_DIR}/${CLNT_LIB} ${LIB_DIR}/${CLNT_LIB}.tmp
	rm -f ${LIB_DIR}/${CLNT_LIB}
	mv ${LIB_DIR}/${CLNT_LIB}.tmp ${LIB_DIR}/${CLNT_LIB}
	chmod +w ${LIB_DIR}/${CLNT_LIB}
fi


# Define the name of the map file
MAPFILE=${LIB_DIR}/${CLNT_NAM}.map

#
# Linker command and options
LD="ld -m -bnoentry -bhalt:5 -L$ORACLE_HOME/${LIB} -L/usr/lib -L/lib -bnoipath"

if [ "${OBJECT_MODE}" = "32" ] ; then
      LD_OPT="-bpT:0x10000000 -bpD:0x20000000 -bforceimprw -bE:$EXPORT_LIST \
              $AIXIMP -bM:SRE -bexpall"       # shared object flags
else
      LD_OPT="-bpT:0x100000000 -bpD:0x110000000 -bforceimprw -bE:$EXPORT_LIST \
              $AIXIMP -bM:SRE -bexpall"       # shared object flags  
fi

LD_OUT="-o ${SHARED_OBJ}"                     # output specification
LD_SELF_CONTAINED=


#
# Oracle library dependencies

NAUTAB="${ORACLE_HOME}/${LIB}/nautab.o"
NAETAB="${ORACLE_HOME}/${LIB}/naeet.o ${ORACLE_HOME}/${LIB}/naect.o"
NAEDHS="${ORACLE_HOME}/${LIB}/naedhs.o" 
XAONDY="-bI:${ORACLE_HOME}/rdbms/lib/xa.imp ${ORACLE_HOME}/rdbms/${LIB}/xaondy.o" 

OLIBS="${LCLIENT}"
OLIBS="${OLIBS} ${LSQL}"
OLIBS="${OLIBS} ${LNETWORK}"
OLIBS="${OLIBS} ${LCLIENT}"
OLIBS="${OLIBS} ${LCOMMON}"
OLIBS="${OLIBS} ${LGENERIC}"
OLIBS="${OLIBS} ${LMM}"
OLIBS="${OLIBS} ${XAONDY}"
OLIBS="${OLIBS} ${LNETWORK}"
OLIBS="${OLIBS} ${LCLIENT}"
OLIBS="${OLIBS} ${LCOMMON}"
OLIBS="${OLIBS} ${LGENERIC}"
OLIBS="${OLIBS} ${LTRACE}"
OLIBS="${OLIBS} ${LXDK}"

#
# Native net.  During a from-scratch build, when genclntsh.sh is first called,
# (before p2icd is linked) neither libnnet10.a nor libskgxp10.a
# exist.  Therefore pull in libnnetd10.a (native net disabled).
# Also, if called in a customer install (in which case libnnete10.a does not
# exist), pull in libnnetd10.a.
# Otherwise, pull in libnnet10.a.  This file is just a copy of either 
# libnnete10.a or libnnetd10.a, depending on whether native net is enabled
# or disabled.  If it's the disabled version, don't pull in libskgxp, otherwise
# do pull it in. 
#
if [ ! -r ${OLIB}/libnnet$LIBVER.a ] || [ ! -r ${OLIB}/libnnete$LIBVER.a ]
then
    OLIBS="${OLIBS} ${LNNET_OFF}"
else
    OLIBS="${OLIBS} ${LNNET_ON}"
    if ${ARPRINT} ${OLIB}/libnnet$LIBVER.a|grep kpf_stubs > /dev/null 2>&1
    then
       :
    else
       [ -r ${OLIB}/libskgxp$LIBVER.so ] && OLIBS="${OLIBS} ${LSKGXP}"
    fi
fi

SYSLIBS=`cat ${ORACLE_HOME}/${LIB}/sysliblist`

# Create shared object
/bin/rm -f ${LIB_DIR}/${CLNT_LIB} ${LIB_DIR}/${CLNT_SOLIB} ${MAPFILE} \
      ${SHARED_OBJ}

${LD} ${LD_OPT} ${LD_OUT} ${LD_SELF_CONTAINED} \
      ${NAUTAB} ${NAETAB} ${NAEDHS} ${LPLSQL} ${LLDAP} \
      ${SYMS_NLS} ${SYMS_CORE} ${OLIBS} ${SYSLIBS} ${USRLIBS} > ${MAPFILE}

# Create library
cd ${LIB_DIR}
ar crl $CLNT_LIB $SHARED_OBJ
mv $SHARED_OBJ $CLNT_SOLIB
/bin/rm -f $SHARED_OBJ 


#Below has been commented to clean up 32bit reference
# Create 32bit library and call genclntst
#if [ -z "${SRCHOME}" -a -d ${ORACLE_HOME}/lib32 -a "$LOOP" != "DONE" ]
#then
#        ${ORACLE_HOME}/bin/genclntsh -32
#fi

# generate two-task shared library
${ORACLE_HOME}/bin/genttsh

exit 0
