/usr/bin/mono-find-requires is in mono-utils 4.2.1.102+dfsg2-7ubuntu4.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | #!/bin/bash
#
# mono-find-requires
#
# Authors:
# Ben Maurer (bmaurer@ximian.com)
# Wade Berrier (wberrier@novell.com)
#
# (C) 2008 Novell (http://www.novell.com)
#
IFS=$'\n'
filelist=($(grep -Ev '/usr/doc/|/usr/share/doc/'))
monolist=($(printf "%s\n" "${filelist[@]}" | egrep "\\.(exe|dll)\$"))
# parse .config files to find which native libraries to depend on
# (target attribute must have double quotes for this to work, ie: target="file" )
# Add /etc/mono/config ?
configlist=($(printf "%s\n" "${filelist[@]}" | egrep "\\.config\$"))
# Set the prefix, unless it is overriden (used when building mono rpms)
: ${prefix=/usr}
# Can override .config scanning if specified
: ${IGNORE_CONFIG_SCAN=0}
libdir=$prefix/lib
bindir=$prefix/bin
# Bail out if monodis or libmono is missing
if [ ! -x $bindir/monodis ] || [ ! -f $libdir/libmono-2.0.so.1 ] ; then
echo "monodis missing or unusable, exiting..." 1>&2
exit 1
fi
# special case for 64bit archs
if test "xlib" = "xlib64" ; then
libext="()(64bit)"
else
# (note, this works on ppc64 since we only have 32bit mono)
libext=""
fi
# Exceptions:
case `uname -m` in
# ia64 doesn't use lib64 for 'libdir' (sles 9 rpm used to provide both... no longer)
ia64) libext="()(64bit)" ;;
esac
# set LD_LIBRARY_PATH to ensure that libmono is found
export LD_LIBRARY_PATH=$libdir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
# and set MONO_PATH to ensure that mscorlib.dll can be found
export MONO_PATH=$prefix/lib/mono/4.5
REQUIRES=$(
for i in "${monolist[@]}"; do
($bindir/monodis --assemblyref $i | awk '
BEGIN { START=0; LIBNAME=""; VERSION=""; }
(START==0) && /^[0-9]+: Version=/ {
START=1;
sub(/Version=/, "", $2);
VERSION=$2
}
(START==1) && /^\tName=/ {
sub(/Name=/, "", $1);
LIBNAME=$1
# Allow rpm deps to be resolved for 1.0 profile version
if (VERSION=="1.0.3300.0")
OP=">="
else
OP="="
print "mono(" LIBNAME ") " OP " " VERSION
START=0
}
') 2> /dev/null
done
)
if [ $IGNORE_CONFIG_SCAN -eq 0 ] ; then
rpm_config_REQUIRES=$(
# Parse the xml .config files to see what native binaries we call into
# TODO: also check monodis --moduleref
for i in "${configlist[@]}"; do
awk 'match($_, /<dllmap .*target=.*/) {
ignore=0
req=""
split($_, toks, "\"")
toks_size=0
for(tok in toks) { toks_size++ }
for(i=1; i <= toks_size; i++) {
if(toks[i] ~ /target=/) {
req=toks[i+1]
}
if(toks[i] ~ /os=/) {
negate=0
found=0
attr=toks[i+1]
if(attr ~ /^!/) {
attr=substr(attr, 2, length(attr)-1)
negate=1
}
split(attr, os_targets, ",")
os_targets_size=0
for(os_target in os_targets) { os_targets_size++ }
for(j=1; j <= os_targets_size; j++) {
if(os_targets[j] == "linux") {
found=1
}
}
if(negate) {
found=!found
}
if (!found) {
ignore=1
}
}
}
if(!ignore) {
print req"'$libext'"
}
} ' $i 2>/dev/null
done
)
# Resolve provides to packages, warning on missing to stderr
config_REQUIRES=$(
first=1 # avoid an empty line if no .config reqs are found
for i in ${rpm_config_REQUIRES[@]} ; do
out=$(rpm -q --whatprovides --queryformat "%{NAME}\n" $i)
if [ $? -eq 0 ] ; then
if [ $first -eq 1 ] ; then
echo ""
first=0
fi
echo $out
else
# echo to stderr
echo "mono-find-requires: Warning, could not find package that provides: $i" >&2
fi
done
)
fi
# Note about above:
# Use to do: system("rpm -q --whatprovides --queryformat \"%{NAME}\n\" ""\""req"'$libext'""\"")
# rpmlint prefers to have lib names instead of package names. There was a reason I was using package names but it slips me now...
# Ah... now I remember... it's for noarch packs. The noarch packages can be built on either 32 or 64 bit... so we have to depend
# on the package name instead.
PROVIDES=$(
for i in "${monolist[@]}"; do
($bindir/monodis --assembly $i | awk '
BEGIN { LIBNAME=""; VERSION=""; }
/^Version:/ { VERSION=$2 }
/^Name:/ { LIBNAME=$2 }
END {
if (VERSION && LIBNAME)
print "mono(" LIBNAME ") = " VERSION
}
') 2>/dev/null
done
)
#
# This is a little magic trick to get all REQUIRES that are not
# in PROVIDES. While RPM functions correctly when such deps exist,
# they make the metadata a bit bloated.
#
# TODO: make this use the mono-find-provides script, to share code
# Filter out dups from both lists
REQUIRES=$(echo "$REQUIRES $config_REQUIRES" | sort | uniq)
PROVIDES=$(echo "$PROVIDES" | sort | uniq)
#
# Get a list of elements that exist in exactly one of PROVIDES or REQUIRES
#
UNIQ=$(echo "$PROVIDES
$REQUIRES" | sort | uniq -u)
#
# Of those, only choose the ones that are in REQUIRES
#
echo "$UNIQ
$REQUIRES" | sort | uniq -d
|