public override void Generate(MetabuildProject metabuild) { generatePath = metabuild.MakeGeneratePath(".VisualStudio2008"); Console.WriteLine("[DEBUG] generatePath '{0}'", generatePath); if (!Directory.Exists(generatePath)) { Directory.CreateDirectory(generatePath); } Boolean generateForWince = false; for (;;) { ProjectGenerator generator = new ProjectGenerator(this, generateForWince); foreach (MetabuildUnit unit in metabuild.units) { unit.Visit(generator); } GenerateSolution(metabuild, generateForWince); if (generateForWince || !Options.Instance.wince.set) { break; } generateForWince = true; } }
// Assumption: filename already exists and is already verified to be a file public static void LoadFile(MetabuildProject metabuild, String filename) { Console.WriteLine("[DEBUG] Metabuild.LoadFile \"{0}\"", filename); String relativeDir = null; using (LfdTextReader reader = new LfdTextReader(new StreamReader(new FileStream( filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))) { LfdParser parser = new LfdParser(reader, filename); LfdLine line = parser.reader.ReadLineIgnoreComments(); for (; ;) { if (line == null) { return; } if (line.id == "Import") { parser.errors.EnforceFieldCount(line, 1); MetabuildUnit.LoadDirOrFile(metabuild, line.fields[0]); line = parser.reader.ReadLineIgnoreComments(); } else if (line.id == "CSharpProject") { if (relativeDir == null) { relativeDir = Path.GetDirectoryName(filename); } line = CSharpProject.Parse(metabuild, parser, line, false, relativeDir); } else if (line.id == "CSharpTestProject") { if (relativeDir == null) { relativeDir = Path.GetDirectoryName(filename); } line = CSharpProject.Parse(metabuild, parser, line, true, relativeDir); } else if (line.id == "GeneratePathPrefix") { parser.errors.EnforceFieldCount(line, 1); if (metabuild.generatePathPrefix != null) { throw parser.errors.Error(line, "GeneratePathPrefix was set more than once"); } metabuild.generatePathPrefix = line.fields[0]; line = parser.reader.ReadLineIgnoreComments(); } else { throw parser.errors.Error(line, "unknown directive '{0}'", line.id); } } } }
public Boolean Resolve(MetabuildProject metabuild) { foreach (MetabuildUnit unit in metabuild.units) { CSharpProject unitAsCSharpProject = unit as CSharpProject; if (unitAsCSharpProject != null && unitAsCSharpProject.Name == referenceName) { if (project.projectReferenceList.Contains(unitAsCSharpProject)) { errors.PrintError(line, "project {0} was referenced multiple times", referenceName); return(false); // fail } project.projectReferenceList.Add(unitAsCSharpProject); return(true); // success } } errors.PrintError(line, "unknown project reference {0}", referenceName); return(false); // fail }
static int Generate(List <String> args) { if (args.Count <= 1) { Console.WriteLine("Error: the 'generate' command requires a generator and one or more project files"); return(1); } String generatorName = args[0]; Generator generator = Generator.TryGet(generatorName); if (generator == null) { Console.WriteLine("Error: uknown generator '{0}'", generatorName); return(1); } args.RemoveAt(0); int failedProjects = 0; foreach (String metabuildFile in args) { MetabuildProject metabuild; try { metabuild = MetabuildProject.Load(metabuildFile); } catch (ProjectLoadException e) { Console.WriteLine(e.Message); failedProjects++; continue; } generator.Generate(metabuild); } if (failedProjects > 0) { Console.WriteLine(); Console.WriteLine("Error: failed to generated {0} project(s) out of {1}", failedProjects, args.Count); } return(failedProjects); }
private static void LoadDirOrFile(MetabuildProject metabuild, String dirOrFile) { FileAttributes attributes = MetabuildProject.GetProjectFileAttributes(dirOrFile); if (attributes.IsDirectory()) { UInt32 metabuildFileCount = 0; foreach (string file in Directory.GetFiles(dirOrFile, "*.metabuild")) { metabuildFileCount++; LoadFile(metabuild, file); } if (metabuildFileCount == 0) { throw new ProjectLoadException(String.Format("directory '{0}' does not contain any .metabuild files", dirOrFile)); } } else { LoadFile(metabuild, dirOrFile); } }
void GenerateSolution(MetabuildProject metabuild, Boolean wince) { String solutionFile = Path.Combine(generatePath, Path.GetFileNameWithoutExtension(metabuild.projectFile) + (wince ? ".CE.sln" : ".sln")); using (TextWriter writer = new StreamWriter(File.Open(solutionFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite), Encoding.UTF8)) { writer.WriteLine(); writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 10.00"); writer.WriteLine("# Visual Studio 2008"); { SolutionProjectGenerator generator = new SolutionProjectGenerator(writer, wince); foreach (MetabuildUnit unit in metabuild.units) { unit.Visit(generator); } } writer.WriteLine("Global"); writer.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); writer.WriteLine("\t\tDebug|Any CPU = Debug|Any CPU"); writer.WriteLine("\t\tRelease|Any CPU = Release|Any CPU"); writer.WriteLine("\tEndGlobalSection"); writer.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); { SolutionProjectConfigGenerator generator = new SolutionProjectConfigGenerator(writer, wince); foreach (MetabuildUnit unit in metabuild.units) { unit.Visit(generator); } } writer.WriteLine("\tEndGlobalSection"); writer.WriteLine("\tGlobalSection(SolutionProperties) = preSolution"); writer.WriteLine("\t\tHideSolutionNode = FALSE"); writer.WriteLine("\tEndGlobalSection"); writer.WriteLine("EndGlobal"); } }
public abstract void Generate(MetabuildProject metabuild);
public static LfdLine Parse(MetabuildProject metabuild, LfdParser parser, LfdLine projectLine, Boolean isTestProject, String relativePath) { parser.errors.EnforceFieldCount(projectLine, 1); CSharpProject project = new CSharpProject(relativePath, projectLine.fields[0], isTestProject); bool setOutputType = false; LfdLine line; for (; ;) { line = parser.reader.ReadLineIgnoreComments(); if (line == null) { break; } if (line.id == "ProjectGuid") { parser.errors.EnforceFieldCount(line, 1); if (project.projectGuid != default(Guid)) { throw parser.errors.Error(line, "ProjectGuid was set more than once"); } project.projectGuid = new Guid(line.fields[0]); } else if (line.id == "OutputType") { parser.errors.EnforceFieldCount(line, 1); if (setOutputType) { throw parser.errors.Error(line, "OutputType was set more than once"); } setOutputType = true; project.outputType = (OutputType)Enum.Parse(typeof(OutputType), line.fields[0], false); } else if (line.id == "AssemblyName") { parser.errors.EnforceFieldCount(line, 1); if (project.assemblyName != null) { throw parser.errors.Error(line, "AssemblyName was set more than once"); } project.assemblyName = line.fields[0]; } else if (line.id == "AllowUnsafeBlocks") { parser.errors.EnforceFieldCount(line, 0); if (project.allowUnsafeBlocks) { throw parser.errors.Error(line, "AllowUnsafeBlocks was set more than once"); } project.allowUnsafeBlocks = true; } else if (line.id == "Reference") { parser.errors.EnforceFieldCount(line, 1); project.referenceList.Add(line.fields[0]); } else if (line.id == "ProjectReference") { metabuild.AddUnresolvedReference(new UnresolvedCSharpProjectReference(project, parser.errors, line)); } else if (line.id == "Source") { parser.errors.EnforceFieldCount(line, 1); project.sourceList.Add(line.fields[0]); } else { break; } } // // Verify the project is valid // if (!setOutputType) { throw parser.errors.ErrorNoLine("Missing the 'OutputType' property"); } if (project.assemblyName == null) { project.assemblyName = project.name; } if (project.projectGuid == default(Guid)) { project.projectGuid = Guid.NewGuid(); } metabuild.units.Add(project); return(line); }