Example #1
0
        public void ParseArguments(string[] args)
        {
            bool autoResponse = true;

            flatArguments        = new ArrayList();
            remainingArguments   = new ArrayList();
            responseFiles        = new Hashtable();
            FileLoggerParameters = new string[10];
            foreach (string s in args)
            {
                if (s.StartsWith("/noautoresponse") || s.StartsWith("/noautorsp"))
                {
                    autoResponse = false;
                    continue;
                }
                if (s [0] != '@')
                {
                    flatArguments.Add(s);
                    continue;
                }
                string responseFilename = Path.GetFullPath(UnquoteIfNeeded(s.Substring(1)));
                if (responseFiles.ContainsKey(responseFilename))
                {
                    ReportError(1, String.Format("We already have {0} file.", responseFilename));
                }
                responseFiles [responseFilename] = responseFilename;
                LoadResponseFile(responseFilename);
            }
            if (autoResponse == true)
            {
                // FIXME: we do not allow nested auto response file
                LoadResponseFile(responseFile);
            }
            foreach (string s in flatArguments)
            {
                if (s [0] != '/')
                {
                    remainingArguments.Add(s);
                }
                else if (!ParseFlatArgument(s))
                {
                    ReportError(1, "Unknown switch: " + s);
                }
            }
            if (remainingArguments.Count == 0)
            {
                string[] sln_files  = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sln");
                string[] proj_files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*proj");

                if (sln_files.Length == 0 && proj_files.Length == 0)
                {
                    ReportError(3, "Please specify the project or solution file " +
                                "to build, as none was found in the current directory.");
                }

                if (sln_files.Length == 1 && proj_files.Length > 0)
                {
                    var projects_table = new Dictionary <string, string> ();
                    foreach (string pfile in SolutionParser.GetAllProjectFileNames(sln_files [0]))
                    {
                        string full_path = Path.GetFullPath(pfile);
                        projects_table [full_path] = full_path;
                    }

                    if (!proj_files.Any(p => !projects_table.ContainsKey(Path.GetFullPath(p))))
                    {
                        // if all the project files in the cur dir, are referenced
                        // from the single .sln in the cur dir, then pick the sln
                        proj_files = new string [0];
                    }
                }

                if (sln_files.Length + proj_files.Length > 1)
                {
                    ReportError(5, "Please specify the project or solution file " +
                                "to build, as more than one solution or project file was found " +
                                "in the current directory");
                }

                if (sln_files.Length == 1)
                {
                    projectFile = sln_files [0];
                }
                else
                {
                    projectFile = proj_files [0];
                }
            }
            else if (remainingArguments.Count == 1)
            {
                projectFile = (string)remainingArguments [0];
            }
            else
            {
                ReportError(4, "Too many project files specified");
            }
        }
