#! /usr/bin/env /bin/ksh
# Copyright 1999-2018 Gentoo Foundation; Distributed under the GPL v2

# Upon '-soname' and similar flags, create a "shared library" on AIX being an
# archive file containing an Import File and the shared object file, as in:
# http://lists.gnu.org/archive/html/libtool/2011-01/msg00023.html
# with updates in:
# http://lists.gnu.org/archive/html/libtool/2011-02/msg00000.html
#
# This helper script is meant not depend on anything Gentoo specific.

ld=/usr/ccs/bin/ld
ar=/usr/ccs/bin/ar
strip=/usr/ccs/bin/strip
dump=/usr/sbin/dump
awk=/usr/bin/awk
rm=/usr/bin/rm
mkdir=/usr/bin/mkdir
mv=/usr/bin/mv
ln=/usr/bin/ln

oldargs=
output=
soname=
newargs=
OBJECT_MODE=${OBJECT_MODE:-32}

while [[ $# -gt 0 ]]
do
	arg=$1
	shift
	case ${arg} in
	-rpath=*)
		arg="-R${arg#-rpath=}"
	;;
	esac
	oldargs="${oldargs} '${arg}'"
	case ${arg} in
	-o)
		newargs="${newargs} -o '$1'"
		output=$1
		oldargs="${oldargs} '$1'"
		shift
		;;
	-bM:SRE)
		newargs="${newargs} '-G' '-bernotok'"
		;;
	-soname=*)
		soname=${arg#-soname=}
		;;
	-h*)
		soname=${arg#-h}
		;;
	-soname|-h)
		soname=$1
		shift
		;;
	-b32)
		newargs="${newargs} '${arg}'"
		OBJECT_MODE=32
		;;
	-b64)
		newargs="${newargs} '${arg}'"
		OBJECT_MODE=64
		;;
	*)
		newargs="${newargs} '${arg}'"
		;;
	esac
done

if [[ -z ${output} || -z ${soname} ]]; then
	eval "exec ${ld} ${oldargs}"
	exit 1
fi

# Running ld against the orginal target file to retain
# ld error message when there's a problem with it:
eval "${ld} -o '${output}' ${newargs}" || exit 1

workdir="${output}.$$"

${rm} -rf "${workdir}" || exit 1
trap "${rm} -rf '${workdir}'" 0

case ${soname} in
*\(*\))
	shro=${soname#*\(}
	shro=${shro%\)}
	shri=${shro%.*}.imp
	;;
*\[*\])
	shro=${soname#*\[}
	shro=${shro%\]}
	shri=${shro%.*}.imp
	;;
none) # loadable only module, not linkable: no import file
	shro='shr.o'
	soname="${output##*/}(${shro})"
	shri=
	;;
auto)
	shro='shr.o'
	soname=${output##*/}
	if [[ ${soname} == lib*.so* ]]; then
		# linkable library: need import file
		shri=${shro%.*}.imp
	else
		# loadable only module, not linkable: no import file
		shri=
	fi
	soname="${soname}(${shro})"
	;;
*)
	shro='shr.o'
	shri=${shro%.*}.imp
	soname="${soname}(${shro})"
	;;
esac

export OBJECT_MODE

${mkdir} "${workdir}" || exit 1
${strip} -e "${output}" || exit 1
if [[ -n ${shri} ]]; then
	${dump} -Tv "${output}" > "${workdir}"/syms || exit 1
	${awk} '
		BEGIN {
			print "#! '"${soname}"'"
			print "# '"${OBJECT_MODE}"'"
		}
		{
			if ($4 == "EXP" || $4 == "ImpExp") {
				print $8
			} else
			if ($4 == "wEXP") {
				print $8" weak"
			}
		}' <"${workdir}"/syms > "${workdir}"/${shri} || exit 1
fi
${mv} "${output}" "${workdir}/${shro}" || exit 1
${ar} rc "${output}" ${shri:+"${workdir}/${shri}"} "${workdir}/${shro}" || exit 1
exit 0
