Exemplo n.º 1
0
        /// <summary>
        /// Execute commands specified in the command line.
        /// </summary>
        /// <param name="CommandsToExecute"></param>
        /// <param name="Commands"></param>
        private static void Execute(List <CommandInfo> CommandsToExecute, CaselessDictionary <Type> Commands)
        {
            for (int CommandIndex = 0; CommandIndex < CommandsToExecute.Count; ++CommandIndex)
            {
                var CommandInfo = CommandsToExecute[CommandIndex];
                Log.TraceVerbose("Attempting to execute {0}", CommandInfo.ToString());
                Type CommandType;
                if (!Commands.TryGetValue(CommandInfo.CommandName, out CommandType))
                {
                    throw new AutomationException("Failed to find command {0}", CommandInfo.CommandName);
                }
                else
                {
                    BuildCommand Command = (BuildCommand)Activator.CreateInstance(CommandType);
                    Command.Params = CommandInfo.Arguments.ToArray();
                    Command.Execute();
                    // dispose of the class if necessary
                    {
                        var CommandDisposable = Command as IDisposable;
                        if (CommandDisposable != null)
                        {
                            CommandDisposable.Dispose();
                        }
                    }

                    // Make sure there's no directories on the stack.
                    CommandUtils.ClearDirStack();
                }
            }

            Log.TraceInformation("Script execution successful, exiting.");
        }
Exemplo n.º 2
0
        /// <summary>
        /// Finds and/or compiles all script files and assemblies.
        /// </summary>
        /// <param name="ScriptsForProjectFileName">Path to the current project. May be null, in which case we compile scripts for all projects.</param>
        /// <param name="AdditionalScriptsFolders">Additional script fodlers to look for source files in.</param>
        public void FindAndCompileAllScripts(string ScriptsForProjectFileName, List <string> AdditionalScriptsFolders)
        {
            bool DoCompile = false;

            if (GlobalCommandLine.Compile)
            {
                DoCompile = true;
            }

            // Change to Engine\Source (if exists) to properly discover all UBT classes
            var OldCWD             = Environment.CurrentDirectory;
            var UnrealBuildToolCWD = CommandUtils.CombinePaths(CommandUtils.CmdEnv.LocalRoot, "Engine", "Source");

            if (Directory.Exists(UnrealBuildToolCWD))
            {
                Environment.CurrentDirectory = UnrealBuildToolCWD;
            }
            // Register all the classes inside UBT
            Log.TraceVerbose("Registering UBT Classes.");
            UnrealBuildTool.UnrealBuildTool.RegisterAllUBTClasses();
            Environment.CurrentDirectory = OldCWD;

            // Compile only if not disallowed.
            if (DoCompile && !String.IsNullOrEmpty(CommandUtils.CmdEnv.MsBuildExe))
            {
                CleanupScriptsAssemblies();
                FindAndCompileScriptModules(ScriptsForProjectFileName, AdditionalScriptsFolders);
            }

            var ScriptAssemblies = new List <Assembly>();

            LoadPreCompiledScriptAssemblies(ScriptAssemblies);

            // Setup platforms
            Platform.InitializePlatforms(ScriptAssemblies.ToArray());

            // Instantiate all the automation classes for interrogation
            Log.TraceVerbose("Creating commands.");
            ScriptCommands = new CaselessDictionary <Type>();
            foreach (var CompiledScripts in ScriptAssemblies)
            {
                foreach (var ClassType in CompiledScripts.GetTypes())
                {
                    if (ClassType.IsSubclassOf(typeof(BuildCommand)) && ClassType.IsAbstract == false)
                    {
                        if (ScriptCommands.ContainsKey(ClassType.Name) == false)
                        {
                            ScriptCommands.Add(ClassType.Name, ClassType);
                        }
                        else
                        {
                            Log.TraceWarning("Unable to add command {0} twice. Previous: {1}, Current: {2}", ClassType.Name,
                                             ClassType.AssemblyQualifiedName, ScriptCommands[ClassType.Name].AssemblyQualifiedName);
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// List all available commands.
        /// </summary>
        /// <param name="Commands">All vailable commands.</param>
        private static void ListAvailableCommands(CaselessDictionary <Type> Commands)
        {
            string Message = Environment.NewLine;

            Message += "Available commands:" + Environment.NewLine;
            foreach (var AvailableCommand in Commands)
            {
                Message += String.Format("  {0}{1}", AvailableCommand.Key, Environment.NewLine);
            }
            CommandUtils.Log(Message);
        }
Exemplo n.º 4
0
 /// <summary>
 /// Display help for the specified commands (to execute)
 /// </summary>
 /// <param name="CommandsToExecute">List of commands specified in the command line.</param>
 /// <param name="Commands">All discovered command objects.</param>
 private static void DisplayHelp(List <CommandInfo> CommandsToExecute, CaselessDictionary <Type> Commands)
 {
     for (int CommandIndex = 0; CommandIndex < CommandsToExecute.Count; ++CommandIndex)
     {
         var  CommandInfo = CommandsToExecute[CommandIndex];
         Type CommandType;
         if (Commands.TryGetValue(CommandInfo.CommandName, out CommandType) == false)
         {
             Log.TraceError("Help: Failed to find command {0}", CommandInfo.CommandName);
         }
         else
         {
             CommandUtils.Help(CommandType);
         }
     }
 }
Exemplo n.º 5
0
        /// <summary>
        /// Execute commands specified in the command line.
        /// </summary>
        /// <param name="CommandsToExecute"></param>
        /// <param name="Commands"></param>
        private static ExitCode Execute(List <CommandInfo> CommandsToExecute, CaselessDictionary <Type> Commands)
        {
            for (int CommandIndex = 0; CommandIndex < CommandsToExecute.Count; ++CommandIndex)
            {
                var CommandInfo = CommandsToExecute[CommandIndex];
                Log.TraceVerbose("Attempting to execute {0}", CommandInfo.ToString());
                Type CommandType;
                if (!Commands.TryGetValue(CommandInfo.CommandName, out CommandType))
                {
                    throw new AutomationException("Failed to find command {0}", CommandInfo.CommandName);
                }

                BuildCommand Command = (BuildCommand)Activator.CreateInstance(CommandType);
                Command.Params = CommandInfo.Arguments.ToArray();
                try
                {
                    ExitCode Result = Command.Execute();
                    if (Result != ExitCode.Success)
                    {
                        return(Result);
                    }
                    CommandUtils.Log("BUILD SUCCESSFUL");
                }
                finally
                {
                    // dispose of the class if necessary
                    var CommandDisposable = Command as IDisposable;
                    if (CommandDisposable != null)
                    {
                        CommandDisposable.Dispose();
                    }
                }

                // Make sure there's no directories on the stack.
                CommandUtils.ClearDirStack();
            }
            return(ExitCode.Success);
        }