Ejemplo n.º 1
0
        private static void Open(FileInfo mymake, FileInfo mymakefile, string[] targrts)
        {
            var setting = new MyMakeFileSetting(mymakefile);

            OpenMakefile(mymake, mymakefile, setting, "x86", "Debug", targrts);
            OpenMakefile(mymake, mymakefile, setting, "x86", "Release", targrts);
            OpenMakefile(mymake, mymakefile, setting, "x64", "Debug", targrts);
            OpenMakefile(mymake, mymakefile, setting, "x64", "Release", targrts);

#if DEBUG
            Console.ReadLine();
#endif
        }
Ejemplo n.º 2
0
        private static void ExecuteMake(FileInfo makefile, MyMakeFileSetting setting, string platform, string[] targets)
        {
            var tool_chain_path = setting.ToolChains[platform];
            var start_info      = new ProcessStartInfo();

            start_info.Arguments           = string.Join(" ", new[] { "-f", makefile.Name }.Concat(targets));
            start_info.Environment["PATH"] = string.Format("{0};{1}", tool_chain_path, start_info.Environment["PATH"]);
            start_info.FileName            = "make.exe";
            start_info.UseShellExecute     = false;
            start_info.WorkingDirectory    = makefile.Directory.FullName;
            var p = Process.Start(start_info);

            p.WaitForExit();
        }
