Exemplo n.º 1
0
        private static bool GetStandardClassLibraryEntryPoint(NativeCompilerParameters parameters, string classLibrary)
        {
            if (parameters.IsBaseLibrary)
            {
                return(true);
            }
            if (classLibrary == "")
            {
                return(true);
            }

            Assembly assembly;

            try
            {
                assembly = Assembly.LoadFile(classLibrary);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine("Cannot find or load the standard class library assembly: {0}.", classLibrary);
                return(false);
            }

            foreach (Type type in assembly.GetExportedTypes())
            {
                foreach (MethodInfo method in type.GetMethods())
                {
                    if (method.GetCustomAttribute(typeof(ScopeInitializerAttribute)) != null)
                    {
                        ParameterInfo[] ps = method.GetParameters();
                        if ((ps != null) && (ps.Length == 2))
                        {
                            if ((ps[0].ParameterType == typeof(SmalltalkRuntime)) && (ps[1].ParameterType == typeof(SmalltalkNameScope)))
                            {
                                if (parameters.ExtensionScopeInitializer != null)
                                {
                                    Console.WriteLine("The assembly {0} does not appear to be IronSmalltalk class library.", classLibrary);
                                    Console.WriteLine("Several public methods were decorated with the [ScopeInitializer] attribute.");
                                    return(false);
                                }
                                parameters.ExtensionScopeInitializer = method;
                            }
                        }
                    }
                }
            }

            if (parameters.ExtensionScopeInitializer == null)
            {
                Console.WriteLine("The assembly {0} does not appear to be IronSmalltalk class library.", classLibrary);
                Console.WriteLine("IronSmalltalk class libraries have a public method decorated with the [ScopeInitializer] attribute.");
                return(false);
            }

            return(true);
        }
Exemplo n.º 2
0
        private static string Compile(NativeCompilerParameters parameters, bool installMetaAnnotations, IEnumerable <string> sourceFiles)
        {
            List <PathFileInInformation> fileIns = new List <PathFileInInformation>();

            foreach (string sourceFile in sourceFiles)
            {
                SymbolDocumentInfo symbolDocument = null;
                if (parameters.EmitDebugSymbols)
                {
                    symbolDocument = Expression.SymbolDocument(sourceFile, GlobalConstants.LanguageGuid, GlobalConstants.VendorGuid);
                }
                PathFileInInformation fileIn = new PathFileInInformation(sourceFile, System.Text.Encoding.UTF8, new FileInErrorSink(sourceFile), symbolDocument);
                fileIns.Add(fileIn);
            }

            if (fileIns.Count == 0)
            {
                return(null);
            }

            SmalltalkRuntime runtime;

            if (parameters.ExtensionScopeInitializer == null)
            {
                runtime = new SmalltalkRuntime();
            }
            else
            {
                runtime = NativeLoadHelper.CreateRuntime(false,
                                                         (rt, scope) => { parameters.ExtensionScopeInitializer.Invoke(null, new object[] { rt, scope }); },
                                                         (rt, scope) => { /* Nothing here */ });
            }

            FileInService compilerService = new FileInService(runtime, installMetaAnnotations, fis =>
                                                              parameters.IsBaseLibrary ? new InternalInstallerContext(fis.Runtime) : new InterchangeInstallerContext(fis.Runtime));

            InterchangeInstallerContext installer = compilerService.Read(fileIns);

            foreach (var fileIn in fileIns)
            {
                if (((FileInErrorSink)fileIn.ErrorSink).HadError)
                {
                    return(null);    // Some of the source file had errors, do not attempt the rest - it's meaningless
                }
            }

            installer.ErrorSink = new InstallErrorSink();
            installer.InstallMetaAnnotations = compilerService.InstallMetaAnnotations;
            if (!installer.Install())
            {
                return(null);
            }

            parameters.Runtime = runtime;
            return(NativeCompiler.NativeCompiler.GenerateNativeAssembly(parameters));
        }
