Beispiel #1
0
        public static int Main(string[] args)
        {
            var options = new Options();
            var parser  = new Parser(new ParserSettings(System.Console.Out));

            if (!parser.ParseArguments(args, options) || options.Input.Count < 1)
            {
                System.Console.WriteLine(options.GetUsage());
                return(1);
            }

            var assembly = EcsCompilerService.AssemblyHelper.LoadAssemblyWithResolver(options.Input[0]);

            MethodDefinition entryPoint;

            if (options.Test != null)
            {
                var tests         = TestDiscovery.DiscoverTests(assembly);
                var filteredTests = tests.Where(x => (x.DeclaringType.Name + "." + x.Name).StartsWith(options.Test) || x.FullName.StartsWith(options.Test)).ToArray();


                if (filteredTests.Count() == 0)
                {
                    throw new ArgumentException("No matching test was found");
                }
                else
                {
                    var mod = ModuleDefinition.CreateModule("TestModule", new ModuleParameters {
                        AssemblyResolver = assembly.AssemblyResolver
                    });
                    var testClass = TestEntryGenerator.GenerateTestEntry(filteredTests, mod);

                    // make sure the actual code is resolvable
                    assembly.Types.Add(testClass);

                    entryPoint = testClass.Methods.Last();
                }
            }
            else
            {
                if (options.EntryClass == null)
                {
                    entryPoint = assembly.Types.Select(x => x.Methods.FirstOrDefault(m => m.Name == "Main" && m.IsStatic)).First(x => x != null);
                }
                else
                {
                    var entryType = assembly.Types.First(x => x.Name == options.EntryClass);
                    entryPoint = entryType.Methods.First(x => x.Name == "Main" && x.IsStatic);
                }
            }

            //Logger.IsVerbose = options.Verbose;

            // Ouput directory
            var outputdir = options.OutputDir;

            if (outputdir == null)
            {
                //var targetString = toolchain.GetType().Name.Replace("Target", "");
                var targetString = "";
                outputdir = "out_" + targetString;
            }

            var execName = assembly.Name;

            // directly include source/header files
            IncludeCFiles.SrcDir  = "../../..";
            IncludeCFiles.DestDir = outputdir;

            System.Console.WriteLine("Generating C Code ...");
            var cFiles = CompilerService.Run(entryPoint);


            var target      = new TargetPC();
            var targetFiles = target.ConvertTargetFiles(cFiles, execName, entryPoint.DeclaringType.Name + "_Main");

            // todo: is this still needed?
            if (options.Override)               // override all taget files
            {
                foreach (var t in targetFiles)
                {
                    t.Override = true;
                }
            }

            FileWriter.SaveFiles(targetFiles, outputdir);

            if (options.GenerateOnly)
            {
                return(0);
            }

            RunOptions runOptions = new RunOptions {
                Verbose    = options.Verbose,
                WorkingDir = outputdir,
                Variant    = options.Board
            };

            System.Console.WriteLine("Compiling ...");
            target.Compile(runOptions, execName);


            if (options.CompileOnly)
            {
                return(0);
            }

            int returnCode = 0;

            try {
                System.Console.WriteLine("Running ...");
                target.Exec(runOptions, execName);
            } catch (BadReturnCodeExcpetion e) {
                returnCode = e.Code;
            }

            System.Console.WriteLine();

            if (returnCode != 0)
            {
                System.Console.WriteLine("Program terminated with return code {0}", returnCode);
            }

            if (options.Wait)
            {
                System.Console.WriteLine("Done - Press Key to Exit");
                System.Console.ReadKey();
            }

            return(returnCode);
        }