Example #2
0
        public void Execute()
        {
            bool result          = false;
            bool show_stacktrace = false;

            try {
                parameters.ParseArguments(args);
                show_stacktrace = (parameters.LoggerVerbosity == LoggerVerbosity.Detailed ||
                                   parameters.LoggerVerbosity == LoggerVerbosity.Diagnostic);

                if (!parameters.NoLogo)
                {
                    ErrorUtilities.ShowVersion(false);
                }

                project_collection = new ProjectCollection();
                if (!String.IsNullOrEmpty(parameters.ToolsVersion))
                {
                    if (project_collection.GetToolset(parameters.ToolsVersion) == null)
                    {
                        ErrorUtilities.ReportError(0, new InvalidToolsetDefinitionException("Toolset " + parameters.ToolsVersion + " was not found").Message);
                    }

                    project_collection.DefaultToolsVersion = parameters.ToolsVersion;
                }

                foreach (var p in parameters.Properties)
                {
                    project_collection.GlobalProperties.Add(p.Key, p.Value);
                }

                if (!parameters.NoConsoleLogger)
                {
                    printer = new ConsoleReportPrinter();
                    ConsoleLogger cl = new ConsoleLogger(parameters.LoggerVerbosity,
                                                         printer.Print, printer.SetForeground, printer.ResetColor);

                    cl.Parameters = parameters.ConsoleLoggerParameters;
                    cl.Verbosity  = parameters.LoggerVerbosity;
                    project_collection.RegisterLogger(cl);
                }

                if (parameters.FileLoggerParameters != null)
                {
                    for (int i = 0; i < parameters.FileLoggerParameters.Length; i++)
                    {
                        string fl_params = parameters.FileLoggerParameters [i];
                        if (fl_params == null)
                        {
                            continue;
                        }

                        var fl = new FileLogger();
                        if (fl_params.Length == 0 && i > 0)
                        {
                            fl.Parameters = String.Format("LogFile=msbuild{0}.log", i);
                        }
                        else
                        {
                            fl.Parameters = fl_params;
                        }
                        project_collection.RegisterLogger(fl);
                    }
                }

                foreach (LoggerInfo li in parameters.Loggers)
                {
                    Assembly assembly;
                    if (li.InfoType == LoadInfoType.AssemblyFilename)
                    {
                        assembly = Assembly.LoadFrom(li.Filename);
                    }
                    else
                    {
                        assembly = Assembly.Load(li.AssemblyName);
                    }
                    ILogger logger = (ILogger)Activator.CreateInstance(assembly.GetType(li.ClassName));
                    logger.Parameters = li.Parameters;
                    project_collection.RegisterLogger(logger);
                }

                string projectFile = parameters.ProjectFile;
                if (!File.Exists(projectFile))
                {
                    ErrorUtilities.ReportError(0, String.Format("Project file '{0}' not found.", projectFile));
                    return;
                }

                XmlReaderSettings settings = new XmlReaderSettings();
                if (parameters.Validate)
                {
                    settings.ValidationType = ValidationType.Schema;
                    if (parameters.ValidationSchema == null)
                    {
                        using (var xsdxml = XmlReader.Create(defaultSchema))
                            settings.Schemas.Add(XmlSchema.Read(xsdxml, null));
                    }
                    else
                    {
                        using (var xsdxml = XmlReader.Create(parameters.ValidationSchema))
                            settings.Schemas.Add(XmlSchema.Read(xsdxml, null));
                    }
                }

                var projectInstances = new List <ProjectInstance> ();
                if (string.Equals(Path.GetExtension(projectFile), ".sln", StringComparison.OrdinalIgnoreCase))
                {
                    var parser = new SolutionParser();
                    var root   = ProjectRootElement.Create(project_collection);
                    root.FullPath = projectFile;
                    parser.ParseSolution(projectFile, project_collection, root, LogWarning);
                    projectInstances.Add(new Project(root, parameters.Properties, parameters.ToolsVersion, project_collection).CreateProjectInstance());
                }
                else
                {
                    project          = ProjectRootElement.Create(XmlReader.Create(projectFile, settings), project_collection);
                    project.FullPath = projectFile;
                    var pi = new ProjectInstance(project, parameters.Properties, parameters.ToolsVersion, project_collection);
                    projectInstances.Add(pi);
                }
                foreach (var projectInstance in projectInstances)
                {
                    var targets = parameters.Targets.Length > 0 ? parameters.Targets : projectInstance.DefaultTargets.ToArray();
                    result = projectInstance.Build(targets, parameters.Loggers.Count > 0 ? parameters.Loggers : project_collection.Loggers);
                    if (!result)
                    {
                        break;
                    }
                }
            }

            catch (InvalidProjectFileException ipfe) {
                ErrorUtilities.ReportError(0, show_stacktrace ? ipfe.ToString() : ipfe.Message);
            }

            catch (InternalLoggerException ile) {
                ErrorUtilities.ReportError(0, show_stacktrace ? ile.ToString() : ile.Message);
            }

            catch (CommandLineException cle) {
                ErrorUtilities.ReportError(cle.ErrorCode, show_stacktrace ? cle.ToString() : cle.Message);
            }
            finally {
                //if (project_collection != null)
                //	project_collection.UnregisterAllLoggers ();

                Environment.Exit(result ? 0 : 1);
            }
        }