Inheritance: DotNetProjectConfiguration
Beispiel #1
0
        protected override BuildResult OnBuild(IProgressMonitor monitor, ConfigurationSelector configuration)
        {
            // Handle pending events to ensure that files get saved right before the project is built
            DispatchService.RunPendingEvents();

            progressMonitor = monitor;
            buildingResult  = new BuildResult();
            var config = GetConfiguration(configuration) as MonoNaClProjectConfiguration;

            buildingConfig = config;

            var dirInfo = new DirectoryInfo(config.OutputDirectory);

            if (!dirInfo.Exists)
            {
                Directory.CreateDirectory(config.OutputDirectory);
            }

            if (config.CompileTarget == MonoDevelop.Projects.CompileTarget.Exe)
            {
                buildNaCl(buildingResult, config, configuration);
            }
            buildCS(buildingResult, config, configuration);

            return(buildingResult);
        }
Beispiel #2
0
        public override SolutionItemConfiguration CreateConfiguration(string name)
        {
            var conf = new MonoNaClProjectConfiguration(name);

            conf.CopyFrom(base.CreateConfiguration(name));
            return(conf);
        }
Beispiel #3
0
        private void buildCS(BuildResult result, MonoNaClProjectConfiguration config, ConfigurationSelector configSel)
        {
            string NACL_MONO_ROOT = MonoNaClSettingsService.Instance.NACL_MONO_ROOT;
            var    projProperties = ((CSharpCompilerParameters)config.CompilationParameters);

            // Get output name
            string OUTPUT_TARGET = config.CompileTarget == MonoDevelop.Projects.CompileTarget.Exe ? "exe" : "library";
            string CS_OUTPUT     = config.AppFullName;
            string PROJECT       = "main";      //config.AppName;

            // Get C and CS sources
            string CS_SOURCES = "";

            foreach (var file in Files)
            {
                string fullPath = '"' + file.FilePath.FullPath + '"' + ' ';
                switch (file.FilePath.Extension.ToLower())
                {
                case (".cs"): CS_SOURCES += fullPath; break;
                }

                // Copy dependency files
                if (file.CopyToOutputDirectory == FileCopyMode.Always || file.CopyToOutputDirectory == FileCopyMode.PreserveNewest)
                {
                    string virtualFileName = buildingConfig.OutputDirectory + file.ProjectVirtualPath.FullPath;
                    var    dstFileInfo     = new FileInfo(virtualFileName);

                    if (!dstFileInfo.Directory.Exists)
                    {
                        dstFileInfo.Directory.Create();
                    }
                    if (!dstFileInfo.Exists)
                    {
                        var srcFileInfo = new FileInfo(file.FilePath.FullPath);
                        srcFileInfo.CopyTo(virtualFileName);
                    }
                    else
                    {
                        if (file.CopyToOutputDirectory == FileCopyMode.Always)
                        {
                            var srcFileInfo = new FileInfo(file.FilePath.FullPath);
                            srcFileInfo.CopyTo(virtualFileName, true);
                        }
                        else
                        {
                            var srcFileInfo = new FileInfo(file.FilePath.FullPath);
                            if (srcFileInfo.LastWriteTimeUtc != dstFileInfo.LastWriteTimeUtc)
                            {
                                srcFileInfo.CopyTo(virtualFileName, true);
                            }
                        }
                    }
                }
            }
            if (CS_SOURCES == "")
            {
                return;
            }

            // Get .dll sources
            string CS_DLL_SOURCES = "";
            var    dlls           = new List <string>();

            foreach (var reference in References)
            {
                var names = reference.GetReferencedFileNames(configSel);
                foreach (var name in names)
                {
                    var    srcLibFileInfo = new FileInfo(name);
                    string filePath       = name;
                    if (reference.ReferenceType == ReferenceType.Package && reference.Package.Name == "mono")
                    {
                        string dstDirectory = string.Format("{0}/lib/mono/4.0/", NACL_MONO_ROOT);
                        filePath = dstDirectory + srcLibFileInfo.Name;
                    }

                    CS_DLL_SOURCES += "-r:" + '"' + filePath + '"' + " ";
                    dlls.Add(filePath);

                    if (config.CompileTarget == MonoDevelop.Projects.CompileTarget.Exe)
                    {
                        string dstName        = buildingConfig.OutputDirectory + "/" + srcLibFileInfo.Name;
                        var    dstLibFileInfo = new FileInfo(dstName);
                        if (!dstLibFileInfo.Exists || srcLibFileInfo.LastWriteTimeUtc != dstLibFileInfo.LastWriteTimeUtc)
                        {
                            srcLibFileInfo.CopyTo(dstName, true);
                        }
                    }
                }
            }

            if (dlls.Count != 0 && config.CompileTarget == MonoDevelop.Projects.CompileTarget.Exe)
            {
                using (var stream = new FileStream(string.Format("{0}/{1}.dep", buildingConfig.OutputDirectory, PROJECT), FileMode.Create, FileAccess.Write))
                    using (var writer = new StreamWriter(stream))
                    {
                        int i = 0;
                        foreach (var dll in dlls)
                        {
                            var fileInfo = new FileInfo(dll);
                            if (i == dlls.Count - 1)
                            {
                                writer.Write(fileInfo.Name);
                            }
                            else
                            {
                                writer.WriteLine(fileInfo.Name);
                            }
                            ++i;
                        }
                    }
            }

            // Get flags
            string flags = " -sdk:2";

            if (projProperties.UnsafeCode)
            {
                flags += " -unsafe";
            }
            if (projProperties.Optimize)
            {
                flags += " -optimize";
            }

            // Get compiler directives
            var symbols    = projProperties.DefineSymbols;
            var symbolList = symbols.Split(';', ' ');

            symbols = "";
            foreach (var symbol in symbolList)
            {
                if (!string.IsNullOrEmpty(symbol))
                {
                    symbols += "-define:" + symbol + " ";
                }
            }

            // Compile dll's and .exe
            string GMCS = string.Format(@"{0}/lib/mono/4.0/mcs.exe", NACL_MONO_ROOT);

            executeProgram(GMCS, string.Format(@"{0}{1} -out:{2} {3}-target:{4}{5}", symbols, CS_SOURCES, CS_OUTPUT, CS_DLL_SOURCES, OUTPUT_TARGET, flags));            //-pkg:gtk-sharp

            // Copy over mscorlib.dll
            if (config.CompileTarget == MonoDevelop.Projects.CompileTarget.Exe)
            {
                string mscorlibPath    = buildingConfig.OutputDirectory + "/mscorlib.dll";
                var    dstCoreFileInfo = new FileInfo(mscorlibPath);
                if (!dstCoreFileInfo.Exists)
                {
                    var srcCoreFileInfo = new FileInfo(string.Format("{0}/lib/mono/4.0/mscorlib.dll", NACL_MONO_ROOT));
                    srcCoreFileInfo.CopyTo(mscorlibPath);
                }
            }
        }
