Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / scripts / mono-test-install
index 442e54ebe1918fa4c3332cfa3ddf7bbf014b3dec..3c1f74a88924a472fad802fc33de358e0e1faddb 100755 (executable)
@@ -1,8 +1,16 @@
-#!/bin/sh
+#!/usr/bin/env bash
 #
 # Does various checks for people that we can use to diagnose
 # an end user installation
 #
+temp_cs=temp$$.cs
+temp_exe=temp$$.exe
+if test -f $temp_cs; then
+    echo Error: need a temporary file name, and $temp_cs already exists
+    echo Run this program from a different directory, or delete the file and try again.
+    exit 1
+fi
+
 set `echo $PATH | sed 's/:/ /g'`
 
 while test x$1 != x; do
@@ -33,9 +41,137 @@ if pkg-config --modversion mono >& /dev/null; then
            echo "       than the Mono found:"
            echo "       Mono on PATH: $monocmd"
            echo "       Mono from pkg-config: $pkg_config_mono"
-           exit 1
        fi
 else 
         echo "Warning: pkg-config could not find mono installed on this system"
 fi
 
+##########################################################################################
+#
+# Tests below this point require the dotnet install
+#
+#
+
+#
+# Check that -pkg:dotnet is available
+#
+if pkg-config --modversion dotnet >& /dev/null; then
+       echo ""
+else
+       echo "No dotnet pkgconfig found, Windows.Forms, System.Drawing and others will not work"
+       exit 1
+fi
+
+case `uname` in
+    Darwin) 
+       macos=true
+       libgdiplus=libgdiplus.dylib
+       LD_PATH=DYLD_LIBRARY_PATH
+       ;;
+    *) 
+       macos=false;
+       libgdiplus=libgdiplus.so
+       LD_PATH=LD_LIBRARY_PATH
+       ;;
+esac
+
+search_libgdiplus_on_path()
+{
+    libgdiplus_found=false
+       if $macos; then
+           set `echo $DYLD_LIBRARY_PATH | sed 's/:/ /g'`
+       else
+           set `echo $LD_LIBRARY_PATH | sed 's/:/ /g'`
+       fi
+       while test x$1 != x; do
+           if test -e $1/$libgdiplus; then
+                  echo "    The $libgdiplus is found on $libdir/$libgdiplus"
+                  libgdiplus_found=true
+                  libgdiplus_path=$1/$libgdiplus
+                  break
+           fi
+           shift
+       done
+}
+
+#
+# Check GDI+ installation
+#
+cat > $temp_cs <<EOF
+using System;
+using System.Drawing;
+
+class X { 
+    static void Main ()
+    {
+           Bitmap b = new Bitmap (100, 100);
+    }
+}
+EOF
+if mcs -pkg:dotnet $temp_cs >& /dev/null; then
+    if mono $temp_exe >& /dev/null; then
+       echo Your have a working System.Drawing setup
+    else
+        echo Your system has a broken System.Drawing setup
+        if mono $temp_exe 2>&1 | grep 'System.DllNotFoundException: gdiplus.dll' > /dev/null; then
+          echo "    your gdiplus.dll can not be loaded"
+
+          libdir=`dirname $monocmd`/../lib
+          if test -f $libdir/$libgdiplus; then
+              echo "    The $libgdiplus is found on $libdir/$libgdiplus"
+              if test -e $libdir/$libgdiplus; then
+                  libgdiplus_path=$libdir/$libgdiplus
+                  libgdiplus_found=true
+              else
+                  echo "    but it seems to be a broken link"
+              fi
+          else
+              search_libgdiplus_on_path
+          fi
+          if $libgdiplus_found; then
+              echo ssss 
+              if which ldd >/dev/null; then
+                  LANG=C dirs=`ldd $libgdiplus_path | grep 'not found'`
+                  if echo $dirs | grep 'not found' >& /dev/null; then
+                      echo "    libgdiplus is missing the following dependencies to run:"
+                      echo $dirs | sed 's/^/        /'
+                  fi
+              fi 
+          else
+              echo "    No libgdiplus was found on your $LD_PATH"
+          fi
+       fi
+    fi
+else
+    echo Failed to compile sample System.Drawing program, your installation is broken
+    exit 1
+fi
+
+cat > $temp_cs <<EOF
+using System;
+using System.Reflection;
+using System.IO;
+
+class Program {
+
+    public static void Main()
+    {
+        object watcher = new FileSystemWatcher()
+            .GetType ()
+            .GetField ("watcher", BindingFlags.NonPublic | BindingFlags.Static)
+            .GetValue (null);
+        
+        Console.WriteLine ("Your file system watcher is: {0}",
+                   watcher != null
+                   ? watcher.GetType ().FullName
+                   : "unknown");
+    }
+}
+EOF
+
+if mcs $temp_cs >& /dev/null; then
+    mono $temp_exe
+else
+    echo Failed to compile sample test program, your installation is broken
+    exit 1
+fi