742ca58
#!/bin/sh
742ca58
# find rpm provides and requires for Haskell GHC libraries
742ca58
742ca58
# To use add the following lines to spec file:
742ca58
#   %define _use_internal_dependency_generator 0
c81c656
#   %define __find_requires /usr/lib/rpm/ghc-deps.sh --requires %{buildroot}%{ghclibdir}
c81c656
#   %define __find_provides /usr/lib/rpm/ghc-deps.sh --provides %{buildroot}%{ghclibdir}
742ca58
c81c656
[ $# -ne 2 ] && echo "Usage: `basename $0` [--provides|--requires] %{buildroot}%{ghclibdir}" && exit 1
742ca58
742ca58
MODE=$1
7232a81
PKGBASEDIR=$2
7232a81
PKGCONFDIR=$PKGBASEDIR/package.conf.d
0b163b3
GHC_VER=$(basename $PKGBASEDIR | sed -e s/ghc-//)
0b163b3
0b163b3
if [ ! -x "/usr/bin/ghc-pkg-${GHC_VER}" -a -x "$PKGBASEDIR/ghc-pkg" ]; then
0b163b3
    GHC_PKG="$PKGBASEDIR/ghc-pkg --global-conf=$PKGCONFDIR"
0b163b3
else
1b8536a
    GHC_PKG="/usr/bin/ghc-pkg"
0b163b3
fi
742ca58
2f1663e
case $MODE in
2f1663e
    --provides) FIELD=id ;;
2f1663e
    --requires) FIELD=depends ;;
2f1663e
    *) echo "`basename $0`: Need --provides or --requires" ; exit 1
2f1663e
esac
2f1663e
cd30bb3
if [ -d "$PKGBASEDIR" ]; then
cd30bb3
  SHARED=$(find $PKGBASEDIR -type f -name '*.so')
cd30bb3
fi
1f4312a
a1abcaa
GHCVERSION=$(ghc --numeric-version)
a1abcaa
742ca58
files=$(cat)
742ca58
7232a81
#set -x
742ca58
a1abcaa
for i in $files; do
1f4312a
    LIB_FILE=$(echo $i | grep /libHS | egrep -v "$PKGBASEDIR/libHS")
8af86b7
    if [ "$LIB_FILE" ]; then
1f4312a
	if [ -d "$PKGCONFDIR" ]; then
1f4312a
	    META=""
1f4312a
	    SELF=""
1f4312a
	    case $LIB_FILE in
1f4312a
		*.so) META=ghc ;;
1f4312a
		*.a) META=ghc-devel
8af86b7
		    if [ "$SHARED" ]; then
1f4312a
			SELF=ghc
1f4312a
		    fi
1f4312a
		    ;;
1f4312a
	    esac
8af86b7
	    if [ "$META" ]; then
1f4312a
		PKGVER=$(echo $LIB_FILE | sed -e "s%$PKGBASEDIR/\([^/]\+\)/libHS.*%\1%")
0b163b3
		HASHS=$(${GHC_PKG} -f $PKGCONFDIR field $PKGVER $FIELD | sed -e "s/^$FIELD: \+//")
1f4312a
		for i in $HASHS; do
1f4312a
		    case $i in
7ffdbdc
			*-*) echo "$META($i)" ;;
1f4312a
			*) ;;
1f4312a
		    esac
1f4312a
		done
8af86b7
		if [ "$MODE" = "--requires" -a "$SELF" ]; then
0b163b3
		    HASHS=$(${GHC_PKG} -f $PKGCONFDIR field $PKGVER id | sed -e "s/^id: \+//")
1f4312a
		    for i in $HASHS; do
7ffdbdc
			echo "$SELF($i)"
1f4312a
		    done
1f4312a
		fi
1f4312a
	    fi
1f4312a
	fi
1f4312a
    elif [ "$MODE" = "--requires" ]; then
1f4312a
	if file $i | grep -q 'executable, .* dynamically linked'; then
1f4312a
	    BIN_DEPS=$(ldd $i | grep libHS | grep -v libHSrts | sed -e "s%^\\tlibHS\(.*\)-ghc${GHCVERSION}.so =.*%\1%")
1f4312a
	    for p in ${BIN_DEPS}; do
1b8536a
		HASH=$(${GHC_PKG} --global --package-conf=$PKGCONFDIR field $p id | sed -e "s/^id: \+//")
7ffdbdc
		echo "ghc($HASH)"
1f4312a
	    done
1f4312a
	fi
7232a81
    fi
a1abcaa
done
742ca58
742ca58
echo $files | tr [:blank:] '\n' | /usr/lib/rpm/rpmdeps $MODE