Merge branch 'master' of github.com:mono/mono
[mono.git] / msvc / scripts / genproj.cs
index a42fb3ec64b0555121b171dfbaa496daa16a6ec9..6c1f5e66163f80342c7ef44231efcf2626f9d69c 100644 (file)
@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Text;
 using System.Globalization;
 using System.Xml.Linq;
+using System.Linq;
 
 public enum Target {
        Library, Exe, Module, WinExe
@@ -106,7 +107,7 @@ class MsbuildGenerator {
                if (dir == "mcs"){
                        mcs_topdir = "..\\";
                        class_dir = "..\\class\\";
-                       base_dir = "..\\..\\..\\mcs\\mcs";
+                       base_dir = "..\\..\\mcs\\mcs";
                } else {
                        mcs_topdir = "..\\";
                        
@@ -116,7 +117,7 @@ class MsbuildGenerator {
                        }
                        class_dir = mcs_topdir.Substring (3);
                        
-                       base_dir = "..\\..\\..\\mcs\\" + dir;
+                       base_dir = "..\\..\\mcs\\" + dir;
                }
        }
        
@@ -138,6 +139,7 @@ class MsbuildGenerator {
        bool WarningsAreErrors;
        Dictionary<string,string> embedded_resources = new Dictionary<string,string> ();
        List<string> references = new List<string> ();
+       List<string> libs = new List<string> ();
        List<string> reference_aliases = new List<string> ();
        List<string> warning_as_error = new List<string> ();
        int WarningLevel = 4;
@@ -305,11 +307,15 @@ class MsbuildGenerator {
                case "/addmodule": 
                case "/win32res":
                case "/doc": 
-               case "/lib": 
                {
                        Console.WriteLine ("{0} = not supported", arg);
                        throw new Exception ();
                }
+               case "/lib":
+               {
+                       libs.Add (value);
+                       return true;
+               }
                case "/win32icon": {
                        win32IconFile = value;
                        return true;
@@ -359,6 +365,10 @@ class MsbuildGenerator {
                        }
                        return true;
 
+               case "/-runtime":
+                       Console.WriteLine ("Warning ignoring /runtime:v4");
+                       return true;
+                       
                case "/warnaserror-":
                        if (value.Length == 0) {
                                WarningsAreErrors = false;
@@ -461,6 +471,7 @@ class MsbuildGenerator {
                        return true;
                }
 
+               Console.WriteLine ("Failing with : {0}", arg);
                return false;
        }
 
@@ -515,13 +526,23 @@ class MsbuildGenerator {
 
        static string Load (string f)
        {
-               if (File.Exists (f)){
-                       using (var sr = new StreamReader (f)){
+               var native = NativeName (f);
+                       
+               if (File.Exists (native)){
+                       using (var sr = new StreamReader (native)){
                                return sr.ReadToEnd ();
                        }
                } else
                        return "";
        }
+
+       public static string NativeName (string path)
+       {
+               if (System.IO.Path.DirectorySeparatorChar == '/')
+                       return path.Replace ("\\", "/");
+               else
+                       return path.Replace ("/", "\\");
+       }
        
        public string Generate (XElement xproject)
        {
@@ -578,7 +599,8 @@ class MsbuildGenerator {
                }
                
                string [] source_files;
-               using (var reader = new StreamReader (base_dir + "\\" + response)){
+               Console.WriteLine ("Base: {0} res: {1}", base_dir, response);
+               using (var reader = new StreamReader (NativeName (base_dir + "\\" + response))){
                        source_files  = reader.ReadToEnd ().Split ();
                }
                StringBuilder sources = new StringBuilder ();
@@ -594,37 +616,6 @@ class MsbuildGenerator {
                        sources.Append (String.Format ("   <Compile Include=\"{0}\" />\n", s.Replace ("/", "\\")));
                }
                
-               //
-               // Compute the csc command that we need to use
-               //
-               // The mcs string is formatted like this:
-               // MONO_PATH=./../../class/lib/basic: /cvs/mono/runtime/mono-wrapper ./../../class/lib/basic/mcs.exe
-               //
-               // The first block is a set of MONO_PATHs, the last part is the compiler
-               //
-               if (mcs.StartsWith ("MONO_PATH="))
-                       mcs = mcs.Substring (10);
-               
-               var compiler = mcs.Substring (mcs.LastIndexOf (' ') + 1);
-               if (compiler.EndsWith ("class/lib/basic/gmcs.exe"))
-                       compiler = "gmcs";
-               else if (compiler.EndsWith ("class/lib/net_2_0_bootstrap/gmcs.exe"))
-                       compiler = "net_2_0_bootstrap";
-               else if (compiler.EndsWith ("mcs/gmcs.exe"))
-                       compiler = "gmcs";
-               else if (compiler.EndsWith ("class/lib/moonlight_bootstrap/smcs.exe"))
-                       compiler = "moonlight_bootstrap";
-               else if (compiler.EndsWith ("class/lib/moonlight_raw/smcs.exe"))
-                       compiler = "moonlight_raw";
-               else if (compiler.EndsWith ("class/lib/net_4_0_bootstrap/dmcs.exe"))
-                       compiler = "net_4_0_bootstrap";
-               else if (compiler.EndsWith ("class/lib/net_4_0/dmcs.exe"))
-                       compiler = "dmcs";
-               else {
-                       Console.WriteLine ("Can not determine compiler from {0}", compiler);
-                       Environment.Exit (1);
-               }
-
                var mono_paths = mcs.Substring (0, mcs.IndexOf (' ')).Split (new char [] {':'});
                for (int i = 0; i < mono_paths.Length; i++){
                        int p = mono_paths [i].LastIndexOf ('/');
@@ -633,17 +624,6 @@ class MsbuildGenerator {
                }
                
                var encoded_mono_paths = string.Join ("-", mono_paths).Replace ("--", "-");
-               var encoded_mp_compiler = (encoded_mono_paths + "-" + compiler).Replace ("--", "-");
-               
-               string csc_tool_path = mcs_topdir + "..\\mono\\msvc\\scripts\\" + encoded_mp_compiler;
-               if (!Directory.Exists (encoded_mp_compiler)){
-                       Console.WriteLine ("Created {0}", encoded_mp_compiler);
-                       Directory.CreateDirectory (encoded_mp_compiler);
-               }
-               if (!File.Exists (Path.Combine (encoded_mp_compiler, "csc.exe"))){
-                       File.Copy ("monowrap.exe", Path.Combine (encoded_mp_compiler, "csc.exe"));
-                       File.Copy ("monowrap.pdb", Path.Combine (encoded_mp_compiler, "csc.pdb"));
-               }
                
                var refs = new StringBuilder ();
                //
@@ -682,6 +662,17 @@ class MsbuildGenerator {
                        refs.Append ("  </ItemGroup>\n");
                }
 
+               var resources = new StringBuilder ();
+               if (embedded_resources.Count > 0){
+                       resources.AppendFormat ("  <ItemGroup>\n");
+                       foreach (var dk in embedded_resources){
+                               resources.AppendFormat ("    <EmbeddedResource Include=\"{0}\">\n", dk.Key);
+                               resources.AppendFormat ("       <LogicalName>{0}</LogicalName>\n", dk.Value);
+                               resources.AppendFormat ("    </EmbeddedResource>\n");
+                       }
+                       resources.AppendFormat ("  </ItemGroup>\n");
+               }
+               
                try {
                        Path.GetDirectoryName (library_output);
                } catch {
@@ -693,21 +684,24 @@ class MsbuildGenerator {
                //
                string output = template.
                        Replace ("@DEFINES@", defines.ToString ()).
+                       Replace ("@DISABLEDWARNINGS@", string.Join (",", (from i in ignore_warning select i.ToString ()).ToArray ())).
                        Replace ("@NOSTDLIB@", StdLib ? "" : "<NoStdLib>true</NoStdLib>").
                        Replace ("@ALLOWUNSAFE@", Unsafe ? "<AllowUnsafeBlocks>true</AllowUnsafeBlocks>" : "").
                        Replace ("@ASSEMBLYNAME@", Path.GetFileNameWithoutExtension (output_name)).
                        Replace ("@OUTPUTDIR@", Path.GetDirectoryName (library_output)).
                        Replace ("@DEFINECONSTANTS@", defines.ToString ()).
-                       Replace ("@CSCTOOLPATH@", csc_tool_path).
                        Replace ("@DEBUG@", want_debugging_support ? "true" : "false").
                        Replace ("@DEBUGTYPE@", want_debugging_support ? "full" : "pdbonly").
                        Replace ("@REFERENCES@", refs.ToString ()).
                        Replace ("@PREBUILD@", prebuild).
+                       Replace ("@ADDITIONALLIBPATHS@", String.Format ("<AdditionalLibPaths>{0}</AdditionalLibPaths>", string.Join (",", libs.ToArray ()))).
+                       Replace ("@RESOURCES@", resources.ToString ()).
+                       Replace ("@OPTIMIZE@", Optimize ? "true" : "false").
                        Replace ("@SOURCES@", sources.ToString ());
 
 
-               string ofile = "..\\..\\..\\mcs\\" + dir + "\\" + library + ".csproj";
-               ofile = ofile.Replace ('/', '\\');
+               string ofile = "..\\..\\mcs\\" + dir + "\\" + library + ".csproj";
+               ofile = ofile.Replace ('\\', '/');
                //Console.WriteLine ("Generated {0}", ofile.Replace ("\\", "/"));
                using (var o = new StreamWriter (ofile)){
                        o.WriteLine (output);
@@ -722,7 +716,7 @@ public class Driver {
        
        static void Main (string [] args)
        {
-               if (!File.Exists ("genproj.cs") || !File.Exists ("monowrap.cs")){
+               if (!File.Exists ("genproj.cs")){
                        Console.WriteLine ("This command should be ran from mono/msvc/scripts");
                        Environment.Exit (1);
                }
@@ -743,12 +737,13 @@ public class Driver {
                        // Do not do 2.1, it is not working yet
                        // Do not do basic, as there is no point (requires a system mcs to be installed).
                        //
-                       if (library.Contains ("moonlight") || library.Contains ("-basic"))
+                       if (library.Contains ("moonlight") || library.Contains ("-basic") || library.EndsWith ("bootstrap"))
                                continue;
                        
                        var gen = new MsbuildGenerator (dir);
                        try {
-                               sln_gen.Add (gen.Generate (project));
+                               //sln_gen.Add (gen.Generate (project));
+                               gen.Generate (project);
                        } catch (Exception e) {
                                Console.WriteLine ("Error in {0}\n{1}", dir, e);
                        }