Exemplo n.º 3
0
        private static void PrintParameters(NativeCompilerParameters parameters, bool installMetaAnnotations, IEnumerable <string> sourceFiles)
        {
            string classLibrary = "N/A";

            if (!parameters.IsBaseLibrary)
            {
                classLibrary = parameters.ExtensionScopeInitializer.DeclaringType.Assembly.Location;
            }
            Console.WriteLine(@"
Assembly Name:    {0}
Namespace:        {1}
Output Location:  {2}
Target Type:      {3}
Class Library:    {4}
Debug Info:       {5}
Meta Annotations: {6}
IST Base Library: {7}
Assembly Version: {8}
Company:          {9}
Copyright:        {10}
Description:      {11}
File Version:     {12}
Product:          {13}
Product Title:    {14}
Product Version:  {15}
Trademark:        {16}
Source Files:",
                              parameters.AssemblyName,
                              parameters.RootNamespace,
                              parameters.OutputDirectory,
                              parameters.AssemblyType,
                              classLibrary,
                              parameters.EmitDebugSymbols,
                              installMetaAnnotations,
                              parameters.IsBaseLibrary,
                              parameters.AssemblyVersion,
                              parameters.Company,
                              parameters.Copyright,
                              parameters.ProductDescription,
                              parameters.FileVersion,
                              parameters.Product,
                              parameters.ProductTitle,
                              parameters.ProductVersion,
                              parameters.Trademark);

            foreach (string file in sourceFiles)
            {
                Console.WriteLine("    " + file);
            }

            Console.WriteLine();
        }
Exemplo n.º 4
0
 private void SetFileVersion(NativeCompilerParameters parameters)
 {
     if (!String.IsNullOrWhiteSpace(parameters.ProductTitle))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyTitleCtor, new object[] { parameters.ProductTitle }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.ProductDescription))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyDescriptionCtor, new object[] { parameters.ProductDescription }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.Company))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyCompanyCtor, new object[] { parameters.Company }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.Product))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyProductCtor, new object[] { parameters.Product }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.Copyright))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyCopyrightCtor, new object[] { parameters.Copyright }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.Trademark))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyTrademarkCtor, new object[] { parameters.Trademark }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.ProductVersion))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyVersionCtor, new object[] { parameters.ProductVersion }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.ProductVersion))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyInformationalVersionCtor, new object[] { parameters.ProductVersion }));
     }
     if (!String.IsNullOrWhiteSpace(parameters.FileVersion))
     {
         this.AssemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(NativeGenerator.AssemblyFileVersionCtor, new object[] { parameters.FileVersion }));
     }
 }
Exemplo n.º 5
0
        internal NativeGenerator(NativeCompilerParameters parameters)
        {
            this.Parameters   = parameters;
            this.AssemblyName = new AssemblyName(parameters.AssemblyName);
            if (!String.IsNullOrWhiteSpace(parameters.AssemblyVersion))
            {
                this.AssemblyName.Version = new Version(parameters.AssemblyVersion);
            }
            string filename = String.Format("{0}.{1}", this.AssemblyName.Name, parameters.FileExtension);

            this.OutputPath = System.IO.Path.Combine(parameters.OutputDirectory, filename);

            if (this.Parameters.EmitDebugSymbols)
            {
                this.DebugInfoGenerator = DebugInfoGenerator.CreatePdbGenerator();
            }

            CustomAttributeBuilder[] attributes = new CustomAttributeBuilder[] {};

            this.AssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
                this.AssemblyName,
                AssemblyBuilderAccess.Save,
                this.Parameters.OutputDirectory,
                false,
                attributes);

            if (this.Parameters.EmitDebugSymbols)
            {
                this.SetDebuggableAttributes();
            }

            this.SetFileVersion(parameters);

            this.AssemblyBuilder.DefineVersionInfoResource();

            this.ModuleBuilder = this.AssemblyBuilder.DefineDynamicModule(this.AssemblyName.Name, filename, this.Parameters.EmitDebugSymbols);
        }
