Exemple #1
0
    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);
        }
    }
Exemple #2
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);
    }