Example #1
0
        public override SolutionBuilder.BuildResult ProcessBuildResult(VariableSet variables, Configuration configuration, SolutionBuilder.BuildResult buildResult)
        {
            CopiedOutputGatherer.GatherFromProjectFiles(
                variables, configuration, buildResult
                );

            return(base.ProcessBuildResult(variables, configuration, buildResult));
        }
Example #2
0
        static void Main(string[] arguments)
        {
            SolutionBuilder.SolutionBuilder.HandleCommandLine();

            var buildGroups         = new List <BuildGroup>();
            var profiles            = new Dictionary <string, IProfile>();
            var analyzers           = new Dictionary <string, IAnalyzer>();
            var manifest            = new AssemblyManifest();
            var assemblyCache       = new AssemblyCache();
            var processedAssemblies = new HashSet <string>();

            var commandLineConfiguration = ParseCommandLine(arguments, buildGroups, profiles, analyzers, assemblyCache);

            if ((buildGroups.Count < 1) || (commandLineConfiguration == null))
            {
                Console.Error.WriteLine("// No assemblies specified to translate. Exiting.");
            }

            int totalFailureCount = 0;

            foreach (var buildGroup in buildGroups)
            {
                var config    = buildGroup.BaseConfiguration;
                var variables = buildGroup.BaseVariables;

                foreach (var filename in buildGroup.FilesToBuild)
                {
                    if (config.Assemblies.Ignored.Any(
                            (ignoreRegex) => Regex.IsMatch(filename, ignoreRegex, RegexOptions.IgnoreCase))
                        )
                    {
                        Console.Error.WriteLine("// Ignoring build result '{0}' based on configuration.", Path.GetFileName(filename));
                        continue;
                    }

                    string fileConfigPath;
                    var    fileConfigSearchDir = Path.GetDirectoryName(filename);
                    var    separators          = new char[] { '/', '\\' };

                    do
                    {
                        fileConfigPath = Path.Combine(
                            fileConfigSearchDir,
                            String.Format("{0}.jsilconfig", Path.GetFileName(filename))
                            );

                        if (!File.Exists(fileConfigPath))
                        {
                            fileConfigSearchDir = Path.GetFullPath(Path.Combine(fileConfigSearchDir, ".."));
                        }
                        else
                        {
                            break;
                        }
                    } while (fileConfigSearchDir.IndexOfAny(separators, 3) > 0);

                    var fileConfig = File.Exists(fileConfigPath)
                        ? new Configuration[] { LoadConfiguration(fileConfigPath), commandLineConfiguration }
                        : new Configuration[] { commandLineConfiguration };

                    var localConfig = MergeConfigurations(config, fileConfig);

                    var localProfile = buildGroup.Profile;
                    if (localConfig.Profile != null)
                    {
                        if (profiles.ContainsKey(localConfig.Profile))
                        {
                            localProfile = profiles[localConfig.Profile];
                        }
                        else
                        {
                            throw new Exception(String.Format(
                                                    "No profile named '{0}' was found. Did you load the correct profile assembly?", localConfig.Profile
                                                    ));
                        }
                    }

                    localConfig = localProfile.GetConfiguration(localConfig);
                    var localVariables = localConfig.ApplyTo(variables);

                    localVariables.SetAssemblyPath(filename);

                    var newProxies = (from p in localConfig.Assemblies.Proxies
                                      let newP = MapPath(p, localVariables, true, true)
                                                 where newP != null
                                                 select newP).ToArray();

                    localConfig.Assemblies.Proxies.Clear();
                    localConfig.Assemblies.Proxies.AddRange(newProxies);

                    foreach (var analyzer in analyzers.Values)
                    {
                        analyzer.SetConfiguration(localConfig);
                    }

                    using (var translator = CreateTranslator(localConfig, manifest, assemblyCache)) {
                        var ignoredMethods = new List <KeyValuePair <string, string[]> >();
                        translator.IgnoredMethod += (methodName, variableNames) =>
                                                    ignoredMethods.Add(new KeyValuePair <string, string[]>(methodName, variableNames));

                        translator.AssembliesLoaded += definitions => {
                            foreach (var analyzer in analyzers.Values)
                            {
                                analyzer.AddAssemblies(definitions);
                            }
                        };

                        translator.AnalyzeStarted += () => {
                            foreach (var analyzer in analyzers.Values)
                            {
                                analyzer.Analyze(translator._TypeInfoProvider);
                            }
                        };

                        translator.MemberCanBeSkipped += member => {
                            foreach (var analyzer in analyzers.Values)
                            {
                                if (analyzer.MemberCanBeSkipped(member))
                                {
                                    return(true);
                                }
                            }

                            return(false);
                        };

                        var outputs = buildGroup.Profile.Translate(localVariables, translator, localConfig, filename, localConfig.UseLocalProxies.GetValueOrDefault(true));
                        if (localConfig.OutputDirectory == null)
                        {
                            throw new Exception("No output directory was specified!");
                        }

                        if (buildGroup.SkippedAssemblies != null)
                        {
                            foreach (var sa in buildGroup.SkippedAssemblies)
                            {
                                if (processedAssemblies.Contains(sa))
                                {
                                    continue;
                                }

                                Console.Error.WriteLine("// Processing '{0}'", Path.GetFileName(sa));
                                processedAssemblies.Add(sa);

                                buildGroup.Profile.ProcessSkippedAssembly(
                                    localConfig, sa, outputs
                                    );
                            }
                        }

                        var outputDir = MapPath(localConfig.OutputDirectory, localVariables, false);
                        CopiedOutputGatherer.EnsureDirectoryExists(outputDir);

                        Console.Error.WriteLine("// Saving output to '{0}'.", ShortenPath(outputDir) + Path.DirectorySeparatorChar);

                        // Ensures that the log file contains the name of the profile that was actually used.
                        localConfig.Profile = localProfile.GetType().Name;

                        if (ignoredMethods.Count > 0)
                        {
                            Console.Error.WriteLine("// {0} method(s) were ignored during translation. See the log for a list.", ignoredMethods.Count);
                        }

                        EmitLog(outputDir, localConfig, filename, outputs, ignoredMethods);

                        buildGroup.Profile.WriteOutputs(localVariables, outputs, outputDir, Path.GetFileName(filename) + ".");

                        totalFailureCount += translator.Failures.Count;
                    }
                }
            }

            if (Environment.UserInteractive && Debugger.IsAttached)
            {
                Console.Error.WriteLine("// Press the any key to continue.");
                Console.ReadKey();
            }

            Environment.ExitCode = totalFailureCount;
        }