Example #1
0
        private static void CreateBuilderAndGenerate(BuildContext.BaseBuildContext buildContext, Argument parameters, bool generateDebugSolution)
        {
            using (Builder builder = CreateBuilder(buildContext, parameters, allowCleanBlobs: true, generateDebugSolution: generateDebugSolution))
            {
                if (parameters.CleanBlobsOnly)
                {
                    LogWriteLine("success:");
                    LogWriteLine("    blobs               {0,4} cleaned, {1,3} already cleaned", Project.BlobCleaned, Project.BlobAlreadyCleaned);
                }
                else if (parameters.BlobOnly)
                {
                    LogWriteLine("success:");
                    LogWriteLine("    blobs               {0,4} generated, {1,3} up-to-date", Project.BlobGenerated, Project.BlobUpdateToDate);
                }
                else
                {
                    IDictionary <Type, GenerationOutput> outputs;
                    using (Builder.Instance.CreateProfilingScope("Generate"))
                        outputs = builder.Generate();

                    foreach (var output in outputs)
                    {
                        if (output.Value.Exception != null)
                        {
                            throw new Error(output.Value.Exception, "Error encountered while generating {0}", output.Key);
                        }
                    }

                    if (!string.IsNullOrEmpty(parameters.ProfileFile))
                    {
                        builder.DumpTraceFile(parameters.ProfileFile);
                    }

                    if (parameters.DumpDependency)
                    {
                        DependencyTracker.Instance.DumpGraphs(outputs);
                    }

                    LogWriteGenerateResults(outputs);
                }
            }

            LogWriteLine("  time: {0:0.00} sec.", (DateTime.Now - s_startTime).TotalSeconds);
            LogWriteLine("  completed on {0}.", DateTime.Now);
        }
Example #2
0
        public static Builder CreateBuilder(BuildContext.BaseBuildContext context, Argument parameters, bool allowCleanBlobs, bool generateDebugSolution = false)
        {
            Builder builder = new Builder(
                context,
                parameters.Multithreaded,
                parameters.DumpDependency,
                allowCleanBlobs && parameters.CleanBlobsOnly,
                parameters.BlobOnly,
                parameters.SkipInvalidPath,
                parameters.Diagnostics,
                Program.GetGeneratorsManager,
                parameters.Defines
                );

            // Allow message log from builder.
            builder.EventOutputError   += ErrorWrite;
            builder.EventOutputWarning += WarningWrite;
            builder.EventOutputMessage += LogWrite;
            builder.EventOutputDebug   += DebugWrite;

            if (parameters.ProfileOutput)
            {
                builder.EventOutputProfile += LogWrite;
            }

            try
            {
                // Generate debug solution
                if (generateDebugSolution)
                {
                    DebugProjectGenerator.GenerateDebugSolution(parameters.Sources, builder.Arguments, parameters.DebugSolutionStartArguments);
                    builder.BuildProjectAndSolution();
                    return(builder);
                }

                // Load user input (either files or pre-built assemblies)
                switch (parameters.Input)
                {
                case Argument.InputType.File:
                    builder.ExecuteEntryPointInAssemblies <Main>(builder.LoadSharpmakeFiles(parameters.Sources));
                    break;

                case Argument.InputType.Assembly:
                    builder.ExecuteEntryPointInAssemblies <Main>(builder.LoadAssemblies(parameters.Assemblies));
                    break;

                default:
                    throw new Error("Sharpmake input missing, use /sources() or /assemblies()");
                }

                if (builder.Arguments.TypesToGenerate.Count == 0)
                {
                    throw new Error("Sharpmake has nothing to generate!" + Environment.NewLine
                                    + $"  Make sure to have a static entry point method flagged with [{typeof(Main).FullName}] attribute, and add 'arguments.Generate<[your_class]>();' in it.");
                }
                builder.Context.ConfigureOrder = builder.Arguments.ConfigureOrder;

                // Call all configuration's methods and resolve project/solution member's values
                builder.BuildProjectAndSolution();

                return(builder);
            }
            catch
            {
                builder.Dispose();
                throw;
            }
        }
