#!/bin/bash

###################################################################
# This script does the following: for implemented platforms,      #
# it echos for each given path a line with the following format:  #
#                                                                 #
#  <arch>;<obj>;<soname>;<rpath1:rpathN>;<needed1,neededN>        #
#                                                                 #
# arch may be any string, e.g. "PE32". obj is the full (!) path   #
# to the file itself. soname, rpath and needed should be self     #
# explaining - rpath is ":" separated, needed is "," separated.   #
#                                                                 #
# WARNING: Depends on CHOST argument to decide what to do!        #
#                                                                 #
# WARNING: The Script does _never_ fail! If required binaries     #
#          are missing, or information gathering fails, the       #
#          script will SILENTLY (!) exit, to not disturb the      #
#          normal merging process.                                #
#                                                                 #
# WARNING: The _first_ argument needs to be a valid CHOST!!!      #
#                                                                 #
###################################################################


# Interix: Uses native objdump, since thats the only facility that
# knows about the native shared library information data.
# objdump is there in all interix installations where the GNU SDK
# is installed, which is a prerequisite for prefix anyway.

scanbin_interix() {
	local _itx_objdump="/opt/gcc.3.3/bin/objdump"
	[[ -x ${_itx_objdump} ]] || _itx_objdump="/opt/gcc.4.2/bin/objdump"
	[[ -x ${_itx_objdump} ]] || exit 0

	# objdump is there, so now gather the information
	_itx_full_info() {
		local obj="$(cd "$(dirname "$1")"; pwd)/${1##*/}"
		local so=
		local rp=
		local ne=

		{ file -L "${obj}" | grep "PE" > /dev/null 2>&1; } || return

		_itx_gather() {
			${_itx_objdump} -p "$1" | while IFS= read line; do
				[[ ${line} == *RPATH* || ${line} == *NEEDED* || ${line} == *SONAME* ]] || continue

				eval "$(echo "${line}" | sed -e 's,[[:space:]]*\([A-Z]*\)[[:space:]]*\(.*\)$,key=\1;value="\2",g')"

				case "${key}" in
				RPATH) echo "rp=\"${value}\"" ;;
				NEEDED) echo "test -n \"\${ne}\" && ne=\"\${ne},${value}\"; test -z \"\${ne}\" && ne=\"${value}\"" ;;
				SONAME) echo "so=\"${value}\"" ;;
				esac
			done
		}

		eval "$(_itx_gather ${obj})"
		echo "386;${obj};${so};${rp};${ne}"
	}

	for x in "$@"; do
		_itx_full_info "${x}"
	done

	exit 0
}


# Native Windows: Uses the winnt compiler ("parity") to gather
# information. parity is the only one knowing about the location
# and format of the relevant data, and it is there always when
# wanting to build native win32 executables.

scanbin_winnt() {
	local _winnt_inspector="$(type -P "parity.inspector")"
	[[ -x ${_winnt_inspector} ]] || exit 0

	_winnt_full_info () {
		local obj="$(cd "$(dirname "$1")"; pwd)/${1##*/}"

		{ file -L "${obj}" | grep "PE" > /dev/null 2>&1; } || exit 0

		# parity.inspector in --raw mode has exactly the format we
		# want - wonder, wonder, i implemented that switch :)

		local info="$(${_winnt_inspector} --raw "${obj}")"
		echo "386;${obj};${info}"
	}

	for x in "$@"; do
		_winnt_full_info "${x}"
	done
}

# CHOST is the first argument!
_chost=$1

# verify CHOST...
[[ -z ${_chost} ]] && { echo "CHOST not set!!"; exit 1; }
[[ ${_chost} == *-*-* ]] || { echo "invalid CHOST!!"; exit 1; }
shift

case "${_chost}" in 
*-interix*) scanbin_interix "$@" ;;
*-winnt*) scanbin_winnt "$@" ;;
esac

