2 using System.Collections.Generic;
3 using System.Diagnostics;
6 using System.ServiceModel;
9 using SiliconStudio.Core.Storage;
10 using SiliconStudio.Core.Diagnostics;
11 using SiliconStudio.Core.IO;
12 using SiliconStudio.Core.MicroThreading;
13 using SiliconStudio.Core.Serialization;
14 using SiliconStudio.Core.Serialization.Assets;
15 using SiliconStudio.Core.Serialization.Contents;
16 using System.Threading;
18 namespace SiliconStudio.BuildEngine
31 result = BuildSlave(options);
35 result = BuildLocal(options);
39 CopyBuildToOutput(options);
44 throw new OptionException(
"Insufficient parameters, no action taken",
"build-path");
57 string inputFile = options.InputFiles[0];
58 string sdkDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
"../../..");
60 BuildScript buildScript = BuildScript.LoadFromFile(sdkDir, inputFile);
61 buildScript.Compile(options.Plugins);
63 if (buildScript.GetWarnings().FirstOrDefault() != null)
65 foreach (
string warning
in buildScript.GetWarnings())
67 options.Logger.Warning(warning);
71 if (buildScript.HasErrors)
73 foreach (
string error
in buildScript.GetErrors())
75 options.Logger.Error(error);
77 throw new InvalidOperationException(
"Can't compile the provided build script.");
80 string inputDir = Path.GetDirectoryName(inputFile) ?? Environment.CurrentDirectory;
82 options.BuildDirectory = options.BuildDirectory ?? Path.Combine(inputDir, buildScript.BuildDirectory ??
"");
83 options.OutputDirectory = options.OutputDirectory ?? (buildScript.OutputDirectory != null ? Path.Combine(inputDir, buildScript.OutputDirectory) :
"");
84 options.MetadataDatabaseDirectory = options.MetadataDatabaseDirectory ?? (buildScript.MetadataDatabaseDirectory != null ? Path.Combine(inputDir, buildScript.MetadataDatabaseDirectory) :
"");
89 string error = string.Format(
"Source base directory \"{0}\" does not exists.", options.SourceBaseDirectory);
90 options.Logger.Error(error);
91 throw new OptionException(error,
"sourcebase");
93 Environment.CurrentDirectory = options.SourceBaseDirectory;
98 throw new OptionException(
"This tool requires a build path.",
"build-path");
104 options.ValidateOptionsForMaster();
108 PrepareDatabases(options);
112 VirtualFileSystem.CreateDirectory(
"/data/");
113 VirtualFileSystem.CreateDirectory(
"/data/db/");
117 throw new OptionException(
"Invalid Build database path",
"database");
121 LogMessageType logLevel = options.Debug ? LogMessageType.Debug : (options.Verbose ? LogMessageType.Verbose : LogMessageType.Info);
122 var logger = Logger.GetLogger(
"builder");
123 logger.ActivateLog(logLevel);
125 builder.MonitorPipeNames.AddRange(options.MonitorPipeNames);
126 builder.ActivateConfiguration(options.Configuration);
127 foreach (var sourceFolder
in buildScript.SourceFolders)
129 builder.InitialVariables.Add((
"SourceFolder:" + sourceFolder.Key).ToUpperInvariant(), sourceFolder.Value);
131 Console.CancelKeyPress += (sender, e) => Cancel(builder, e);
133 buildScript.Execute(builder);
136 return builder.Run(options.Append ==
false);
143 GlobalLogger.MessageLogged += msg => {
try { processBuilderRemote.ForwardLog(msg); }
catch { } };
152 PrepareDatabases(options);
156 VirtualFileSystem.CreateDirectory(
"/data/");
157 VirtualFileSystem.CreateDirectory(
"/data/db/");
161 throw new OptionException(
"Invalid Build database path",
"database");
165 var namedPipeBinding =
new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) { SendTimeout = TimeSpan.FromSeconds(300.0) };
166 var processBuilderRemote = ChannelFactory<IProcessBuilderRemote>.CreateChannel(namedPipeBinding,
new EndpointAddress(options.
SlavePipe));
170 RegisterRemoteLogger(processBuilderRemote);
175 var status = ResultStatus.NotProcessed;
178 string buildPath = options.BuildDirectory;
179 Logger logger = options.Logger;
180 MicroThread microthread = scheduler.Add(async () =>
183 Command command = processBuilderRemote.GetCommandToExecute();
187 var inputHashes =
new DictionaryStore<InputVersionKey, ObjectId>(VirtualFileSystem.OpenStream(
"/data/db/InputHashes", VirtualFileMode.OpenOrCreate, VirtualFileAccess.ReadWrite, VirtualFileShare.ReadWrite));
188 var builderContext =
new BuilderContext(buildPath, inputHashes, parameters, 0, null);
190 var commandContext =
new RemoteCommandContext(processBuilderRemote, command, builderContext, logger);
191 command.PreCommand(commandContext);
192 status = await command.DoCommand(commandContext);
193 command.PostCommand(commandContext, status);
196 processBuilderRemote.RegisterResult(commandContext.ResultEntry);
204 lock (scheduler.MicroThreads)
206 if (!scheduler.MicroThreads.Any())
216 options.Logger.Fatal(microthread.Exception.ToString());
217 return BuildResultCode.BuildError;
221 return BuildResultCode.Successful;
223 return BuildResultCode.BuildError;
229 ((IClientChannel)processBuilderRemote).Close();
236 throw new InvalidOperationException();
242 if (!objectIds.Add(objectId))
245 using (var stream = AssetManager.FileProvider.OpenStream(
"obj/" + objectId, VirtualFileMode.Open, VirtualFileAccess.Read))
249 var header = ChunkHeader.Read(streamReader);
254 if (header.OffsetToReferences != -1)
257 streamReader.NativeStream.Seek(header.OffsetToReferences, SeekOrigin.Begin);
259 List<ChunkReference> references = null;
260 streamReader.Serialize(ref references, ArchiveMode.Deserialize);
262 foreach (var reference
in references)
265 var databaseFileProvider = DatabaseFileProvider.ResolveObjectId(reference.Location, out refObjectId);
266 if (databaseFileProvider != null)
268 Collect(objectIds, refObjectId, databaseFileProvider.AssetIndexMap);
278 if (builder != null && builder.
IsRunning)
281 builder.CancelBuild();
static BuildResultCode BuildSlave(BuilderOptions options)
Virtual abstraction over a file system. It handles access to files, http, packages, path rewrite, etc...
Represents an execution context managed by a Scheduler, that can cooperatively yield execution to ano...
static void CopyBuildToOutput(BuilderOptions options)
A file system implementation for IVirtualFileProvider.
ResultStatus
Status of a command.
bool IsRunning
Indicate whether this builder is currently running.
bool IsValidForSlave()
This function indicate if the current builder options mean to execute a slave session ...
Base implementation for ILogger.
Exception Exception
Gets the exception that was thrown by this MicroThread.
Mode
Indicate which mode to use with this builder
static readonly IVirtualFileProvider ApplicationData
The application data file provider.
static MicroThreadLocal< DatabaseFileProvider > DatabaseFileProvider
A Command that reads and/or writes to the index file.
Implements SerializationStream as a binary reader.
static BuildResultCode BuildLocal(BuilderOptions options)
static BuildResultCode Build(BuilderOptions options)
LogMessageType
Type of a LogMessage.
static void Cancel(Builder builder, ConsoleCancelEventArgs e)
A hash to uniquely identify data.
Scheduler that manage a group of cooperating MicroThread.
string SourceBaseDirectory
bool IsValidForMaster()
This function indicate if the current builder options mean to execute a master session ...