From ba2e79f8f99d35fb91767bc50e569e7ef03966bd Mon Sep 17 00:00:00 2001 From: jklawreszuk Date: Wed, 3 Apr 2024 15:03:26 +0200 Subject: [PATCH] Remove buildengine --- .../AndroidAdbUtilities.cs | 171 ----------- .../AndroidDeployAssetTask.cs | 39 --- .../BuildEngineCommands.cs | 287 ------------------ .../Stride.Core.BuildEngine/BuilderOptions.cs | 80 ----- .../Stride.Core.BuildEngine/PluginManager.cs | 91 ------ .../Stride.Core.BuildEngine/Program.cs | 159 ---------- .../Properties/AssemblyInfo.cs | 46 --- .../RemoteCommandContext.cs | 43 --- .../Stride.Core.BuildEngine.csproj | 29 -- .../Stride.Core.BuildEngine/TestSession.cs | 120 -------- 10 files changed, 1065 deletions(-) delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/AndroidAdbUtilities.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/AndroidDeployAssetTask.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/BuildEngineCommands.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/BuilderOptions.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/PluginManager.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/Program.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/Properties/AssemblyInfo.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/RemoteCommandContext.cs delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/Stride.Core.BuildEngine.csproj delete mode 100644 sources/buildengine/Stride.Core.BuildEngine/TestSession.cs diff --git a/sources/buildengine/Stride.Core.BuildEngine/AndroidAdbUtilities.cs b/sources/buildengine/Stride.Core.BuildEngine/AndroidAdbUtilities.cs deleted file mode 100644 index 135b74698e..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/AndroidAdbUtilities.cs +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using Stride.Framework.Diagnostics; -using Stride.Framework.Serialization; - -namespace Stride.BuildEngine -{ - public static class AndroidAdbUtilities - { - private static readonly string AdbExecutable = FindAdbExecutable(); - - public static string GetExternalStoragePath(string device) - { - var sdcardPath = RunAdb(device, "shell \"echo $EXTERNAL_STORAGE\""); - return sdcardPath[0]; - } - - public static string[] GetDevices() - { - var devices = RunAdb(null, "devices"); - - // Skip first line "List of devices attached", - // and then take first part of string (device id). - return devices.Skip(1).Select(x => x.Split(' ', '\t').First()).ToArray(); - } - - /// - /// Synchronizes files to an android device. - /// - /// The logger. - /// The device. - /// The file mapping (relative target path, source HDD filename). - /// The android path. - /// The cache file. - public static void Synchronize(Logger logger, string device, Dictionary fileMapping, string androidPath, string cacheFile) - { - // Ensure android path ends up with directory separator - if (!androidPath.EndsWith("/")) - androidPath = androidPath + "/"; - - // Search files - var currentVersions = fileMapping - .ToDictionary(x => x.Key, x => new FileVersion(x.Value)); - - // Try to read previous cache file - var previousVersions = new Dictionary(); - try - { - using (var file = File.OpenRead(cacheFile)) - { - var binaryReader = new BinarySerializationReader(file); - binaryReader.Serialize(ref previousVersions, ArchiveMode.Deserialize); - } - } - catch (IOException) - { - } - - var filesToRemove = new List(); - var filesToUpload = new List(); - - // Remove unecessary files (in previousVersions but not in currentVersions) - foreach (var file in previousVersions.Where(x => !currentVersions.ContainsKey(x.Key))) - { - filesToRemove.Add(file.Key); - } - - // Upload files that are either not uploaded yet, or not up to date - foreach (var file in currentVersions) - { - FileVersion fileVersion; - if (!previousVersions.TryGetValue(file.Key, out fileVersion) - || fileVersion.FileSize != file.Value.FileSize - || fileVersion.LastModifiedDate != file.Value.LastModifiedDate) - { - filesToUpload.Add(file.Key); - } - } - - // Upload files - foreach (var file in filesToUpload) - { - if (logger != null) - logger.Verbose("Copying file {0}", file); - RunAdb(device, string.Format("push \"{0}\" \"{1}\"", fileMapping[file], androidPath + file.Replace('\\', '/'))); - } - - // Remove files - foreach (var file in filesToRemove) - { - if (logger != null) - logger.Verbose("Deleting file {0}", file); - RunAdb(device, string.Format("shell \"rm {0}\"", androidPath + file.Replace('\\', '/'))); - } - - // Write new cache file - using (var file = File.Create(cacheFile)) - { - var binaryWriter = new BinarySerializationWriter(file); - binaryWriter.Write(currentVersions); - } - } - - private static string FindAdbExecutable() - { - var androidSdkDir = Environment.GetEnvironmentVariable("ANDROID_SDK"); - var androidAdbExecutable = androidSdkDir != null ? androidSdkDir + @"\platform-tools\adb" : "adb"; - - return androidAdbExecutable; - } - - private static string[] RunAdb(string device, string arguments) - { - // Add device to argument list if necessary - if (device != null) - arguments = "-s " + device + ' ' + arguments; - - var processStartInfo = new ProcessStartInfo() - { - FileName = AdbExecutable, - Arguments = arguments, - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardOutput = true, - }; - - var lines = new List(); - - var adbProcess = Process.Start(processStartInfo); - adbProcess.OutputDataReceived += (sender, args) => - { - if (!string.IsNullOrEmpty(args.Data)) - { - lock (adbProcess) - { - lines.Add(args.Data); - } - } - }; - adbProcess.BeginOutputReadLine(); - adbProcess.WaitForExit(); - - return lines.ToArray(); - } - - [Serializable] - public struct FileVersion - { - public DateTime LastModifiedDate; - public long FileSize; - - public FileVersion(string fileName) - { - LastModifiedDate = DateTime.MinValue; - FileSize = -1; - - if (File.Exists(fileName)) - { - var fileInfo = new FileInfo(fileName); - LastModifiedDate = fileInfo.LastWriteTime; - FileSize = fileInfo.Length; - } - } - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/AndroidDeployAssetTask.cs b/sources/buildengine/Stride.Core.BuildEngine/AndroidDeployAssetTask.cs deleted file mode 100644 index e03dff8d17..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/AndroidDeployAssetTask.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using Microsoft.Build.Framework; -using Stride.Framework.Build.Storage; -using Stride.Framework.Diagnostics; - -namespace Stride.BuildTool -{ - public class AndroidDeployAssetTask : Microsoft.Build.Utilities.Task - { - public ITaskItem[] Files { get; set; } - - public string DeploymentPath { get; set; } - - public override bool Execute() - { - var logger = Logger.GetLogger("AndroidDeployAssetTask"); - - var fileMapping = new Dictionary(); - for (int i = 0; i < Files.Length; ++i) - { - fileMapping[Files[i].GetMetadata("TargetPath")] = Files[i].ItemSpec; - } - - var device = AndroidAdbUtilities.GetDevices().First(); - var externalStoragePath = AndroidAdbUtilities.GetExternalStoragePath(device); - AndroidAdbUtilities.Synchronize(logger, device, fileMapping, externalStoragePath + "/" + DeploymentPath, "android-cache-" + device + ".tmp"); - - return true; - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/BuildEngineCommands.cs b/sources/buildengine/Stride.Core.BuildEngine/BuildEngineCommands.cs deleted file mode 100644 index 592fcb0bbc..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/BuildEngineCommands.cs +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.ServiceModel; - -using Mono.Options; -using Stride.Core.Storage; -using Stride.Core.Diagnostics; -using Stride.Core.IO; -using Stride.Core.MicroThreading; -using Stride.Core.Serialization; -using Stride.Core.Serialization.Assets; -using Stride.Core.Serialization.Contents; -using System.Threading; - -namespace Stride.Core.BuildEngine -{ - public static class BuildEngineCommands - { - public static BuildResultCode Build(BuilderOptions options) - { - BuildResultCode result; - - if (options.IsValidForSlave()) - { - // Sleeps one second so that debugger can attach - //Thread.Sleep(1000); - - result = BuildSlave(options); - } - else if (options.IsValidForMaster()) - { - result = BuildLocal(options); - - if (!string.IsNullOrWhiteSpace(options.OutputDirectory) && options.BuilderMode == Builder.Mode.Build) - { - CopyBuildToOutput(options); - } - } - else - { - throw new OptionException("Insufficient parameters, no action taken", "build-path"); - } - - return result; - } - - private static void PrepareDatabases(BuilderOptions options) - { - AssetManager.GetDatabaseFileProvider = () => IndexFileCommand.DatabaseFileProvider.Value; - } - - public static BuildResultCode BuildLocal(BuilderOptions options) - { - string inputFile = options.InputFiles[0]; - string sdkDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../.."); - - BuildScript buildScript = BuildScript.LoadFromFile(sdkDir, inputFile); - buildScript.Compile(options.Plugins); - - if (buildScript.GetWarnings().FirstOrDefault() != null) - { - foreach (string warning in buildScript.GetWarnings()) - { - options.Logger.Warning(warning); - } - } - - if (buildScript.HasErrors) - { - foreach (string error in buildScript.GetErrors()) - { - options.Logger.Error(error); - } - throw new InvalidOperationException("Can't compile the provided build script."); - } - - string inputDir = Path.GetDirectoryName(inputFile) ?? Environment.CurrentDirectory; - options.SourceBaseDirectory = options.SourceBaseDirectory ?? Path.Combine(inputDir, buildScript.SourceBaseDirectory ?? ""); - options.BuildDirectory = options.BuildDirectory ?? Path.Combine(inputDir, buildScript.BuildDirectory ?? ""); - options.OutputDirectory = options.OutputDirectory ?? (buildScript.OutputDirectory != null ? Path.Combine(inputDir, buildScript.OutputDirectory) : ""); - options.MetadataDatabaseDirectory = options.MetadataDatabaseDirectory ?? (buildScript.MetadataDatabaseDirectory != null ? Path.Combine(inputDir, buildScript.MetadataDatabaseDirectory) : ""); - if (!string.IsNullOrWhiteSpace(options.SourceBaseDirectory)) - { - if (!Directory.Exists(options.SourceBaseDirectory)) - { - string error = string.Format("Source base directory \"{0}\" does not exists.", options.SourceBaseDirectory); - options.Logger.Error(error); - throw new OptionException(error, "sourcebase"); - } - Environment.CurrentDirectory = options.SourceBaseDirectory; - } - - if (string.IsNullOrWhiteSpace(options.BuildDirectory)) - { - throw new OptionException("This tool requires a build path.", "build-path"); - } - - // Mount build path - ((FileSystemProvider)VirtualFileSystem.ApplicationData).ChangeBasePath(options.BuildDirectory); - - options.ValidateOptionsForMaster(); - - // assets is always added by default - //options.Databases.Add(new DatabaseMountInfo("/assets")); - PrepareDatabases(options); - - try - { - VirtualFileSystem.CreateDirectory("/data/"); - VirtualFileSystem.CreateDirectory("/data/db/"); - } - catch (Exception) - { - throw new OptionException("Invalid Build database path", "database"); - } - - // Create builder - LogMessageType logLevel = options.Debug ? LogMessageType.Debug : (options.Verbose ? LogMessageType.Verbose : LogMessageType.Info); - var logger = Logger.GetLogger("builder"); - logger.ActivateLog(logLevel); - var builder = new Builder("builder", options.BuildDirectory, options.BuilderMode, logger) { ThreadCount = options.ThreadCount }; - builder.MonitorPipeNames.AddRange(options.MonitorPipeNames); - builder.ActivateConfiguration(options.Configuration); - foreach (var sourceFolder in buildScript.SourceFolders) - { - builder.InitialVariables.Add(("SourceFolder:" + sourceFolder.Key).ToUpperInvariant(), sourceFolder.Value); - } - Console.CancelKeyPress += (sender, e) => Cancel(builder, e); - - buildScript.Execute(builder); - - // Run builder - return builder.Run(options.Append == false); - } - - private static void RegisterRemoteLogger(IProcessBuilderRemote processBuilderRemote) - { - // The pipe might be broken while we try to output log, so let's try/catch the call to prevent program for crashing here (it should crash at a proper location anyway if the pipe is broken/closed) - // ReSharper disable EmptyGeneralCatchClause - GlobalLogger.MessageLogged += msg => { try { processBuilderRemote.ForwardLog(msg); } catch { } }; - // ReSharper restore EmptyGeneralCatchClause - } - - public static BuildResultCode BuildSlave(BuilderOptions options) - { - // Mount build path - ((FileSystemProvider)VirtualFileSystem.ApplicationData).ChangeBasePath(options.BuildDirectory); - - PrepareDatabases(options); - - try - { - VirtualFileSystem.CreateDirectory("/data/"); - VirtualFileSystem.CreateDirectory("/data/db/"); - } - catch (Exception) - { - throw new OptionException("Invalid Build database path", "database"); - } - - // Open WCF channel with master builder - var namedPipeBinding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) { SendTimeout = TimeSpan.FromSeconds(300.0) }; - var processBuilderRemote = ChannelFactory.CreateChannel(namedPipeBinding, new EndpointAddress(options.SlavePipe)); - - try - { - RegisterRemoteLogger(processBuilderRemote); - - // Create scheduler - var scheduler = new Scheduler(); - - var status = ResultStatus.NotProcessed; - - // Schedule command - string buildPath = options.BuildDirectory; - Logger logger = options.Logger; - MicroThread microthread = scheduler.Add(async () => - { - // Deserialize command and parameters - Command command = processBuilderRemote.GetCommandToExecute(); - BuildParameterCollection parameters = processBuilderRemote.GetBuildParameters(); - - // Run command - var inputHashes = new DictionaryStore(VirtualFileSystem.OpenStream("/data/db/InputHashes", VirtualFileMode.OpenOrCreate, VirtualFileAccess.ReadWrite, VirtualFileShare.ReadWrite)); - var builderContext = new BuilderContext(buildPath, inputHashes, parameters, 0, null); - - var commandContext = new RemoteCommandContext(processBuilderRemote, command, builderContext, logger); - command.PreCommand(commandContext); - status = await command.DoCommand(commandContext); - command.PostCommand(commandContext, status); - - // Returns result to master builder - processBuilderRemote.RegisterResult(commandContext.ResultEntry); - }); - - while (true) - { - scheduler.Run(); - - // Exit loop if no more micro threads - lock (scheduler.MicroThreads) - { - if (!scheduler.MicroThreads.Any()) - break; - } - - Thread.Sleep(0); - } - - // Rethrow any exception that happened in microthread - if (microthread.Exception != null) - { - options.Logger.Fatal(microthread.Exception.ToString()); - return BuildResultCode.BuildError; - } - - if (status == ResultStatus.Successful || status == ResultStatus.NotTriggeredWasSuccessful) - return BuildResultCode.Successful; - - return BuildResultCode.BuildError; - } - finally - { - // Close WCF channel - // ReSharper disable SuspiciousTypeConversion.Global - ((IClientChannel)processBuilderRemote).Close(); - // ReSharper restore SuspiciousTypeConversion.Global - } - } - - public static void CopyBuildToOutput(BuilderOptions options) - { - throw new InvalidOperationException(); - } - - private static void Collect(HashSet objectIds, ObjectId objectId, IAssetIndexMap assetIndexMap) - { - // Already added? - if (!objectIds.Add(objectId)) - return; - - using (var stream = AssetManager.FileProvider.OpenStream(DatabaseFileProvider.ObjectIdUrl + objectId, VirtualFileMode.Open, VirtualFileAccess.Read)) - { - // Read chunk header - var streamReader = new BinarySerializationReader(stream); - var header = ChunkHeader.Read(streamReader); - - // Only process chunks - if (header != null) - { - if (header.OffsetToReferences != -1) - { - // Seek to where references are stored and deserialize them - streamReader.NativeStream.Seek(header.OffsetToReferences, SeekOrigin.Begin); - - List references = null; - streamReader.Serialize(ref references, ArchiveMode.Deserialize); - - foreach (var reference in references) - { - ObjectId refObjectId; - var databaseFileProvider = DatabaseFileProvider.ResolveObjectId(reference.Location, out refObjectId); - if (databaseFileProvider != null) - { - Collect(objectIds, refObjectId, databaseFileProvider.AssetIndexMap); - } - } - } - } - } - } - - public static void Cancel(Builder builder, ConsoleCancelEventArgs e) - { - if (builder != null && builder.IsRunning) - { - e.Cancel = true; - builder.CancelBuild(); - } - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/BuilderOptions.cs b/sources/buildengine/Stride.Core.BuildEngine/BuilderOptions.cs deleted file mode 100644 index e666254fa0..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/BuilderOptions.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System; -using System.Collections.Generic; -using System.IO; - -using Mono.Options; -using Stride.Core.Diagnostics; - -namespace Stride.Core.BuildEngine -{ - public class BuilderOptions - { - public readonly PluginResolver Plugins; - public readonly Logger Logger; - - public bool Verbose = false; - public bool Debug = false; - // This should not be a list - public List InputFiles = new List(); - public Builder.Mode BuilderMode; - public string BuildDirectory; - public List MonitorPipeNames = new List(); - public string OutputDirectory; - public string Configuration; - public bool EnableFileLogging; - public bool Append; - public string CustomLogFileName; - public string SourceBaseDirectory; - public string MetadataDatabaseDirectory; - public string SlavePipe; - - public int ThreadCount = Environment.ProcessorCount; - - public string TestName; - - public BuilderOptions(Logger logger) - { - Logger = logger; - Plugins = new PluginResolver(logger); - BuilderMode = Builder.Mode.Build; - } - - /// - /// This function indicate if the current builder options mean to execute a master session - /// - /// true if the options mean to execute a master session - public bool IsValidForMaster() - { - return InputFiles.Count == 1; - } - - /// - /// This function indicate if the current builder options mean to execute a slave session - /// - /// true if the options mean to execute a slave session - public bool IsValidForSlave() - { - return !string.IsNullOrEmpty(SlavePipe) && !string.IsNullOrEmpty(BuildDirectory); - } - - /// - /// Ensure every parameter is correct for a master execution. Throw an OptionException if a parameter is wrong - /// - /// This tool requires one input file.;filename - /// or - /// The given working directory \ + workingDir + \ does not exist.;workingdir - public void ValidateOptionsForMaster() - { - if (InputFiles.Count != 1) - throw new OptionException("This tool requires one input file.", "filename"); - - if (SourceBaseDirectory != null) - { - if (!Directory.Exists(SourceBaseDirectory)) - throw new OptionException("The given working directory does not exist.", "workingdir"); - } - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/PluginManager.cs b/sources/buildengine/Stride.Core.BuildEngine/PluginManager.cs deleted file mode 100644 index 203f453005..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/PluginManager.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using Stride.Core.Diagnostics; - -namespace Stride.Core.BuildEngine -{ - public class PluginManager - { - public IEnumerable PluginAssemblyLocations { get { return pluginAssemblyLocations; } } - - private readonly List pluginAssemblyLocations = new List(); - - private readonly Logger logger; - - public PluginManager(Logger logger = null) - { - this.logger = logger; - } - - public void Register() - { - AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadAssembly(new AssemblyName(e.Name)); - } - - public Assembly LoadAssembly(AssemblyName assemblyName) - { - return LoadAssembly(assemblyName.Name); - } - - public Assembly LoadAssembly(string assemblyName) - { - foreach (string pluginLocation in pluginAssemblyLocations) - { - if (pluginLocation != assemblyName) - { - string fileName = Path.GetFileNameWithoutExtension(pluginLocation); - if (fileName != assemblyName) - continue; - } - - if (logger != null) - logger.Debug("Loading plugin: {0}", pluginLocation); - return Assembly.LoadFrom(pluginLocation); - } - return null; - } - - public string FindAssembly(string assemblyFileName) - { - foreach (string pluginLocation in pluginAssemblyLocations) - { - if (pluginLocation != assemblyFileName) - { - string fileName = Path.GetFileName(pluginLocation); - if (fileName != assemblyFileName) - continue; - } - - if (logger != null) - logger.Debug("Loading plugin: {0}", pluginLocation); - return pluginLocation; - } - return null; - } - - public void AddPlugin(string filePath) - { - pluginAssemblyLocations.Add(filePath); - } - - public void AddPluginFolder(string folder) - { - if (!Directory.Exists(folder)) - return; - - foreach (string filePath in Directory.EnumerateFiles(folder, "*.dll")) - { - if (logger != null) - logger.Debug("Detected plugin: {0}", Path.GetFileNameWithoutExtension(filePath)); - pluginAssemblyLocations.Add(filePath); - } - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/Program.cs b/sources/buildengine/Stride.Core.BuildEngine/Program.cs deleted file mode 100644 index e8205a7f00..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/Program.cs +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. - -using System; -using System.IO; -using Mono.Options; -using System.Reflection; -using System.Text; -using System.Diagnostics; -using Stride.Core.Diagnostics; - -namespace Stride.Core.BuildEngine -{ - class Program - { - private static string FormatLog(LogMessage message) - { - var builder = new StringBuilder(); - TimeSpan timestamp = DateTime.Now - Process.GetCurrentProcess().StartTime; - builder.Append((timestamp.TotalMilliseconds * 0.001).ToString("0.000 ")); - builder.Append(message.Module); - builder.Append(": "); - builder.Append(message.Text); - return builder.ToString(); - } - - private static int Main(string[] args) - { - var exeName = Path.GetFileName(Assembly.GetExecutingAssembly().Location); - var showHelp = false; - var options = new BuilderOptions(Logger.GetLogger("BuildEngine")); - - var p = new OptionSet - { - "Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) All Rights Reserved", - "Stride Build Tool - Version: " - + - String.Format( - "{0}.{1}.{2}", - typeof(Program).Assembly.GetName().Version.Major, - typeof(Program).Assembly.GetName().Version.Minor, - typeof(Program).Assembly.GetName().Version.Build) + string.Empty, - string.Format("Usage: {0} [options]* inputfile -o outputfile", exeName), - string.Empty, - "=== Options ===", - string.Empty, - { "h|help", "Show this message and exit", v => showHelp = v != null }, - { "v|verbose", "Show more verbose progress logs", v => options.Verbose = v != null }, - { "d|debug", "Show debug logs (imply verbose)", v => options.Debug = v != null }, - { "c|clean", "Clean the command cache, forcing to rebuild everything at the next build.", v => options.BuilderMode = Builder.Mode.Clean }, - { "cd|clean-delete", "Clean the command cache and delete output objects", v => options.BuilderMode = Builder.Mode.CleanAndDelete }, - { "b|build-path=", "Build path", v => options.BuildDirectory = v }, - { "mdb|metadata-database=", "Optional ; indicate the directory containing the Metadata database, if used.", v => { if (!string.IsNullOrEmpty(v)) options.MetadataDatabaseDirectory = v; } }, - { "o|output-path=", "Optional ; indicate an output path to copy the built assets in.", v => options.OutputDirectory = v }, - { "cfg|config=", "Configuration name", v => options.Configuration = v }, - { "log", "Enable file logging", v => options.EnableFileLogging = v != null }, - { "log-file=", "Log build in a custom file.", v => - { - options.EnableFileLogging = v != null; - options.CustomLogFileName = v; - } }, - { "monitor-pipe=", "Monitor pipe.", v => - { - if (!string.IsNullOrEmpty(v)) - options.MonitorPipeNames.Add(v); - } }, - { "slave=", "Slave pipe", v => options.SlavePipe = v }, // Benlitz: I don't think this should be documented - { "s|sourcebase=", "Optional ; Set the base directory for the source files. Not required if all source paths are absolute", v => options.SourceBaseDirectory = v }, - { "a|append", "If set, the existing asset mappings won't be deleted.", v => options.Append = v != null }, - { "t|threads=", "Number of threads to create. Default value is the number of hardware threads available.", v => options.ThreadCount = int.Parse(v) }, - { "p|plugin=", "Add plugin directory.", v => - { - if (!string.IsNullOrEmpty(v)) - options.Plugins.AddPluginFolder(v); - } }, - { "test=", "Run a test session.", v => options.TestName = v } - }; - - TextWriterLogListener fileLogListener = null; - - // Output logs to the console with colored messages - if (options.SlavePipe == null) - { - var consoleLogListener = new ConsoleLogListener { TextFormatter = FormatLog }; - GlobalLogger.MessageLogged += consoleLogListener; - } - - // Setting up plugin manager - options.Plugins.AddPluginFolder(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) ?? "", "BuildPlugins")); - options.Plugins.Register(); - - BuildResultCode exitCode; - - try - { - options.InputFiles = p.Parse(args); - - // Also write logs from master process into a file - if (options.SlavePipe == null) - { - if (options.EnableFileLogging) - { - string logFileName = options.CustomLogFileName; - if (string.IsNullOrEmpty(logFileName)) - { - string inputName = "NoInput"; - if (options.InputFiles.Count > 0) - inputName = Path.GetFileNameWithoutExtension(options.InputFiles[0]); - - logFileName = "Logs/Build-" + inputName + "-" + DateTime.Now.ToString("yy-MM-dd-HH-mm") + ".txt"; - } - - string dirName = Path.GetDirectoryName(logFileName); - if (dirName != null) - Directory.CreateDirectory(dirName); - - fileLogListener = new TextWriterLogListener(new FileStream(logFileName, FileMode.Create)) { TextFormatter = FormatLog }; - GlobalLogger.MessageLogged += fileLogListener; - } - options.Logger.Info("BuildEngine arguments: " + string.Join(" ", args)); - options.Logger.Info("Starting builder."); - } - - if (showHelp) - { - p.WriteOptionDescriptions(Console.Out); - exitCode = BuildResultCode.Successful; - } - else if (!string.IsNullOrEmpty(options.TestName)) - { - var test = new TestSession(); - test.RunTest(options.TestName, options.Logger); - exitCode = BuildResultCode.Successful; - } - else - { - exitCode = BuildEngineCommands.Build(options); - } - } - catch (OptionException e) - { - options.Logger.Error("{0}", e); - exitCode = BuildResultCode.CommandLineError; - } - catch (Exception e) - { - options.Logger.Error("{0}", e); - exitCode = BuildResultCode.BuildError; - } - finally - { - if (fileLogListener != null) - fileLogListener.LogWriter.Close(); - - } - return (int)exitCode; - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/Properties/AssemblyInfo.cs b/sources/buildengine/Stride.Core.BuildEngine/Properties/AssemblyInfo.cs deleted file mode 100644 index 8edd158206..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -#if !DEBUG -[assembly: ObfuscateAssembly(false)] -[assembly: Obfuscation(Feature = "embed Stride.Effects.Modules.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed Stride.Engine.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed Stride.Framework.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed Stride.Framework.Graphics.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed Stride.Importer.FBX.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed Stride.Importer.Assimp.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed Mono.Options.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.D3DCompiler.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.DXGI.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.Direct3D11.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.DirectInput.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.RawInput.dll", Exclude = false)] -[assembly: Obfuscation(Feature = "embed SharpDX.XInput.dll", Exclude = false)] -#endif - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("bc6f5b23-4e4b-49e6-b9bd-c090076fd732")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/sources/buildengine/Stride.Core.BuildEngine/RemoteCommandContext.cs b/sources/buildengine/Stride.Core.BuildEngine/RemoteCommandContext.cs deleted file mode 100644 index 8753a10f7e..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/RemoteCommandContext.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Stride.Core.Diagnostics; -using Stride.Core.Serialization.Assets; -using Stride.Core.Storage; - -namespace Stride.Core.BuildEngine -{ - public class RemoteCommandContext : CommandContextBase - { - public override Logger Logger { get { return logger; } } - - internal new CommandResultEntry ResultEntry { get { return base.ResultEntry; } } - - private readonly Logger logger; - private readonly IProcessBuilderRemote processBuilderRemote; - - public RemoteCommandContext(IProcessBuilderRemote processBuilderRemote, Command command, BuilderContext builderContext, Logger logger) : base(command, builderContext) - { - this.processBuilderRemote = processBuilderRemote; - this.logger = logger; - } - - public override IEnumerable> GetOutputObjectsGroups() - { - yield return processBuilderRemote.GetOutputObjects().ToDictionary(x => x.Key, x => new OutputObject(x.Key, x.Value)); - } - - protected override Task ScheduleAndExecuteCommandInternal(Command command) - { - // Send serialized command - return processBuilderRemote.SpawnCommand(command); - } - - protected override ObjectId ComputeInputHash(UrlType type, string filePath) - { - return processBuilderRemote.ComputeInputHash(type, filePath); - } - } -} diff --git a/sources/buildengine/Stride.Core.BuildEngine/Stride.Core.BuildEngine.csproj b/sources/buildengine/Stride.Core.BuildEngine/Stride.Core.BuildEngine.csproj deleted file mode 100644 index ba708c6406..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/Stride.Core.BuildEngine.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - Windows - - - - 8.0.30703 - 2.0 - Exe - x86 - true - $(StrideEditorTargetFramework) - --auto-module-initializer --serialization - - - AnyCPU - - - - - - - - - - - - - \ No newline at end of file diff --git a/sources/buildengine/Stride.Core.BuildEngine/TestSession.cs b/sources/buildengine/Stride.Core.BuildEngine/TestSession.cs deleted file mode 100644 index 5bbd74489c..0000000000 --- a/sources/buildengine/Stride.Core.BuildEngine/TestSession.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -using Stride.Core.Diagnostics; -using Stride.Core.IO; -using Stride.Core.Serialization; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Threading.Tasks; - -namespace Stride.Core.BuildEngine -{ - public class DoNothingCommand : Command - { - /// - public override string Title { get { return "Do nothing!"; } } - - private static int commandCounter; - private readonly int commandId; - - protected override Task DoCommandOverride(ICommandContext commandContext) - { - return Task.Run(() => ResultStatus.Successful); - } - - public static void ResetCounter() - { - commandCounter = 0; - } - - public DoNothingCommand() - { - commandId = ++commandCounter; - } - - public override string ToString() - { - return GetType().Name + " " + commandId; - } - - protected override void ComputeParameterHash(Stream stream) - { - base.ComputeParameterHash(stream); - - var writer = new BinarySerializationWriter(stream); - writer.Write(commandId); - } - } - - public class TestSession - { - public void RunTest(string testName, Logger logger) - { - foreach (MethodInfo method in typeof(TestSession).GetMethods()) - { - if (method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(Logger)) - { - if (string.Compare(method.Name, testName, StringComparison.OrdinalIgnoreCase) == 0) - method.Invoke(this, new object[] { logger }); - } - } - } - - //private static PluginResolver pluginManager; - private static void BuildStepsRecursively(Builder builder, ICollection steps, int stepsPerLevel, int maxLevel, BuildStep curParent = null, int curLevel = 0) - { - if (curLevel == maxLevel) - return; - - for (var i = 0; i < stepsPerLevel; ++i) - { - BuildStep step = builder.Root.Add(new DoNothingCommand()); - if (curParent != null) - BuildStep.LinkBuildSteps(curParent, step); - BuildStepsRecursively(builder, steps, stepsPerLevel, maxLevel, step, curLevel + 1); - steps.Add(step); - } - } - - public static void TestVeryLargeNumberOfEmptyCommands(Logger logger) - { - string appPath = VirtualFileSystem.GetAbsolutePath("/data/TestVeryLargeNumberOfEmptyCommands"); - string dbPath = appPath + "/TestVeryLargeNumberOfEmptyCommands"; - - if (Directory.Exists(dbPath)) - Directory.Delete(dbPath, true); - - Directory.CreateDirectory(dbPath); - VirtualFileSystem.MountFileSystem("/data/db", dbPath); - logger.ActivateLog(LogMessageType.Debug); - var builder = new Builder("TestBuilder", appPath, Builder.Mode.Build, logger); - var steps = new List(); - const int StepsPerLevel = 5; - const int MaxLevel = 5; - - BuildStepsRecursively(builder, steps, StepsPerLevel, MaxLevel); - int stepCount = 0; - for (var i = 0; i < MaxLevel; ++i) - { - stepCount += (int)Math.Pow(StepsPerLevel, i + 1); - } - Debug.Assert(steps.Count == stepCount); - - logger.Info(stepCount + " steps registered."); - logger.Info("Starting builder (logger disabled)"); - logger.ActivateLog(LogMessageType.Fatal); - builder.Run(); - logger.ActivateLog(LogMessageType.Debug); - logger.Info("Build finished (logger re-enabled)"); - - foreach (BuildStep step in steps) - { - Debug.Assert(step.Status == ResultStatus.Successful); - } - } - - } -}