コード例 #1
0
ファイル: Program.cs プロジェクト: darkhunterbg/xenocore2
        static XenoCoreLibrary CreateLibrary(String currentDir)
        {
            String          sourceDir = Path.GetFullPath(Path.Combine(currentDir, $@"..\..\..\src"));
            String          libDir    = currentDir;
            XenoCoreLibrary library   = new XenoCoreLibrary(LibPlatform)
            {
                LibDir = libDir
            };

            library.Sources.Add(new XenoCoreSource()
            {
                IncludeDir = Path.Combine(sourceDir, library.ProjectName)
            });
            library.Sources.Add(new XenoCoreSource()
            {
                IncludeDir = Path.Combine(sourceDir, library.LibraryName)
            });
            return(library);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: darkhunterbg/xenocore2
        static void Main(string[] args)
        {
            int    workingDir = args.ToList().IndexOf("--dir");
            String currentDir = null;

            if (workingDir > -1)
            {
                currentDir = args[workingDir + 1];
            }
            else
            {
                currentDir = Directory.GetCurrentDirectory();
            }

            XenoCoreLibrary library = CreateLibrary(currentDir);

            var outputDir = Path.Combine(currentDir, "bindings", library.LibraryName);

            if (!File.Exists(Path.Combine(currentDir, library.LibraryFileName)))
            {
                Console.WriteLine($"{library.LibraryFileName} is missing. Skipping bindings generation...");
                BuildProjectFile(outputDir, library);
                return;
            }

            String genFile      = Path.Combine(outputDir, GenFileName);
            var    genModified  = File.GetLastWriteTime(genFile);
            var    toolModified = File.GetLastWriteTime(Path.Combine(currentDir, "BindingsGenerator.exe"));

            bool forceRebuild = toolModified > genModified;

            if (args.Contains("--rebuild"))
            {
                forceRebuild = true;
            }



            //if (!forceRebuild)
            //{
            //    if (File.Exists(genFile))
            //    {
            //        var libModified = File.GetLastWriteTime(Path.Combine(currentDir, library.LibraryFileName));

            //        if (libModified < genModified)
            //        {
            //            Console.WriteLine("Library was not modified. Skipping binding generation...");
            //            return;
            //        }
            //    }
            //}

            int modifiedFiles = 0;

            foreach (var source in library.Sources)
            {
                var dir = new DirectoryInfo(source.IncludeDir);

                foreach (var file in dir.GetFiles("*.h"))
                {
                    var bindingModified = File.GetLastWriteTime(Path.Combine(outputDir, file.Name));

                    if (forceRebuild || file.LastWriteTime > bindingModified)
                    {
                        ++modifiedFiles;
                        source.Headers.Add(file.Name);
                    }
                }
            }


            Console.WriteLine($"{modifiedFiles} files were modified and need new bindings.");

            if (modifiedFiles > 0)
            {
                GenerateBindings(currentDir, outputDir, library);
                PostBuildCleanup(outputDir);
            }

            BuildProjectFile(outputDir, library);

            File.WriteAllText(genFile, DateTime.Now.ToString());
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: darkhunterbg/xenocore2
        static void BuildProjectFile(String outputDir, XenoCoreLibrary lib)
        {
            String projectName = $"{lib.LibraryName}.NET";

            String projectFile = Path.GetFullPath(Path.Combine($@"..\..\..\src\{projectName}\{projectName}.vcxproj"));

            XNamespace msbuild   = "http://schemas.microsoft.com/developer/msbuild/2003";
            XName      ClCompile = msbuild + "ClCompile";
            XName      ClInclude = msbuild + "ClInclude";
            XName      ItemGroup = msbuild + "ItemGroup";

            XDocument xml = XDocument.Load(projectFile);

            var rootSource = (xml.FirstNode as XElement).Elements(ItemGroup).FirstOrDefault(p => p.Element(ClCompile) != null);
            var rootHeader = (xml.FirstNode as XElement).Elements(ItemGroup).FirstOrDefault(p => p.Element(ClInclude) != null);

            if (rootHeader == null)
            {
                rootHeader = new XElement(ItemGroup);
                (xml.FirstNode as XElement).Add(rootHeader);
            }
            if (rootSource == null)
            {
                rootSource = new XElement(ItemGroup);
                (xml.FirstNode as XElement).Add(rootSource);
            }

            var sourceFiles = rootSource.Elements()
                              .Select(p => p.FirstAttribute.Value)
                              .ToList();
            var headerFiles = rootHeader.Elements()
                              .Select(p => p.FirstAttribute.Value)
                              .ToList();

            var root = xml.FirstNode as XElement;

            int modifications = 0;


            var generatedFiles = Directory.GetFiles(outputDir).Where(p => p.EndsWith(".cpp") || p.EndsWith(".h"));

            foreach (var file in generatedFiles)
            {
                if (file.EndsWith(".cpp"))
                {
                    if (!sourceFiles.Contains(file))
                    {
                        var e = new XElement(ClCompile);
                        e.SetAttributeValue("Include", file);
                        rootSource.Add(e);
                        ++modifications;
                    }
                }
                if (file.EndsWith(".h"))
                {
                    if (!headerFiles.Contains(file))
                    {
                        var e = new XElement(ClInclude);
                        e.SetAttributeValue("Include", file);
                        rootHeader.Add(e);
                        ++modifications;
                    }
                }
            }

            var usedFiles = rootHeader.Elements().ToList();

            usedFiles.AddRange(rootSource.Elements());

            foreach (var file in usedFiles)
            {
                if (!generatedFiles.Contains(file.FirstAttribute.Value))
                {
                    ++modifications;
                    file.Remove();
                }
            }

            if (modifications > 0)
            {
                xml.Save(projectFile);
            }
        }