Example #3
0
        public static Builder CreateBuilder(BuildContext.BaseBuildContext context, Argument parameters, bool allowCleanBlobs, bool generateDebugSolution = false)
        {
            Builder builder = new Builder(
                context,
                parameters.Multithreaded,
                parameters.DumpDependency,
                allowCleanBlobs && parameters.CleanBlobsOnly,
                parameters.BlobOnly,
                parameters.SkipInvalidPath,
                parameters.Diagnostics,
                debugScripts: true, // warning: some code that rely on callstacks misbehaves in release, because methods can completely disappear due to optimizations, so force disable for now
                getGeneratorsManagerCallBack: GetGeneratorsManager,
                defines: parameters.Defines
                );

            // Allow message log from builder.
            builder.EventOutputError   += ErrorWrite;
            builder.EventOutputWarning += WarningWrite;
            builder.EventOutputMessage += LogWrite;
            builder.EventOutputDebug   += DebugWrite;

            if (!string.IsNullOrEmpty(parameters.ProfileFile))
            {
                builder.EnableProfiling();
            }

            try
            {
                // Generate debug solution
                using (Builder.Instance.CreateProfilingScope("Debug solution"))
                {
                    if (generateDebugSolution)
                    {
                        LogWriteLine("Generate debug solution...");
                        DebugProjectGenerator.GenerateDebugSolution(parameters.Sources, builder.Arguments, parameters.DebugSolutionStartArguments, parameters.Defines.ToArray());
                        builder.BuildProjectAndSolution();
                        return(builder);
                    }
                }

                // Load user input (either files or pre-built assemblies)
                using (Builder.Instance.CreateProfilingScope("EntryPoints"))
                {
                    switch (parameters.Input)
                    {
                    case Argument.InputType.File:
                        builder.ExecuteEntryPointInAssemblies <Main>(builder.LoadSharpmakeFiles(parameters.Sources));
                        break;

                    case Argument.InputType.Assembly:
                        builder.ExecuteEntryPointInAssemblies <Main>(builder.LoadAssemblies(parameters.Assemblies));
                        break;

                    case Argument.InputType.Undefined:
                    default:
                        throw new Error("Sharpmake input missing, use /sources() or /assemblies()");
                    }
                }

                if (builder.Arguments.TypesToGenerate.Count == 0)
                {
                    throw new Error("Sharpmake has nothing to generate!" + Environment.NewLine
                                    + $"  Make sure to have a static entry point method flagged with [{typeof(Main).FullName}] attribute, and add 'arguments.Generate<[your_class]>();' in it.");
                }
                builder.Context.ConfigureOrder = builder.Arguments.ConfigureOrder;

                // Call all configuration's methods and resolve project/solution member's values
                using (Builder.Instance.CreateProfilingScope("Build"))
                    builder.BuildProjectAndSolution();

                return(builder);
            }
            catch
            {
                builder.Dispose();
                throw;
            }
        }
Example #4
0
        public static Builder CreateBuilder(BuildContext.BaseBuildContext context, Argument parameters, bool allowCleanBlobs, bool generateDebugSolution = false)
        {
            Builder builder = new Builder(
                context,
                parameters.Multithreaded,
                parameters.DumpDependency,
                allowCleanBlobs && parameters.CleanBlobsOnly,
                parameters.BlobOnly,
                parameters.SkipInvalidPath,
                parameters.Diagnostics,
                Program.GetGeneratorsManager);

            // Allow message log from builder.
            builder.EventOutputError   += ErrorWrite;
            builder.EventOutputWarning += WarningWrite;
            builder.EventOutputMessage += LogWrite;
            builder.EventOutputDebug   += DebugWrite;

            if (parameters.ProfileOutput)
            {
                builder.EventOutputProfile += LogWrite;
            }

            // generate debug solution
            if (generateDebugSolution)
            {
                DebugProjectGenerator.GenerateDebugSolution(parameters.Sources, builder.Arguments);
                builder.BuildProjectAndSolution();
                return(builder);
            }

            switch (parameters.Input)
            {
            case Argument.InputType.File:
            {
                try
                {
                    builder.LoadSharpmakeFiles(parameters.Sources);
                }
                catch (Exception)
                {
                    builder.Dispose();
                    throw;
                }
            }
            break;

            case Argument.InputType.Assembly:
            {
                try
                {
                    builder.LoadAssemblies(parameters.Assemblies);
                }
                catch (Exception)
                {
                    builder.Dispose();
                    throw;
                }
            }
            break;

            default:
                builder.Dispose();
                throw new Error("sharpmake input missing, use /sources() or /assemblies()");
            }

            return(builder);
        }