Ejemplo n.º 3
0
        private static FileInfo CreateMakefile(FileInfo mymake, FileInfo mymakefile, MyMakeFileSetting setting, string platform, string config)
        {
            var base_dir               = mymakefile.Directory;
            var target_file            = base_dir.Parent.GetDirectory("dist").GetDirectory(config).GetDirectory(platform).GetFile(setting.TargetFileName);
            var module_definition_file = base_dir.GetFile(Path.GetFileNameWithoutExtension(setting.TargetFileName) + ".def");

            if (!module_definition_file.Exists)
            {
                module_definition_file = null;
            }
            var object_dir = base_dir.GetDirectory("build").GetDirectory(string.Format("{0}_{1}", platform, config));
            var map_file   = object_dir.GetFile(Path.GetFileNameWithoutExtension(target_file.Name) + ".map");
            var makefile   = base_dir.GetDirectory("myproject").GetFile(string.Format("Makefile.{0}_{1}.mk", platform, config));

            //if (makefile.Exists && makefile.LastWriteTimeUtc >= mymakefile.LastWriteTimeUtc && makefile.LastWriteTimeUtc >= mymake.LastWriteTimeUtc)
            //    return (makefile);

            var dependencies = base_dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
                               .Where(file => new[] { ".c", ".cpp", ".rc" }.Contains(file.Extension.ToLower()))
                               .Select(file => new FileDependency(file, setting.IncludeFilePaths.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => item.Value)));

            var file_infos = dependencies
                             .Select(dep => new
            {
                source_file   = dep.SourceFile,
                include_files = dep.IncludeFiles,
                object_file   = object_dir.GetFile(Path.GetFileNameWithoutExtension(dep.SourceFile.Name) + ".o"),
                assembly_file = object_dir.GetFile(Path.GetFileNameWithoutExtension(dep.SourceFile.Name) + ".s"),
                i_file        = object_dir.GetFile(Path.GetFileNameWithoutExtension(dep.SourceFile.Name) + ".i"),
            })
                             .Where(item => setting.SourceFileFilters.All(reg => !reg.IsMatch(base_dir.GetRelativePath(item.source_file).Replace('\\', '/'))));

            if (!makefile.Directory.Exists)
            {
                makefile.Directory.Create();
            }
            using (var writer = makefile.CreateText())
            {
                writer.WriteLine(string.Format("all: {0}", makefile.Directory.GetRelativePath(target_file).Replace('\\', '/')));
                writer.WriteLine();

                writer.WriteLine("clean:");
                writer.WriteLine(string.Format("\trm -f {0}",
                                               string.Join(" ",
                                                           new[] { target_file, map_file }
                                                           .Select(file => makefile.Directory.GetRelativePath(file).Replace('\\', '/')))));
                writer.WriteLine(string.Format("\trm -r -f {0}",
                                               string.Join(" ",
                                                           file_infos.Select(file_info => file_info.object_file)
                                                           .Concat(file_infos.Select(file_info => file_info.assembly_file))
                                                           .Concat(file_infos.Select(file_info => file_info.i_file))
                                                           .Select(file => file.Directory)
                                                           .Distinct(new FileInfoComparer())
                                                           .Select(dir => makefile.Directory.GetRelativePath(dir).Replace('\\', '/')))));
                writer.WriteLine();

                if (setting.TestCommandlines.Any())
                {
                    writer.WriteLine("test:");
                    foreach (var commandline in setting.TestCommandlines)
                    {
                        writer.WriteLine(string.Format("\t{0}", commandline.Replace("{config}", config).Replace("{platform}", platform)));
                    }
                    writer.WriteLine();
                }

                var lib_dirs = setting.LibraryFilePaths.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => item.Value);

                writer.WriteLine(string.Format("OBJS = {0}", string.Join(" ",
                                                                         file_infos
                                                                         .Select(file_info => file_info.object_file)
                                                                         .Concat(setting.AdditionalLibraries.Select(lib => lib_dirs.Select(dir => dir.GetFile(lib)).Where(file => file.Exists).FirstOrDefault()).Where(file => file != null))
                                                                         .Select(file => makefile.Directory.GetRelativePath(file).Replace('\\', '/'))
                                                                         )));
                writer.WriteLine();
                writer.WriteLine(string.Format("{0}: $(OBJS) {1}",
                                               makefile.Directory.GetRelativePath(target_file).Replace('\\', '/'),
                                               module_definition_file != null ? makefile.Directory.GetRelativePath(module_definition_file).Replace('\\', '/') : ""));
                writer.WriteLine(string.Format("\tmkdir -p {0}", makefile.Directory.GetRelativePath(target_file.Directory).Replace('\\', '/')));
                writer.WriteLine(string.Format("\t{0} -o {1} $(OBJS) {2} {3} -Wl,-Map={4} {5}",
                                               setting.Linker,
                                               makefile.Directory.GetRelativePath(target_file).Replace('\\', '/'),
                                               module_definition_file != null ? makefile.Directory.GetRelativePath(module_definition_file).Replace('\\', '/') : "",
                                               string.Join(" ", setting.Ldflags.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => item.Value)),
                                               makefile.Directory.GetRelativePath(map_file).Replace('\\', '/'),
                                               string.Join(" ", lib_dirs.Select(dir => string.Format("-L{0}", dir.FullName.Replace('\\', '/'))))));
                writer.WriteLine();
                foreach (var file_info in file_infos)
                {
                    writer.WriteLine(string.Format("{0}: {1}",
                                                   makefile.Directory.GetRelativePath(file_info.object_file).Replace('\\', '/'),
                                                   string.Join("  ", new[] { file_info.source_file }.Concat(file_info.include_files).Concat(new[] { mymakefile }).Select(path => makefile.Directory.GetRelativePath(path).Replace('\\', '/')))));
                    writer.WriteLine(string.Format("\tmkdir -p {0}", makefile.Directory.GetRelativePath(file_info.object_file.Directory).Replace('\\', '/')));
                    switch (file_info.source_file.Extension.ToLower())
                    {
                    case ".c":
                        writer.WriteLine(string.Format("\tgcc -c -save-temps=obj -Werror {0} {1} -o {2} {3}",
                                                       string.Join(" ", setting.Cflags.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => item.Value)),
                                                       string.Join(" ", setting.IncludeFilePaths.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => string.Format("-I{0}", item.Value.FullName.Replace('\\', '/')))),
                                                       makefile.Directory.GetRelativePath(file_info.object_file).Replace('\\', '/'),
                                                       makefile.Directory.GetRelativePath(file_info.source_file).Replace('\\', '/')));
                        break;

                    case ".cpp":
                        writer.WriteLine(string.Format("\tg++ -c -save-temps=obj -Werror {0} {1} {2} -o {3} {4}",
                                                       string.Join(" ", setting.Cflags.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => item.Value)),
                                                       string.Join(" ", setting.Cppflags.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => item.Value)),
                                                       string.Join(" ", setting.IncludeFilePaths.Where(item => new[] { null, platform, config }.Contains(item.On)).Select(item => string.Format("-I{0}", item.Value.FullName.Replace('\\', '/')))),
                                                       makefile.Directory.GetRelativePath(file_info.object_file).Replace('\\', '/'),
                                                       makefile.Directory.GetRelativePath(file_info.source_file).Replace('\\', '/')));
                        break;

                    case ".rc":
                        writer.WriteLine(string.Format("\twindres -c 65001 -o {0} {1}",
                                                       makefile.Directory.GetRelativePath(file_info.object_file).Replace('\\', '/'),
                                                       makefile.Directory.GetRelativePath(file_info.source_file).Replace('\\', '/')));
                        break;

                    default:
                        throw new ApplicationException();
                    }
                    writer.WriteLine();
                }
            }
            return(makefile);
        }
Ejemplo n.º 4
0
        private static void OpenMakefile(FileInfo mymake, FileInfo mymakefile, MyMakeFileSetting setting, string platform, string config, string[] targets)
        {
            var makefile = CreateMakefile(mymake, mymakefile, setting, platform, config);

            ExecuteMake(makefile, setting, platform, targets);
        }