summaryrefslogtreecommitdiffstats
path: root/tools/ghc-rpm-macros/ghc-deps.sh
blob: 4c164d06e8c578d17608b9d94cd8c496af894d99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/sh
# find rpm provides and requires for Haskell GHC libraries

# To use add the following lines to spec file:
#   %define _use_internal_dependency_generator 0
#   %define __find_requires /usr/lib/rpm/ghc-deps.sh --requires %{buildroot}%{ghclibdir}
#   %define __find_provides /usr/lib/rpm/ghc-deps.sh --provides %{buildroot}%{ghclibdir}

[ $# -ne 2 ] && echo "Usage: `basename $0` [--provides|--requires] %{buildroot}%{ghclibdir}" && exit 1

MODE=$1
PKGBASEDIR=$2
PKGCONFDIR=$PKGBASEDIR/package.conf.d
GHC_VER=$(basename $PKGBASEDIR | sed -e s/ghc-//)

if [ ! -x "/usr/bin/ghc-pkg-${GHC_VER}" -a -x "$PKGBASEDIR/ghc-pkg" ]; then
    GHC_PKG="$PKGBASEDIR/ghc-pkg --global-conf=$PKGCONFDIR"
else
    GHC_PKG="/usr/bin/ghc-pkg"
fi

case $MODE in
    --provides) FIELD=id ;;
    --requires) FIELD=depends ;;
    *) echo "`basename $0`: Need --provides or --requires" ; exit 1
esac

if [ -d "$PKGBASEDIR" ]; then
  SHARED=$(find $PKGBASEDIR -type f -name '*.so')
fi

GHCVERSION=$(ghc --numeric-version)

files=$(cat)

#set -x

for i in $files; do
    LIB_FILE=$(echo $i | grep /libHS | egrep -v "$PKGBASEDIR/libHS")
    if [ "$LIB_FILE" ]; then
	if [ -d "$PKGCONFDIR" ]; then
	    META=""
	    SELF=""
	    case $LIB_FILE in
		*.so) META=ghc ;;
		*_p.a) META=ghc-prof SELF=ghc-devel ;;
		*.a) META=ghc-devel
		    if [ "$SHARED" ]; then
			SELF=ghc
		    fi
		    ;;
	    esac
	    if [ "$META" ]; then
		PKGVER=$(echo $LIB_FILE | sed -e "s%$PKGBASEDIR/\([^/]\+\)/libHS.*%\1%")
		HASHS=$(${GHC_PKG} -f $PKGCONFDIR field $PKGVER $FIELD | sed -e "s/^$FIELD: \+//")
		for i in $HASHS; do
		    case $i in
			*-*) echo $i | sed -e "s/\(.*\)-\(.*\)/$META(\1) = \2/" ;;
			*) ;;
		    esac
		done
		if [ "$MODE" = "--requires" -a "$SELF" ]; then
		    HASHS=$(${GHC_PKG} -f $PKGCONFDIR field $PKGVER id | sed -e "s/^id: \+//")
		    for i in $HASHS; do
			echo $i | sed -e "s/\(.*\)-\(.*\)/$SELF(\1) = \2/"
		    done
		fi
	    fi
	fi
    elif [ "$MODE" = "--requires" ]; then
	if file $i | grep -q 'executable, .* dynamically linked'; then
	    BIN_DEPS=$(ldd $i | grep libHS | grep -v libHSrts | sed -e "s%^\\tlibHS\(.*\)-ghc${GHCVERSION}.so =.*%\1%")
	    if [ -d "$PKGCONFDIR" ]; then
		PACKAGE_CONF_OPT="--package-conf=$PKGCONFDIR"
	    fi
	    for p in ${BIN_DEPS}; do
		HASH=$(${GHC_PKG} --global $PACKAGE_CONF_OPT field $p id | sed -e "s/^id: \+//")
		echo $HASH | sed -e "s/\(.*\)-\(.*\)/ghc(\1) = \2/"
	    done
	fi
    fi
done

echo $files | tr [:blank:] '\n' | /usr/lib/rpm/rpmdeps $MODE