public override string CreateScript(Project project)
        {
            var projDir = Path.GetDirectoryName(project.CSProj);
            var outDir = Path.GetDirectoryName(project.OutFile);
            var copies = project.Copies.Select(x => Tuple.Create(
                Path.Combine(projDir, x),
                Path.Combine(outDir, x)));
            var allOutDirs = copies.Select(x => Path.GetDirectoryName(x.Item2)).Distinct();

            return string.Format(
                "{0}\r\n\r\ncall mcs {1} -unsafe {2} -out:{3} -d:DEBUG -d:TRACE\r\n\r\n{4}\r\n\r\n{5}",
                CreateMkDirs(new[] { outDir }),
                CreateCompileArgs(project),
                CreateRefArg(project),
                project.OutFile,
                CreateMkDirs(allOutDirs),
                CreateCopies(copies));
        }
 public abstract string CreateScript(Project project);
        static void Main(string[] args)
        {
            var projects = args[0]
                .Split(',')
                .Select(LoadProject)
                .ToArray();

            var outFile = args[1];
            var script = args[2];
            var mainProject = projects.First();
            var asmInfo = @"\assemblyinfo.cs";

            var assemblyInfo = mainProject.Compile
                .FirstOrDefault(x => x.ToLower().EndsWith(asmInfo));

            var mergedReference = projects.SelectMany(x => x.Reference).Distinct();
            var mergedCompile = projects
                .SelectMany(x => x.Compile)
                .Where(x => !x.ToLower().EndsWith(asmInfo) || x == assemblyInfo)
                .Distinct();
            var mergedCopies = projects.SelectMany(x => x.Copies).Distinct();

            var mergedProject = new Project(
                mainProject.CSProj,
                mergedReference,
                mergedCompile,
                outFile,
                new [] { "MONO", "DEBUG", "TRACE" },
                mergedCopies);

            var generator = new WindowsBuildScriptGenerator();
            var cmd = generator.CreateScript(mergedProject);

            File.WriteAllText(script, cmd);
        }
 static string CreateRefArg(Project project)
 {
     return string.Join(" ", project.Reference.Select(x => "-r:" + x));
 }
 static string CreateCompileArgs(Project project)
 {
     return string.Join(" ", project.Compile.Select(x => "\"" + x + "\""));
 }