public static int Main(string[] _args) { var args = new List <string> (_args); bool useStdout = false, showHelp = false, strictMode = false; for (int i = 0; i < args.Count; i++) { var arg = args[i]; if (!arg.StartsWith("-")) { continue; } switch (arg) { case "-?": case "--help": case "-h": showHelp = true; break; case "--trace": case "--trace1": SourcesParser.TraceLevel = 1; break; case "--trace2": SourcesParser.TraceLevel = 2; break; case "--trace3": SourcesParser.TraceLevel = 3; break; case "--trace4": SourcesParser.TraceLevel = 4; break; case "--stdout": useStdout = true; break; case "--strict": strictMode = true; break; default: Console.Error.WriteLine("Unrecognized switch " + arg); break; } args.RemoveAt(i); i--; } if (args.Count != 4) { showHelp = true; } if (showHelp) { Console.Error.WriteLine("Usage: mcs/build/gensources.exe [options] (outputFileName|--stdout) libraryDirectoryAndName platformName profileName"); Console.Error.WriteLine("You can specify * for platformName and profileName to read all sources files"); Console.Error.WriteLine("Available options:"); Console.Error.WriteLine("--help -h -?"); Console.Error.WriteLine(" Show command line info"); Console.Error.WriteLine("--trace1 --trace2 --trace3 --trace4"); Console.Error.WriteLine(" Enable diagnostic output"); Console.Error.WriteLine("--stdout"); Console.Error.WriteLine(" Writes results to standard output (omit outputFileName if you use this)"); Console.Error.WriteLine("--strict"); Console.Error.WriteLine(" Produces an error exit code if files or directories are invalid/missing"); return(1); } var myAssembly = Assembly.GetExecutingAssembly(); var codeBase = new Uri(myAssembly.CodeBase); var executablePath = Path.GetFullPath(codeBase.LocalPath); var executableDirectory = Path.GetDirectoryName(executablePath); var outFile = Path.GetFullPath(args[0]); var libraryFullName = Path.GetFullPath(args[1]); var platformName = args[2]; var profileName = args[3]; var platformsFolder = Path.Combine(executableDirectory, "platforms"); var profilesFolder = Path.Combine(executableDirectory, "profiles"); var libraryDirectory = Path.GetDirectoryName(libraryFullName); var libraryName = Path.GetFileName(libraryFullName); var parser = new SourcesParser(platformsFolder, profilesFolder); var result = parser.Parse(libraryDirectory, libraryName, platformName, profileName); if (SourcesParser.TraceLevel > 0) { Console.Error.WriteLine($"// Writing sources for platform {platformName} and profile {profileName}, relative to {libraryDirectory}, to {outFile}."); } TextWriter output; if (useStdout) { output = Console.Out; } else { output = new StreamWriter(outFile); } using (output) { foreach (var fileName in result.GetFileNames().OrderBy(s => s, StringComparer.Ordinal)) { output.WriteLine(fileName); } } if (strictMode) { return(result.ErrorCount); } else { return(0); } }
public static int Main(string[] _args) { var args = new List <string> (_args); bool useStdout = false, showHelp = false, strictMode = false; string baseDir = null; for (int i = 0; i < args.Count; i++) { var arg = args[i]; if (!arg.StartsWith("-")) { continue; } string argValue = null; var offset = arg.IndexOf(':'); if (offset >= 0) { argValue = arg.Substring(offset + 1); arg = arg.Substring(0, offset); } switch (arg) { case "-?": case "--help": case "-h": showHelp = true; break; case "--trace": if (argValue != null) { SourcesParser.TraceLevel = int.Parse(argValue); } else { SourcesParser.TraceLevel = 1; } break; case "--stdout": useStdout = true; break; case "--strict": strictMode = true; break; case "--basedir": baseDir = argValue; break; default: Console.Error.WriteLine($"// Unrecognized switch {arg}. Aborting."); return(1); } args.RemoveAt(i); i--; } if ((args.Count < 3) || (args.Count > 4)) { showHelp = true; } if (showHelp) { Console.Error.WriteLine("Usage: mcs/build/gensources.exe [options] (outputFileName|--stdout) libraryDirectoryAndName platformName profileName"); Console.Error.WriteLine("or mcs/build/gensources.exe [options] (outputFileName|--stdout) (--baseDir:<dir>) sourcesFile exclusionsFile"); Console.Error.WriteLine("You can specify * for platformName and profileName to read all sources files"); Console.Error.WriteLine("Available options:"); Console.Error.WriteLine("--help -h -?"); Console.Error.WriteLine(" Show command line info"); Console.Error.WriteLine("--trace:n"); Console.Error.WriteLine(" Enable diagnostic output, at tracing level n (1-4)"); Console.Error.WriteLine("--stdout"); Console.Error.WriteLine(" Writes results to standard output (omit outputFileName if you use this)"); Console.Error.WriteLine("--strict"); Console.Error.WriteLine(" Produces an error exit code if files or directories are invalid/missing"); Console.Error.WriteLine("--basedir:<dir>"); Console.Error.WriteLine(" Sets the base directory when reading a single sources/exclusions pair (default is the directory containing the sources file)"); return(1); } var myAssembly = Assembly.GetExecutingAssembly(); var codeBase = new Uri(myAssembly.CodeBase); var executablePath = Path.GetFullPath(codeBase.LocalPath); var executableDirectory = Path.GetDirectoryName(executablePath); var outFile = Path.GetFullPath(args[0]); var platformsFolder = Path.Combine(executableDirectory, "platforms"); var profilesFolder = Path.Combine(executableDirectory, "profiles"); if (!Directory.Exists(platformsFolder) || !Directory.Exists(profilesFolder)) { Console.Error.WriteLine($"// Platforms and/or profiles folders are missing: '{platformsFolder}' '{profilesFolder}'. Aborting."); return(1); } var parser = new SourcesParser(platformsFolder, profilesFolder); ParseResult result; if (args.Count == 3) { var sourcesFile = Path.GetFullPath(args[1]); var excludesFile = Path.GetFullPath(args[2]); var directory = Path.GetDirectoryName(sourcesFile); if ((Path.GetDirectoryName(excludesFile) != directory) && (baseDir == null)) { Console.Error.WriteLine("// Sources and exclusions files are in different directories. Aborting."); return(1); } result = parser.Parse(baseDir ?? directory, sourcesFile, excludesFile); if (SourcesParser.TraceLevel > 0) { Console.Error.WriteLine($"// Writing sources from {sourcesFile} minus {excludesFile}, to {outFile}."); } } else if (args.Count == 4) { if (baseDir != null) { Console.Error.WriteLine($"// WARNING: baseDir has no effect in this mode"); } var libraryFullName = Path.GetFullPath(args[1]); var platformName = args[2].Trim(); var profileName = args[3].Trim(); var libraryDirectory = Path.GetDirectoryName(libraryFullName); var libraryName = Path.GetFileName(libraryFullName); result = parser.Parse(libraryDirectory, libraryName, platformName, profileName); if (SourcesParser.TraceLevel > 0) { Console.Error.WriteLine($"// Writing sources for platform {platformName} and profile {profileName}, relative to {libraryDirectory}, to {outFile}."); } } else { throw new Exception(); } var fileNames = result.GetMatches() .OrderBy(e => e.RelativePath, StringComparer.Ordinal) .Select(e => e.RelativePath) .Distinct() .ToList(); var unexpectedEmptyResult = (fileNames.Count == 0); // HACK: We have sources files that are literally empty, so as long as *some* sources files were // parsed during this invocation and they are all empty, producing no matching file names is not // an error. if ((result.SourcesFiles.Count > 0) && result.SourcesFiles.Values.All(sf => sf.Sources.Count == 0)) { unexpectedEmptyResult = false; } if ((result.ErrorCount > 0) || unexpectedEmptyResult) { Console.Error.WriteLine($"// gensources produced {result.ErrorCount} error(s) and a set of {fileNames.Count} filename(s)"); Console.Error.WriteLine($"// Invoked with '{Environment.CommandLine}'"); Console.Error.WriteLine($"// Working directory was '{Environment.CurrentDirectory}'"); if (strictMode) { // HACK: Make ignores non-zero exit codes so we need to delete the sources file ??? if (!useStdout && File.Exists(outFile)) { File.Delete(outFile); } return(result.ErrorCount + 1); } } TextWriter output; if (useStdout) { output = Console.Out; } else { output = new StreamWriter(outFile); } using (output) { foreach (var fileName in fileNames) { output.WriteLine(fileName); } } return(0); }