Welcome to mirror list, hosted at ThFree Co, Russian Federation.

mono-find-requires.in « scripts - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5e0ef2f1cfd35e650d84d380c553d3d108a48dc0 (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
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
191
192
#!/bin/bash
#
# mono-find-requires
#
# Authors:
#       Ben Maurer (bmaurer@ximian.com)
#       Wade Berrier (wberrier@novell.com)
#
# (C) 2008 Novell (http://www.novell.com)
#

if [ -n "$DISABLE_MONO_RPM_AUTO_DEPS" ]; then exit 0; fi

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=@prefix@}

# Can override .config scanning if specified
: ${IGNORE_CONFIG_SCAN=0}

libdir=$prefix/@reloc_libdir@
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 "x@reloc_libdir@" = "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