public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection projectReferences, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
        {
            NemerleParameters cp = (NemerleParameters) configuration.CompilationParameters;
            if (cp == null) cp = new NemerleParameters ();

            string references = "";
            string files   = "";

            foreach (ProjectReference lib in projectReferences)
                references += " -r \"" + lib.GetReferencedFileName() + "\"";

            foreach (ProjectFile f in projectFiles)
                if (f.Subtype != Subtype.Directory)
                    switch (f.BuildAction)
                    {
                        case BuildAction.Compile:
                            files += " \"" + f.Name + "\"";
                        break;
                    }

            if (!Directory.Exists (configuration.OutputDirectory))
                Directory.CreateDirectory (configuration.OutputDirectory);

            string args = "-q -no-color " + GetOptionsString (configuration, cp) + references + files  + " -o " + configuration.CompiledOutputName;
            return DoCompilation (args);
        }
示例#2
0
        public Project()
        {
            Name = "New Project";
            projectReferences = new ProjectReferenceCollection ();
            projectReferences.SetProject (this);

            projectFileWatcher = new FileSystemWatcher();
            projectFileWatcher.Changed += new FileSystemEventHandler (OnFileChanged);
        }
        public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection references, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
        {
            // FIXME: response file?
            StringBuilder parameters = new StringBuilder();
            foreach (ProjectFile finfo in projectFiles) {
                if (finfo.Subtype != Subtype.Directory) {
                    switch (finfo.BuildAction) {
                        case BuildAction.Compile:
                            if (CanCompile (finfo.Name)) {
                                parameters.Append (finfo.Name);
                                parameters.Append (" ");
                            }
                            break;
                        default:
                            break;
                    }
                }
            }

            parameters.Append("/out:");
            parameters.Append(configuration.CompiledOutputName);
            parameters.Append(" ");

            switch (configuration.CompileTarget) {
                case CompileTarget.Library:
                    parameters.Append("/dll ");
                    break;
                case CompileTarget.Exe:
                    parameters.Append("/exe ");
                    break;
                default:
                    throw new System.NotSupportedException("Unsupported compilation target : " + configuration.CompileTarget);
            }

            if (configuration.DebugMode)
                parameters.Append("/debug ");

            string output = String.Empty;
            string error = String.Empty;
            TempFileCollection tf = new TempFileCollection();
            DoCompilation (parameters.ToString (), tf, ref output, ref error);
            ICompilerResult result = ParseOutput(tf, output, error);
            if (result.CompilerOutput.Trim () != "")
                monitor.Log.WriteLine (result.CompilerOutput);

            File.Delete(output);
            File.Delete(error);
            return result;
        }
 public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection references, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
 {
     Debug.Assert(compilerManager != null);
     return compilerManager.Compile (projectFiles, references, configuration, monitor);
 }
 public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection references, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
 {
     return compilerServices.Compile (projectFiles, references, configuration, monitor);
 }
        public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection references, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
        {
            CSharpCompilerParameters compilerparameters = (CSharpCompilerParameters) configuration.CompilationParameters;
            if (compilerparameters == null) compilerparameters = new CSharpCompilerParameters ();

            string exe = configuration.CompiledOutputName;
            string responseFileName = Path.GetTempFileName();
            StreamWriter writer = new StreamWriter(responseFileName);

            if (compilerparameters.CsharpCompiler == CsharpCompiler.Csc) {
                writer.WriteLine("\"/out:" + exe + '"');

                ArrayList pkg_references = new ArrayList ();

                if (references != null) {
                    foreach (ProjectReference lib in references) {
                        string fileName = lib.GetReferencedFileName ();
                        switch (lib.ReferenceType) {
                        case ReferenceType.Gac:
                            string pkg = Runtime.SystemAssemblyService.GetPackageFromFullName (lib.Reference);
                            if (pkg.Trim () == String.Empty) {
                                string msg = String.Format (GettextCatalog.GetString ("{0} could not be found or is invalid."), lib.Reference);
                                Runtime.MessageService.ShowWarning (msg);
                                continue;
                            }
                            if (pkg == "MONO-SYSTEM") {
                                writer.WriteLine ("\"/r:" + Path.GetFileName (fileName) + "\"");
                            } else if (!pkg_references.Contains (pkg)) {
                                pkg_references.Add (pkg);
                                writer.WriteLine ("\"-pkg:" + pkg + "\"");
                            }
                            break;
                        case ReferenceType.Assembly:
                        case ReferenceType.Project:
                            writer.WriteLine ("\"/r:" + fileName + "\"");
                            break;
                        }
                    }
                }

                writer.WriteLine("/noconfig");
                writer.WriteLine("/nologo");
                writer.WriteLine("/codepage:utf8");
            //				writer.WriteLine("/utf8output");
            //				writer.WriteLine("/w:" + compilerparameters.WarningLevel);;

                if (configuration.DebugMode) {
                    writer.WriteLine("/debug:+");
                    writer.WriteLine("/debug:full");
                    writer.WriteLine("/d:DEBUG");
                }

                // mcs default is + but others might not be
                if (compilerparameters.Optimize)
                    writer.WriteLine("/optimize+");
                else
                    writer.WriteLine("/optimize-");

                if (compilerparameters.Win32Icon != null && compilerparameters.Win32Icon.Length > 0 && File.Exists (compilerparameters.Win32Icon)) {
                    writer.WriteLine("\"/win32icon:" + compilerparameters.Win32Icon + "\"");
                }

                if (compilerparameters.UnsafeCode) {
                    writer.WriteLine("/unsafe");
                }

                if (compilerparameters.DefineSymbols.Length > 0) {
                    writer.WriteLine("/define:" + '"' + compilerparameters.DefineSymbols + '"');
                }

                if (compilerparameters.MainClass != null && compilerparameters.MainClass.Length > 0) {
                    writer.WriteLine("/main:" + compilerparameters.MainClass);
                }

                switch (configuration.CompileTarget) {
                    case CompileTarget.Exe:
                        writer.WriteLine("/t:exe");
                        break;
                    case CompileTarget.WinExe:
                        writer.WriteLine("/t:winexe");
                        break;
                    case CompileTarget.Library:
                        writer.WriteLine("/t:library");
                        break;
                }

                foreach (ProjectFile finfo in projectFiles) {
                    if (finfo.Subtype != Subtype.Directory) {
                        switch (finfo.BuildAction) {
                            case BuildAction.Compile:
                                if (CanCompile (finfo.Name))
                                    writer.WriteLine('"' + finfo.Name + '"');
                                break;
                            case BuildAction.EmbedAsResource:
                                // FIXME: workaround 60990
                                writer.WriteLine(@"""/res:{0},{1}""", finfo.Name, Path.GetFileName (finfo.Name));
                                break;
                        }
                    }
                }
                if (compilerparameters.GenerateXmlDocumentation) {
                    writer.WriteLine("\"/doc:" + Path.ChangeExtension(exe, ".xml") + '"');
                }
            }
            else {
                writer.WriteLine("-o " + exe);

                if (compilerparameters.UnsafeCode) {
                    writer.WriteLine("--unsafe");
                }

                writer.WriteLine("--wlevel " + compilerparameters.WarningLevel);

                if (references != null) {
                    foreach (ProjectReference lib in references) {
                        string fileName = lib.GetReferencedFileName ();
                        writer.WriteLine("-r:" + fileName );
                    }
                }

                switch (configuration.CompileTarget) {
                    case CompileTarget.Exe:
                        writer.WriteLine("--target exe");
                        break;
                    case CompileTarget.WinExe:
                        writer.WriteLine("--target winexe");
                        break;
                    case CompileTarget.Library:
                        writer.WriteLine("--target library");
                        break;
                }
                foreach (ProjectFile finfo in projectFiles) {
                    if (finfo.Subtype != Subtype.Directory) {
                        switch (finfo.BuildAction) {
                            case BuildAction.Compile:
                                writer.WriteLine('"' + finfo.Name + '"');
                                break;

                            case BuildAction.EmbedAsResource:
                                writer.WriteLine("--linkres " + finfo.Name);
                                break;
                        }
                    }
                }
            }
            writer.Close();

            string output = String.Empty;
            string error  = String.Empty;

            string compilerName = compilerparameters.CsharpCompiler == CsharpCompiler.Csc ? GetCompilerName() : System.Environment.GetEnvironmentVariable("ComSpec") + " /c mcs";
            string outstr = compilerName + " @" + responseFileName;
            TempFileCollection tf = new TempFileCollection();

            //StreamReader t = File.OpenText(responseFileName);

            //Executor.ExecWaitWithCapture(outstr,  tf, ref output, ref error);
            DoCompilation(outstr, tf, ref output, ref error);

            ICompilerResult result = ParseOutput(tf, output, error);
            if (result.CompilerOutput.Trim () != "")
                monitor.Log.WriteLine (result.CompilerOutput);

            File.Delete(responseFileName);
            File.Delete(output);
            File.Delete(error);
            return result;
        }
 public ProjectReferenceEnumerator(ProjectReferenceCollection mappings)
 {
     this.temp = ((IEnumerable)(mappings));
     this.baseEnumerator = temp.GetEnumerator();
 }
 /// <summary>
 ///     <para>
 ///       Adds the contents of another <see cref='.ProjectReferenceCollection'/> to the end of the collection.
 ///    </para>
 /// </summary>
 /// <param name='value'>
 ///    A <see cref='.ProjectReferenceCollection'/> containing the objects to add to the collection.
 /// </param>
 /// <returns>
 ///   <para>None.</para>
 /// </returns>
 /// <seealso cref='.ProjectReferenceCollection.Add'/>
 public void AddRange(ProjectReferenceCollection value)
 {
     for (int i = 0; (i < value.Count); i = (i + 1)) {
         this.Add(value[i]);
     }
 }
        public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection references, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
        {
            VBCompilerParameters compilerparameters = (VBCompilerParameters) configuration.CompilationParameters;
            if (compilerparameters == null) compilerparameters = new VBCompilerParameters ();

            string exe = configuration.CompiledOutputName;
            string responseFileName = Path.GetTempFileName();
            //string stdResponseFileName = String.Concat(propertyService.DataDirectory, Path.DirectorySeparatorChar, "vb.rsp");
            StreamWriter writer = new StreamWriter(responseFileName);

            //Console.WriteLine(GenerateOptions(compilerparameters,exe));
            writer.WriteLine(GenerateOptions (configuration, compilerparameters, exe));

            foreach (ProjectReference lib in references) {
                string fileName = lib.GetReferencedFileName();
                //Console.WriteLine(String.Concat("-r:",fileName));
                writer.WriteLine(String.Concat("-r:", fileName));
            }

            // write source files and embedded resources
            foreach (ProjectFile finfo in projectFiles) {
                if (finfo.Subtype != Subtype.Directory) {
                    switch (finfo.BuildAction) {
                        case BuildAction.Compile:
                            //Console.WriteLine(finfo.Name);
                            writer.WriteLine(finfo.Name);
                        break;

                        case BuildAction.EmbedAsResource:
                            //Console.WriteLine(String.Concat("-resource:", finfo.Name));
                            writer.WriteLine(String.Concat("-resource:", finfo.Name));
                        break;
                    }
                }
            }

            TempFileCollection tf = new TempFileCollection ();
            writer.Close();

            string output = "";
            string error  = "";
            string compilerName = GetCompilerName(compilerparameters.VBCompilerVersion);
            string outstr = String.Concat(compilerName, " @", responseFileName); //, " @", stdResponseFileName);

            //Console.WriteLine("Attempting to run: "+outstr);

            //Executor.ExecWaitWithCapture(outstr, tf, ref output, ref error);
            DoCompilation(outstr,tf,ref output,ref error);

            //Console.WriteLine("Output: "+output);
            //Console.WriteLine("Error: "+error);

            ICompilerResult result = ParseOutput(tf, output);
            ParseOutput(tf,error);

            File.Delete(responseFileName);
            File.Delete(output);
            File.Delete(error);
            if (configuration.CompileTarget != CompileTarget.Library) {
                WriteManifestFile(exe);
            }
            return result;
        }
        public ICompilerResult Compile(ProjectFileCollection projectFiles, ProjectReferenceCollection references, DotNetProjectConfiguration configuration, IProgressMonitor monitor)
        {
            if (JavaLanguageBinding.Properties.IkvmPath == "") {
                monitor.Log.WriteLine ("The Java addin has not been properly configured.");
                monitor.Log.WriteLine ("Please set the location of IKVM in the Java configuration section of MonoDevelop preferences.");
                CompilerResults cre = new CompilerResults (new TempFileCollection ());
                CompilerError err = new CompilerError ();
                err.ErrorText = "The Java addin has not been properly configured.";
                cre.Errors.Add (err);
                return new DefaultCompilerResult (cre, "");
            }

            JavaCompilerParameters compilerparameters = (JavaCompilerParameters) configuration.CompilationParameters;
            if (compilerparameters == null)
                compilerparameters = new JavaCompilerParameters ();

            string outdir = configuration.OutputDirectory;
            string options = "";

            string compiler = compilerparameters.CompilerPath;

            if (configuration.DebugMode)
                options += " -g ";
            else
                options += " -g:none ";

            if (compilerparameters.Optimize)
                options += " -O ";

            if (compilerparameters.Deprecation)
                options += " -deprecation ";

            if (compilerparameters.GenWarnings)
                options += " -nowarn ";

            options += " -encoding utf8 ";

            string files  = "";

            foreach (ProjectFile finfo in projectFiles) {
                if (finfo.Subtype != Subtype.Directory) {
                    switch (finfo.BuildAction) {
                        case BuildAction.Compile:
                            files = files + " \"" + finfo.Name + "\"";
                        break;
                    }
                }
            }

            string classpath = compilerparameters.ClassPath;
            string refClasspath = GenerateReferenceStubs (monitor, configuration, compilerparameters, references);
            if (refClasspath.Length > 0) {
                if (classpath.Length > 0) classpath += ":";
                classpath += refClasspath;
            }

            string args = "";

            if (compilerparameters.Compiler == JavaCompiler.Gcj)
                args = "-C ";

            //FIXME re-enable options
            //FIXME re-enable compilerPath
            if (classpath == "") {
                args += files + " -d " + outdir;
            } else {
                args += " -classpath " + classpath + files + " -d " + outdir;
            }
            args = options + " " + args;
            //Console.WriteLine (args);

            CompilerResults cr = new CompilerResults (new TempFileCollection ());
            StringWriter output = new StringWriter ();
            StringWriter error = new StringWriter ();

            bool res = DoCompilation (monitor, compiler, args, configuration, compilerparameters, output, error);
            ParseJavaOutput (compilerparameters.Compiler, error.ToString(), cr);

            if (res) {
                output = new StringWriter ();
                error = new StringWriter ();
                CompileToAssembly (monitor, configuration, compilerparameters, references, output, error);
                ParseIkvmOutput (compilerparameters.Compiler, error.ToString(), cr);
            }

            return new DefaultCompilerResult (cr, "");
        }
        private string GenerateReferenceStubs(IProgressMonitor monitor, DotNetProjectConfiguration configuration, JavaCompilerParameters compilerparameters, ProjectReferenceCollection references)
        {
            monitor.Log.WriteLine ("Generating reference stubs ...");

            // Create stubs for referenced assemblies
            string ikvmstub = Path.Combine (Path.Combine (JavaLanguageBinding.Properties.IkvmPath, "bin"), "ikvmstub.exe");

            string classpath = "";

            if (references != null) {
                foreach (ProjectReference lib in references) {
                    string asm = lib.GetReferencedFileName ();
                    ProcessWrapper p = Runtime.ProcessService.StartProcess ("/bin/sh", "-c \"mono " + ikvmstub + " " + asm + "\"", configuration.OutputDirectory, null);
                    p.WaitForExit ();

                    if (classpath.Length > 0) classpath += ":";
                    string name = Path.GetFileNameWithoutExtension (Path.GetFileName (asm));
                    classpath += Path.Combine (configuration.OutputDirectory, name + ".jar");
                }
            }
            return classpath;
        }
        void CompileToAssembly(IProgressMonitor monitor, DotNetProjectConfiguration configuration, JavaCompilerParameters compilerparameters, ProjectReferenceCollection references, TextWriter output, TextWriter error)
        {
            monitor.Log.WriteLine ("Generating assembly ...");

            LogTextWriter chainedError = new LogTextWriter ();
            chainedError.ChainWriter (monitor.Log);
            chainedError.ChainWriter (error);

            LogTextWriter chainedOutput = new LogTextWriter ();
            chainedOutput.ChainWriter (monitor.Log);
            chainedOutput.ChainWriter (output);

            string outdir = configuration.OutputDirectory;
            string outclass = Path.Combine (outdir, configuration.OutputAssembly + ".class");
            string asm = Path.GetFileNameWithoutExtension (outclass);

            string opts = "-assembly:" + asm;

            switch (configuration.CompileTarget) {
                case CompileTarget.Exe:
                    opts += " -target:exe";
                    break;
                case CompileTarget.WinExe:
                    opts += " -target:winexe";
                    break;
                case CompileTarget.Library:
                    opts += " -target:library";
                    break;
            }

            if (configuration.DebugMode)
                opts += " -debug";

            opts += " -srcpath:" + configuration.SourceDirectory;

            if (references != null) {
                foreach (ProjectReference lib in references)
                    opts += " -r:" + lib.GetReferencedFileName ();
            }

            string ikvmc = Path.Combine (Path.Combine (JavaLanguageBinding.Properties.IkvmPath, "bin"), "ikvmc.exe");

            string args = String.Format ("-c \"mono {0} {1} {2}\"", ikvmc, "*.class", opts);
            Process p = Runtime.ProcessService.StartProcess ("/bin/sh", args, configuration.OutputDirectory, chainedOutput, chainedError, null);
            p.WaitForExit ();
        }