Beispiel #4
0
        private void buildNaCl(BuildResult result, MonoNaClProjectConfiguration config, ConfigurationSelector configSel)
        {
            string NACL_SDK_ROOT  = MonoNaClSettingsService.Instance.NACL_SDK_ROOT;
            string NACL_MONO_ROOT = MonoNaClSettingsService.Instance.NACL_MONO_ROOT;

            // Set compiler flags
            string WARNINGS = "-Wno-long-long -Wall";            //"-w";
            string CFLAGS   = string.Format(@"-O0 -g {0} -I {1}/include/mono-2.0", WARNINGS, NACL_MONO_ROOT);
            string flags    = "";

            if (RequiresGLES)
            {
                flags = "-lppapi_gles2 ";
            }
            string LDFLAGS   = string.Format(@"{0}-lppapi -lmono-2.0 -L {1}/lib32 -Wl,--export-dynamic -ldl", flags, NACL_MONO_ROOT);
            string LDFLAGS64 = string.Format(@"{0}-lppapi -lmono-2.0 -L {1}/lib -Wl,--export-dynamic -ldl", flags, NACL_MONO_ROOT);

            // Get output name
            string PROJECT = "main";            //config.AppName;

            // Get C and CS sources
            string CC_SOURCES = "";

            foreach (var file in Files)
            {
                string fullPath = '"' + file.FilePath.FullPath + '"' + ' ';
                switch (file.FilePath.Extension.ToLower())
                {
                case (".c"): CC_SOURCES += fullPath; break;
                }
            }
            if (CC_SOURCES == "")
            {
                return;
            }

            // Get .dll sources
            string CS_DLL_SOURCES = "";

            foreach (var reference in References)
            {
                var names = reference.GetReferencedFileNames(configSel);
                foreach (var name in names)
                {
                    CS_DLL_SOURCES += "-r:" + '"' + name + '"';
                }
            }

            // Get OS name
            string OSNAME = executeProgram("python", string.Format(@"{0}/tools/getos.py", NACL_SDK_ROOT));

            // If libmono was compiled in a posix environment (NaCl) use forward slashes so Windows can cope with the paths.
            if (OSNAME == "win")
            {
                NACL_SDK_ROOT  = NACL_SDK_ROOT.Replace(@"\", @"/");
                NACL_MONO_ROOT = NACL_MONO_ROOT.Replace(@"\", @"/");
            }

            // Get System architecture type
            //string ARCH = executeProgram("python", string.Format(@"{0}/tools/getos.py --arch", NACL_SDK_ROOT));

            // Get NaCl Tool Chain path
            string TC_PATH = string.Format(@"{0}/toolchain/{1}_x86_glibc", NACL_SDK_ROOT, OSNAME);

            // Get NaCl gcc compiler
            string CC = string.Format(@"{0}/bin/i686-nacl-gcc", TC_PATH);

            // Compile .nexe's
            executeProgram(CC, string.Format(@"-o {0} {1} -m32 -O0 -g {2} {3}", PROJECT + "_x86_32.nexe", CC_SOURCES, CFLAGS, LDFLAGS));
            executeProgram(CC, string.Format(@"-o {0} {1} -m64 -O0 -g {2} {3}", PROJECT + "_x86_64.nexe", CC_SOURCES, CFLAGS, LDFLAGS64));

            // Generate manifiest(.nmf) file
            string NMF       = string.Format(@"{0}/tools/create_nmf.py", NACL_SDK_ROOT);
            string NMF_ARGS  = string.Format(@"-D {0}/x86_64-nacl/bin/objdump", TC_PATH);
            string NMF_PATHS = string.Format(@"-L {0}/x86_64-nacl/lib32 -L {0}/x86_64-nacl/lib -L {1}/lib32 -L {1}/lib", TC_PATH, NACL_MONO_ROOT);

            executeProgram("python", string.Format(@"{0} {1} -s . -o {2}.nmf {2}_x86_64.nexe {2}_x86_32.nexe {3}", NMF, NMF_ARGS, PROJECT, NMF_PATHS));

            // Copy and create other nacl files
            if (config.CompileTarget == MonoDevelop.Projects.CompileTarget.Exe)
            {
                // Create manifest.json
                if (GenerateManifest)
                {
                    var manifest = new Manifest();
                    manifest.manifest_version = 2;
                    manifest.version          = AppVersion;
                    manifest.name             = AppName;
                    manifest.description      = AppDescription;

                    manifest.app                   = new Manifest.App();
                    manifest.app.launch            = new Manifest.App.Launch();
                    manifest.app.launch.local_path = "main.html";

                    if (RequiresGLES)
                    {
                        manifest.requirements              = new Manifest.Requirements();
                        manifest.requirements._3d          = new Manifest.Requirements._3D();
                        manifest.requirements._3d.features = new string[2]
                        {
                            "css3d",
                            "webgl"
                        };
                    }

                    manifest.permissions = new string[2]
                    {
                        "unlimitedStorage",
                        "notifications"
                    };

                    var json         = new DataContractJsonSerializer(typeof(Manifest));
                    var memoryStream = new MemoryStream();
                    json.WriteObject(memoryStream, manifest);

                    memoryStream.Position = 0;
                    var reader = new StreamReader(memoryStream);
                    var value  = reader.ReadToEnd();
                    value = Regex.Replace(value, @"\," + '"' + @"\w*" + '"' + @"\:null", "", RegexOptions.Singleline);
                    value = Regex.Replace(value, '"' + @"\w*" + '"' + @"\:null", "", RegexOptions.Singleline);

                    using (var stream = new FileStream(config.OutputDirectory + "/manifest.json", FileMode.Create, FileAccess.Write))
                        using (var writer = new StreamWriter(stream))
                        {
                            writer.Write(value);
                        }
                }

                // Copy Json and Html files
                if (CopyAllJsonObjects || CopyAllHtmlObjects || CopyAllJSObjects)
                {
                    foreach (var file in Files)
                    {
                        var    srcFileInfo = new FileInfo(file.FilePath.FullPath);
                        string dstDir      = config.OutputDirectory + "/" + srcFileInfo.Name;
                        var    dstFileInfo = new FileInfo(dstDir);
                        if (dstFileInfo.LastWriteTimeUtc != srcFileInfo.LastWriteTimeUtc)
                        {
                            string ext = file.FilePath.Extension.ToLower();
                            if (CopyAllJsonObjects && ext == ".json")
                            {
                                srcFileInfo.CopyTo(dstDir, true);
                            }

                            if (CopyAllJsonObjects && ext == ".html")
                            {
                                srcFileInfo.CopyTo(dstDir, true);
                            }

                            if (CopyAllJSObjects && ext == ".js")
                            {
                                srcFileInfo.CopyTo(dstDir, true);
                            }
                        }
                    }
                }
            }
        }