コード例 #1
0
    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;
        }
    }
コード例 #2
0
    // 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);
                }
            }
        }
    }
コード例 #3
0
 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
 }
コード例 #4
0
    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);
    }
コード例 #5
0
    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);
        }
    }
コード例 #6
0
    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");
        }
    }
コード例 #7
0
 public abstract void Generate(MetabuildProject metabuild);
コード例 #8
0
    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);
    }