#!/bin/sh
#
# $Header: buildtools/scripts/genagtsh.sh /stpl_db_11.2.0_aix.ppc32/2 2010/08/26 03:39:37 vlakkund Exp $
#
# genagtsh.sh
#
# Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 
#
#    NAME
#      genagtsh.sh - Generate an agent shared library
#
#    DESCRIPTION
#
#  Invocation:
#
#	genagtsh.sh  lib_name agent_version hs_driver
#
#	lib_name:	Filename of library to generate;
#			typically, $(LIBAGTSH) as used in the
#			RDBMS Makefile.  E.g., "libagtsh.so"
#
#	lib_version:	Version of the shared library
#
#			On UNIX ".agent_version" is appended to
#			the shared-library filename.  E.g., "1.0"
#
#
#    NOTES
#	This is a remote descendent of the script used to generate
#	the client shared library, libclntsh.so.
#
#    MODIFIED   (MM/DD/YY)
#    vlakkund    08/26/10 - Bug 9182380 : backport
#                           'vlakkund_bug-9182380_main_2' to 11202
#    vlakkund    07/23/10 - Bug 9182380
#    vlakkund    04/06/09 - bug 8410300 : Set OBJECT_MODE before nm call
#    nmuthukr    04/01/09 - bug_8393820 : Fix object mode
#    akaimale    09/13/07 - Generate shared object using -G flag
#    akaimale    04/17/07 - remove symbols exported directly from this script
#			    and move them to agtept.lst
#    anandsri    04/12/07 - 10->11
#    spattnay    04/10/07 - Bug/5982677
#    spattnay    03/01/07 - Bugz#21064
#    dosulliv    10/09/03 - 
#    dosulliv    06/09/03 - 
#    dosulliv    03/13/03 - 
#    jtao        02/27/03 - 
#    jtao        02/13/03 - 
#    plebld      12/06/02 - change core9 to core10
#    ycao        09/17/02 - add libsnls9
#    jtao        09/26/02 - 
#    tkarren     09/25/02 - Add -lnnz9 flag
#    jtao        06/06/02 - 
#    sawadhwa    12/19/01 - Disable post-wait kernel extension in AIX5L
#    mkrohan     11/08/00 - Search for product 9 libraries
#    mkrohan     10/26/00 - Update to version 9
#    mkrohan     05/26/00 - Branched as an OSD
#    pravelin    02/01/00 - Use platform-specific library if available
#    inetwork    11/26/98 - Adding additional Network libraries
#    mluong      08/28/98 -
#    mluong      08/27/98 - change -lextp8 to -lpls8
#    mluong      06/22/98 -
#    mluong      06/09/98 -
#    mluong      06/05/98 - agent to agent8
#    mluong      06/04/98 - change core and nlsrtl name
#    mluong      06/02/98 - CDM 2 - plsql
#    mluong      05/29/98 - CDM 2 - network
#    pravelin    03/17/98 - Eliminate directory path from ld -h operand
#    pravelin    02/05/98 - If in ADE replace .so symlink with actual file
#    pravelin    02/05/98 - Fix typo causing ADE build problems
#    jdoskow     01/28/98 -
#    pravelin    10/30/97 - Script to build an agent shared library
#    pravelin    10/30/97 - Creation
#

#  Set shell variables from script parameters
if [ "$1" = "-32" ]; then
    LIB_NAME=$2                     # Library name
    LIB_VER=$3                      # Library version number
    LIB=lib
else
    LIB_NAME=$1                     # Library name
    LIB_VER=$2                      # Library version number
    LIB=lib
fi
RDBMS_VER=11





trap '/bin/rm -f $EXPORT_LIST ; exit 1'  1 2 15

#  Function to list symbols required in shared library

listf_agent() {
	entryList=${AGENT_SYMS}
	grep -v '#' $entryList | grep rdbms | awk '{print $3}'
}


# Function used to convert lists of symbols to proper format for linker