Exemplo n.º 6
0
        internal static string Compile(string[] args)
        {
            if (args == null)
            {
                return(CommandLineCompiler.PrintUsage());
            }

            bool   showCopyrightMessage         = true;
            bool   printParameters              = true;
            string classLibrary                 = null;
            bool   installMetaAnnotations       = false;
            NativeCompilerParameters parameters = new NativeCompilerParameters();

            parameters.Product      = "IronSmalltalk Application";
            parameters.ProductTitle = "IronSmalltalk Application";
            parameters.AssemblyType = NativeCompilerParameters.AssemblyTypeEnum.Exe;
            List <string> sourceFiles = new List <string>();
            string        option      = null;

            foreach (string arg in args)
            {
                if (arg == null)
                {
                    return(CommandLineCompiler.PrintUsage());
                }
                if (option != null)
                {
                    if ((option == "a") || (option == "assemblyname"))
                    {
                        parameters.AssemblyName = arg;
                    }
                    else if ((option == "n") || (option == "namespace"))
                    {
                        parameters.RootNamespace = arg;
                    }
                    else if ((option == "o") || (option == "out"))
                    {
                        parameters.OutputDirectory = Path.GetFullPath(arg);
                    }
                    else if ((option == "t") || (option == "target"))
                    {
                        option = arg.ToLower().Trim();
                        if (option == "dll")
                        {
                            parameters.AssemblyType = NativeCompilerParameters.AssemblyTypeEnum.Dll;
                        }
                        else if (option == "exe")
                        {
                            parameters.AssemblyType = NativeCompilerParameters.AssemblyTypeEnum.Exe;
                        }
                        else if (option == "exe32")
                        {
                            parameters.AssemblyType = NativeCompilerParameters.AssemblyTypeEnum.Exe32;
                        }
                        else if (option == "exe64")
                        {
                            parameters.AssemblyType = NativeCompilerParameters.AssemblyTypeEnum.Exe64;
                        }
                        else
                        {
                            return(CommandLineCompiler.PrintUsage());
                        }
                    }
                    else if ((option == "c") || (option == "classlibrary"))
                    {
                        string cl = arg.Trim();
                        if (String.IsNullOrWhiteSpace(cl))
                        {
                            return(CommandLineCompiler.PrintUsage());
                        }
                        classLibrary = Path.GetFullPath(cl);
                    }
                    else if ((option == "v") || (option == "version"))
                    {
                        parameters.AssemblyVersion = arg;
                        parameters.FileVersion     = arg;
                        parameters.ProductVersion  = arg;
                    }
                    else if (option == "company")
                    {
                        parameters.Company = arg;
                    }
                    else if (option == "copyright")
                    {
                        parameters.Copyright = arg;
                    }
                    else if (option == "product")
                    {
                        parameters.Product = arg;
                    }
                    else if (option == "assemblyversion")
                    {
                        parameters.AssemblyVersion = arg;
                    }
                    else if (option == "fileversion")
                    {
                        parameters.FileVersion = arg;
                    }
                    else if (option == "productversion")
                    {
                        parameters.ProductVersion = arg;
                    }
                    else if (option == "producttitle")
                    {
                        parameters.ProductTitle = arg;
                    }
                    else if (option == "productdescription")
                    {
                        parameters.ProductDescription = arg;
                    }
                    else if (option == "trademark")
                    {
                        parameters.Trademark = arg;
                    }
                    else
                    {
                        return(CommandLineCompiler.PrintUsage());
                    }
                    option = null;
                }
                else if (arg.StartsWith("-") || arg.StartsWith("/"))
                {
                    option = arg.Substring(1).ToLower().Trim();
                    if (option.Length == 0)
                    {
                        return(CommandLineCompiler.PrintUsage());
                    }
                    if (option[option.Length - 1] == ':')
                    {
                        option = option.Substring(0, option.Length - 1);
                    }
                    if (option.Length == 0)
                    {
                        return(CommandLineCompiler.PrintUsage());
                    }

                    if ((option == "d") || (option == "debug"))
                    {
                        parameters.EmitDebugSymbols = true;
                        option = null;
                    }
                    else if (option == "metaannotations")
                    {
                        parameters.EmitDebugSymbols = true;
                        option = null;
                    }
                    else if (option == "baselibrary")
                    {
                        parameters.IsBaseLibrary = true;
                        option = null;
                    }
                    else if (option == "noclasslibrary")
                    {
                        classLibrary = "";
                        option       = null;
                    }
                    else if (option == "nologo")
                    {
                        showCopyrightMessage = false;
                        option = null;
                    }
                    else if ((option == "q") || (option == "quiet"))
                    {
                        printParameters = false;
                        option          = null;
                    }
                    else if (option == "istscl")
                    {
                        // Undocumented parameter .... shortcut to set the parameters for compiling the
                        // IronSmalltalk Standard Class Library. Pats are relative to the .Net project.
                        parameters.AssemblyName    = "IronSmalltalk.ClassLibrary";
                        parameters.AssemblyName    = "IronSmalltalk.ClassLibrary";
                        parameters.OutputDirectory = Path.GetFullPath(".");
                        parameters.AssemblyType    = NativeCompilerParameters.AssemblyTypeEnum.Dll;
                        classLibrary = "";
                        parameters.AssemblyVersion    = typeof(CommandLineCompiler).Assembly.GetName().Version.ToString();
                        parameters.FileVersion        = parameters.AssemblyVersion;
                        parameters.ProductVersion     = parameters.AssemblyVersion;
                        parameters.IsBaseLibrary      = true;
                        parameters.Company            = "The IronSmalltalk Project";
                        parameters.Copyright          = "Copyright © The IronSmalltalk Project 2013";
                        parameters.Product            = "IronSmalltalk";
                        parameters.ProductTitle       = "IronSmalltalk Standard Class Library";
                        parameters.ProductDescription = "IronSmalltalk Standard Class Library";
#if DEBUG
                        parameters.EmitDebugSymbols = true;
#endif
                        option = null;
                        sourceFiles.Add(Path.GetFullPath(@"..\..\..\ClassLibraryBrowser\External\IronSmalltalk.ist"));
                    }
                }
                else
                {
                    sourceFiles.Add(Path.GetFullPath(arg));
                }
            }

            if (sourceFiles.Count == 0)
            {
                return(CommandLineCompiler.PrintUsage());
            }
            if (String.IsNullOrWhiteSpace(parameters.AssemblyName))
            {
                parameters.AssemblyName = Path.GetFileNameWithoutExtension(sourceFiles[0]);
            }
            if (String.IsNullOrWhiteSpace(parameters.RootNamespace))
            {
                parameters.RootNamespace = parameters.AssemblyName;
            }
            if (String.IsNullOrWhiteSpace(parameters.OutputDirectory))
            {
                parameters.OutputDirectory = Directory.GetCurrentDirectory();
            }
            if (parameters.IsBaseLibrary && (parameters.AssemblyType != NativeCompilerParameters.AssemblyTypeEnum.Dll))
            {
                return(CommandLineCompiler.PrintUsage());
            }

            if (classLibrary == null)
            {
                classLibrary = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "IronSmalltalk.ClassLibrary.dll");
            }

            try
            {
                if (showCopyrightMessage)
                {
                    CommandLineCompiler.PrintCopyrightMessage();
                }

                if (!CommandLineCompiler.GetStandardClassLibraryEntryPoint(parameters, classLibrary))
                {
                    return(null);
                }

                if (!Directory.Exists(parameters.OutputDirectory))
                {
                    Console.WriteLine();
                    Console.WriteLine("Output Directory does not exists.");
                    return(null);
                }

                if (printParameters)
                {
                    CommandLineCompiler.PrintParameters(parameters, installMetaAnnotations, sourceFiles);
                }

                string path = CommandLineCompiler.Compile(parameters, installMetaAnnotations, sourceFiles);
                if (path == null)
                {
                    return(null);
                }

                if (printParameters)
                {
                    Console.WriteLine("Assembly saved to:\n    {0}", path);
                }

                return(path);
            }
            catch (FileNotFoundException ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return(null);
            }
        }