2007-05-05 Wade Berrier <wberrier@novell.com>
[mono.git] / scripts / mono-find-requires.in
index 5c9edddf391a71f0ab36d68eeb9dfc65cbd015db..02deeeef7e32ea7125846656e8c7e75a304ff529 100644 (file)
@@ -12,22 +12,29 @@ IFS=$'\n'
 filelist=($(grep -Ev '/usr/doc/|/usr/share/doc/'))
 monolist=($(printf "%s\n" "${filelist[@]}" | egrep "\\.(exe|dll)\$"))
 
-a=`which "$0"`
-d=`dirname "$a"`
+# 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=$d/..}
+: ${prefix=@prefix@}
 
-exec_prefix=$d/..
 libdir=$prefix/@reloc_libdir@
-bindir=$d
+bindir=$prefix/bin
 
 # Bail out if monodis or libmono is missing
 if [ ! -x $bindir/monodis ] || [ ! -f $libdir/libmono.so ] ; then
-       echo "monodis missing or unusable, exiting..."
+       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
+        libext=""
+fi
 
 # set LD_LIBRARY_PATH to ensure that libmono.so is found
 export LD_LIBRARY_PATH=$libdir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
@@ -55,6 +62,47 @@ REQUIRES=$(
                        }
                    ') 2> /dev/null
        done
+       # 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, "\"")
+                       for(i=1; i <= length(toks); 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, ",")
+                                       for(j=1; j <= length(os_targets); j++) {
+                                               if(os_targets[j] == "linux") {
+                                                       found=1
+                                               }
+                                       }
+
+                                       if(negate) {
+                                               found=!found
+                                       }
+                                       if (!found) {
+                                               ignore=1
+                                       } 
+                               }
+                       }
+                       if(!ignore) {
+                               system("rpm -q --whatprovides --queryformat \"%{NAME}\n\" ""\""req"'$libext'""\"")
+                       }
+               } ' $i 2>/dev/null
+       done
 )
 
 PROVIDES=$(