fmt_syms() { awk '/[ \t]*#/	{next}\
				{printf " -u %s", $1}' ; }


generate_export_list()
{
    if [ $# != 1  -a $# != 2 ] ; then
        echo "Error: wrong number of arguments to generate_export_list." >&2
        echo "       1 argument required, 1 optional, $# supplied." >&2
        return 1
    fi

    if [ ! -r "$1" ] ; then
        echo "$0 Error: generate_export_list unable to read library $1." >&2
        echo "          Please check the permissions and try again." >&2
        return 2
    fi

    if [ $# = 2 ] ; then
        GREP_STRING="egrep $2"
    else
        GREP_STRING=cat
    fi

    /bin/nm -B -h -g "$1" | grep -v '\- U ' | awk '{print $3}' | \
       egrep -v '^\.|^TOC' |sort | $GREP_STRING |uniq

    return 0
}


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



if [ "$SRCHOME" != "" ]; then
	LIB_DIR=${SRCHOME}/rdbms/${LIB}		# lib. destination directory
else
	LIB_DIR=${ORACLE_HOME}/${LIB}		# lib. destination directory
fi


#  Related variables
AGENT_LIB=${LIB_NAME}.${LIB_VER}		# actual library file name
AGENT_LIBNAME=`basename ${LIB_NAME}`            # base lib name without version
AGENT_SYMS="${ORACLE_HOME}/rdbms/admin/agtept.lst" # list of symbols to force
EXPORT_LIST=${LIB_DIR}/agtsh.exp
LIBAGENT=${LIB_DIR}/libagent${RDBMS_VER}.a

IS64BIT=`file ${ORACLE_HOME}/${LIB}/nautab.o | grep XCOFF`;
if [ -z "$IS64BIT" ]
then
  LDOBJSZ=-b32
  OBJECT_MODE=32
else
  LDOBJSZ=-b64
  OBJECT_MODE=64
fi

export OBJECT_MODE

# Create lists of symbols to pass to ld
/bin/rm -f $EXPORT_LIST
listf_agent > $EXPORT_LIST ||exit 4

# Identify OSD library, if any, needed for this platform.
# Do this only if a get_platform executable exists in $ORACLE_HOME/bin
# and libagent${RDBMS_VER}_$PLATFORM.{any extension} exists in $ORACLE_HOME/lib.

if [ -x ${ORACLE_HOME}/bin/get_platform ]; then
    PLATFORM=`${ORACLE_HOME}/bin/get_platform`
    if [ -s ${ORACLE_HOME}/${LIB}/lib${PLATFORM}.* ]; then
        AGENT_OSD_LIB="-lagent${RDBMS_VER}_${PLATFORM}"
    #  else leave $AGENT_OSD_LIB undefined
    fi
fi



generate_export_list $LIBAGENT '^hos' >> $EXPORT_LIST || exit 1

# If in ADE, the library may be a symlink to the label server.
# If so, pull it over...

AGENT_LIBFILE=`basename ${AGENT_LIB}`		# lib filename without path
AGENT_LIBPATH=${LIB_DIR}/${AGENT_LIBFILE}       # lib path for ADE link

if [ -h ${AGENT_LIBPATH} ]; then
        echo "copying ${AGENT_LIBFILE} to local disk"
	cp -p ${AGENT_LIBPATH} ${AGENT_LIBPATH}.tmp
	rm -f ${AGENT_LIPATH}
	mv ${AGENT_LIBPATH}.tmp ${AGENT_LIBPATH}
	chmod +w ${AGENT_LIBPATH}
fi

LNNET="-lnnet${RDBMS_VER}"
LSQL="-lsql${RDBMS_VER}"
LPLSQL=-lpls${RDBMS_VER}
LAGENT=-lagent${RDBMS_VER}
LMM="-lmm"
LCLIENT="-lclient${RDBMS_VER}"
LGENERIC="-lgeneric${RDBMS_VER}"
LNLSRTL="-lnls${RDBMS_VER}"
LSNLSRTL="-lsnls${RDBMS_VER}"
LUNLSRTL="-lunls${RDBMS_VER}"
LCORE="-lcore${RDBMS_VER}"
LCOMMON=-lcommon${RDBMS_VER}
LXML="-lxml${RDBMS_VER}"
LLDAP="-lldapclnt${RDBMS_VER} -lnldap${RDBMS_VER} -lztkg${RDBMS_VER}"
LNETWORK="-lntcp${RDBMS_VER} ${LLDAP} -lnhost${RDBMS_VER} -lntns${RDBMS_VER} -lnoname${RDBMS_VER} -ln${RDBMS_VER} -lncrypt${RDBMS_VER} -lnbeq${RDBMS_VER} -lnus${RDBMS_VER} -lntcps${RDBMS_VER} -lnl${RDBMS_VER} -lnro${RDBMS_VER} -lntcp${RDBMS_VER} ${LLDAP} -lnhost${RDBMS_VER} -lntns${RDBMS_VER} -lnoname${RDBMS_VER} -lnsslb${RDBMS_VER} -ln${RDBMS_VER} -lnbeq${RDBMS_VER} -lnl${RDBMS_VER} -lnnz${RDBMS_VER} -lzt${RDBMS_VER}"

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

SHARED_OBJ=$LIB_DIR/shr.o

# Linker command and options


LD="ld -bnoentry -bhalt:5 -L$ORACLE_HOME/$LIB"
LD_OPT="-bE:$EXPORT_LIST $AIXIMP -bM:SRE -G ${LDOBJSZ}"       # name inserted into library
LD_OUT="-o $SHARED_OBJ"                          # output specification

NAUTAB="${ORACLE_HOME}/${LIB}/nautab.o"
NAETAB="${ORACLE_HOME}/${LIB}/naeet.o ${ORACLE_HOME}/${LIB}/naect.o"
NAEDHS="${ORACLE_HOME}/${LIB}/naedhs.o"
SYSLIBS=`cat ${ORACLE_HOME}/${LIB}/sysliblist`
LDFLAGS=`cat ${ORACLE_HOME}/${LIB}/ldflags`
OLIBS="${LCLIENT} ${LSQL} ${LNETWORK} ${LCLIENT} ${LCOMMON} ${LGENERIC} ${LMM} ${LNLSRTL} ${LCORE} ${LNLSRTL} ${LCORE} ${LNLSRTL} ${LNETWORK} ${LCLIENT} ${LCOMMON} ${LXML} ${LGENERIC} ${LNLSRTL} ${LCORE} ${LNLSRTL} ${LCORE} ${LNLSRTL} ${LPLSQL} ${LNNET}"


# Create shared object
${LD} ${LD_OPT} ${LD_OUT} ${NAFLAGS} ${NAUTAB} ${NAETAB} \
${NAEDHS} ${OLIBS} ${SYSLIBS} ${AGENT_OSD_LIB} ${LAGENT} \
${LPLS} -ldl ${LNETWORK} ${LNLSRTL} ${LSNLSRTL} ${LCORE} ${LCOMMON} ${LCORE} \
${LNLSRTL} ${LSNLSRTL} ${LSNLSRTL} ${LUNLSRTL} ${LDFLAGS}

# Create .a library, if the input file is .so, change it to .a
if [ `basename $LIB_NAME .so` != `basename $LIB_NAME` ]; then
        LIB_NAMEA=`dirname $LIB_NAME`/`basename $LIB_NAME .so`.a
        ar crl $LIB_NAMEA $SHARED_OBJ
        # Link $LIB_NAME to avoid Makefile calling this script everytime
        ln -sf $LIB_NAMEA $LIB_NAME
else
	LIB_NAME_TMP=${LIB_DIR}/`basename $LIB_NAME`
	rm -f $LIB_NAME_TMP
        ar crl $LIB_NAME $SHARED_OBJ
fi
/bin/rm -f $SHARED_OBJ

exit 0
