private void BG_DoWork(object sender, DoWorkEventArgs e) { string ErrorText; string DLLFilename; PackageCompiler = new PackageCompiler(); PackageCompiler.OnStatusUpdate += PackageCompiler_OnStatusUpdate; if (PackageCompiler.CheckScript(Package, out ErrorText) == false) { e.Result = ErrorText; e.Cancel = false; Debug.WriteLine("BG_DoWork() canceled"); return; } if (PackageCompiler.CompileScript(Package.Script, out ErrorText, "", out DLLFilename) == null) { e.Result = ErrorText; e.Cancel = false; Debug.WriteLine("BG_DoWork() canceled (Compiler)"); return; } if (PackageCompiler.CompilePackage(Package, (PKGCompilerArgs)e.Argument, out ErrorText) == false) { e.Result = ErrorText; e.Cancel = false; Debug.WriteLine("BG_DoWork() canceled (2)"); return; } e.Cancel = false; e.Result = true; Debug.WriteLine("BG_DoWork() done"); }
public void CompilerDependencyByIncludeTypeAnalysis() { var package = new Package(); // ReSharper disable once UnusedVariable - we need a package session to compile var packageSession = new PackageSession(package); var asset1 = new AssetItem("content1", new MyAsset1(), package); // Should be compiled (root) var asset2 = new AssetItem("content2", new MyAsset2(), package); // Should be compiled (Runtime for Asset1) var asset31 = new AssetItem("content3_1", new MyAsset3(), package); // Should NOT be compiled (CompileAsset for Asset1) var asset32 = new AssetItem("content3_2", new MyAsset3(), package); // Should be compiled (Runtime for Asset2) ((MyAsset1)asset1.Asset).MyContent2 = AttachedReferenceManager.CreateProxyObject <MyContent2>(asset2.Id, asset2.Location); ((MyAsset1)asset1.Asset).MyContent3 = AttachedReferenceManager.CreateProxyObject <MyContent3>(asset31.Id, asset31.Location); ((MyAsset2)asset2.Asset).MyContent3 = AttachedReferenceManager.CreateProxyObject <MyContent3>(asset32.Id, asset32.Location); package.Assets.Add(asset1); package.Assets.Add(asset2); package.Assets.Add(asset31); package.Assets.Add(asset32); package.RootAssets.Add(new AssetReference(asset1.Id, asset1.Location)); // Create context var context = new AssetCompilerContext { CompilationContext = typeof(AssetCompilationContext) }; // Builds the project var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true); var assetBuildResult = assetBuilder.Prepare(context); // Total number of asset to compile = 3 Assert.AreEqual(3, assetBuildResult.BuildSteps.Count); }
public void CompilerVisitRuntimeType() { var package = new Package(); // ReSharper disable once UnusedVariable - we need a package session to compile var packageSession = new PackageSession(package); var otherAssets = new List <AssetItem> { new AssetItem("contentRB", new MyAssetContentType(0), package), new AssetItem("contentRA", new MyAssetContentType(1), package), new AssetItem("content0B", new MyAssetContentType(2), package), new AssetItem("content0M", new MyAssetContentType(3), package), new AssetItem("content0A", new MyAssetContentType(4), package), new AssetItem("content1B", new MyAssetContentType(5), package), new AssetItem("content1M", new MyAssetContentType(6), package), new AssetItem("content1A", new MyAssetContentType(7), package), new AssetItem("content2B", new MyAssetContentType(8), package), new AssetItem("content2M", new MyAssetContentType(9), package), new AssetItem("content2A", new MyAssetContentType(10), package), new AssetItem("content3B", new MyAssetContentType(11), package), new AssetItem("content3M", new MyAssetContentType(12), package), new AssetItem("content3A", new MyAssetContentType(13), package), new AssetItem("content4B", new MyAssetContentType(14), package), new AssetItem("content4M", new MyAssetContentType(15), package), new AssetItem("content4A", new MyAssetContentType(16), package), }; var assetToVisit = new MyAsset1(); assetToVisit.Before = AttachedReferenceManager.CreateProxyObject <MyContentType>(otherAssets[0].Id, otherAssets[0].Location); assetToVisit.Zafter = AttachedReferenceManager.CreateProxyObject <MyContentType>(otherAssets[1].Id, otherAssets[1].Location); assetToVisit.RuntimeTypes.Add(CreateRuntimeType(otherAssets[2], otherAssets[3], otherAssets[4])); assetToVisit.RuntimeTypes.Add(CreateRuntimeType(otherAssets[5], otherAssets[6], otherAssets[7])); assetToVisit.RuntimeTypes.Add(CreateRuntimeType(otherAssets[8], otherAssets[9], otherAssets[10])); assetToVisit.RuntimeTypes.Add(CreateRuntimeType(otherAssets[11], otherAssets[12], otherAssets[13])); assetToVisit.RuntimeTypes.Add(CreateRuntimeType(otherAssets[14], otherAssets[15], otherAssets[16])); assetToVisit.RuntimeTypes[0].A = assetToVisit.RuntimeTypes[1]; assetToVisit.RuntimeTypes[0].B = assetToVisit.RuntimeTypes[2]; assetToVisit.RuntimeTypes[1].A = assetToVisit.RuntimeTypes[3]; assetToVisit.RuntimeTypes[1].B = assetToVisit.RuntimeTypes[4]; otherAssets.ForEach(x => package.Assets.Add(x)); var assetItem = new AssetItem("asset", assetToVisit, package); package.Assets.Add(assetItem); package.RootAssets.Add(new AssetReference(assetItem.Id, assetItem.Location)); // Create context var context = new AssetCompilerContext { CompilationContext = typeof(AssetCompilationContext) }; // Builds the project var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true); var assetBuildResult = assetBuilder.Prepare(context); Assert.AreEqual(16, assetBuildResult.BuildSteps.Count); }
/// <summary> /// Creates a build step that will build all shaders from system packages. /// </summary> /// <param name="session">The session used to retrieve currently used system packages.</param> /// <returns>A <see cref="ListBuildStep"/> containing the steps to build all shaders from system packages.</returns> /// <exception cref="ArgumentNullException"><paramref name="session"/> is a <c>null</c> reference.</exception> public ListBuildStep CreateSystemShaderBuildSteps(SessionViewModel session) { if (session is null) { throw new ArgumentNullException(nameof(session)); } // Check if there are any new system projects to preload // TODO: PDX-1251: For now, allow non-system project as well (which means they will be loaded only once at startup) // Later, they should be imported depending on what project the currently previewed/built asset is var systemPackages = session.AllPackages.Where(project => /*project.IsSystem &&*/ !systemProjectsLoaded.Contains(project.Package.Meta.Name)).ToList(); if (systemPackages.Count == 0) { return(null); } var importShadersRootProject = new StandalonePackage(new Package()); var importShadersProjectSession = new PackageSession(); importShadersProjectSession.Projects.Add(importShadersRootProject); foreach (var package in systemPackages) { var mapPackage = new Package { FullPath = package.PackagePath }; foreach (var asset in package.Assets) { if (typeof(EffectShaderAsset).IsAssignableFrom(asset.AssetType)) { mapPackage.Assets.Add(new AssetItem(asset.Url, asset.Asset) { SourceFolder = asset.AssetItem.SourceFolder, AlternativePath = asset.AssetItem.AlternativePath }); } } importShadersProjectSession.Projects.Add(new StandalonePackage(mapPackage)); importShadersRootProject.FlattenedDependencies.Add(new Dependency(mapPackage)); } // Compile the fake project (create the build steps) var assetProjectCompiler = new PackageCompiler(new PackageAssetEnumerator(importShadersRootProject.Package)); var context = new AssetCompilerContext { CompilationContext = typeof(AssetCompilationContext) }; var dependenciesCompileResult = assetProjectCompiler.Prepare(context); context.Dispose(); var buildSteps = dependenciesCompileResult.BuildSteps; buildSteps?.Add(new UpdateImportShaderCacheBuildStep(systemProjectsLoaded, systemPackages.Select(x => x.Package.Meta.Name).ToList())); return(buildSteps); }
public void TestRuntime() { var package = new Package(); // ReSharper disable once UnusedVariable - we need a package session to compile var packageSession = new PackageSession(package); var otherAssets = new List <AssetItem> { new AssetItem("asset11", new MyAsset11(), package), new AssetItem("asset12", new MyAsset12(), package), new AssetItem("asset13", new MyAsset13(), package), }; otherAssets.ForEach(x => package.Assets.Add(x)); var compileAssetReference = new MyAsset4 { CompileAssetReference = CreateRef <MyContent11>(otherAssets[0]), CompileContentReference = CreateRef <MyContent12>(otherAssets[1]), CompileRuntimeReference = CreateRef <MyContent13>(otherAssets[2]), }; var assetItem = new AssetItem("asset4", compileAssetReference, package); package.Assets.Add(assetItem); var asset = new MyAsset1 { CompileAssetReference = CreateRef <MyContent2>(assetItem) }; assetItem = new AssetItem("asset1", asset, package); package.Assets.Add(assetItem); package.RootAssets.Add(new AssetReference(assetItem.Id, assetItem.Location)); // Create context var context = new AssetCompilerContext { CompilationContext = typeof(AssetCompilationContext) }; // Builds the project Exception ex = null; MyAsset1Compiler.AssertFunc = (url, ass, pkg) => { AssertInThread(ref ex, () => Assert.AreEqual(1, TestCompilerBase.CompiledAssets.Count)); AssertInThread(ref ex, () => Assert.AreEqual(compileAssetReference.Id, TestCompilerBase.CompiledAssets.First().Id)); }; var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); var assetBuildResult = assetBuilder.Prepare(context); // Since MyAsset4 is a Runtime reference, it should be compiled, so we should have 2 asset (MyAsset1 and MyAsset4) to compile. Assert.AreEqual(2, assetBuildResult.BuildSteps.Count); var builder = new Builder(GlobalLogger.GetLogger("Test"), "", "", ""); builder.Root.Add(assetBuildResult.BuildSteps); builder.Run(Builder.Mode.Build, false); RethrowAssertsFromThread(ex); }
public void TestCompileAsset() { var package = new Package(); // ReSharper disable once UnusedVariable - we need a package session to compile var packageSession = new PackageSession(package); var otherAssets = new List <AssetItem> { new AssetItem("asset5", new MyAsset5(), package), new AssetItem("asset6", new MyAsset6(), package), new AssetItem("asset7", new MyAsset7(), package), }; otherAssets.ForEach(x => package.Assets.Add(x)); var compileAssetReference = new MyAsset2 { CompileAssetReference = CreateRef <MyContent5>(otherAssets[0]), CompileContentReference = CreateRef <MyContent6>(otherAssets[1]), CompileRuntimeReference = CreateRef <MyContent7>(otherAssets[2]), }; var assetItem = new AssetItem("asset2", compileAssetReference, package); package.Assets.Add(assetItem); var asset = new MyAsset1 { CompileAssetReference = CreateRef <MyContent2>(assetItem) }; assetItem = new AssetItem("asset1", asset, package); package.Assets.Add(assetItem); package.RootAssets.Add(new AssetReference(assetItem.Id, assetItem.Location)); // Create context var context = new AssetCompilerContext { CompilationContext = typeof(AssetCompilationContext) }; // Builds the project Exception ex = null; MyAsset1Compiler.AssertFunc = (url, ass, pkg) => { // Nothing must have been compiled before AssertInThread(ref ex, () => Assert.Empty(TestCompilerBase.CompiledAssets)); }; var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); var assetBuildResult = assetBuilder.Prepare(context); // Since MyAsset2 is a CompileAsset reference, it should not be compiled, so we should have only 1 asset (MyAsset1) to compile. Assert.Equal(1, assetBuildResult.BuildSteps.Count); var builder = new Builder(GlobalLogger.GetLogger("Test"), "", ""); builder.Root.Add(assetBuildResult.BuildSteps); builder.Run(Builder.Mode.Build, false); RethrowAssertsFromThread(ex); }
private void testCompilePackageScriptToolStripMenuItem_Click(object sender, EventArgs e) { Package.Script = txtScript.Text; string ErrorText = ""; string DLLFilename; if (PackageCompiler.CompileScript(Package.Script, out ErrorText, "", out DLLFilename) == null) { MessageBox.Show(this, ErrorText, Program.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } MessageBox.Show(this, "No errors.", Program.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Information); }
public ListBuildStep CreateUserShaderBuildSteps(SessionViewModel session) { var packages = session.AllPackages.Where(project => !project.Package.IsSystem).ToList(); if (packages.Count == 0) { return(null); } var importShadersRootProject = new StandalonePackage(new Package()); var importShadersProjectSession = new PackageSession(); importShadersProjectSession.Projects.Add(importShadersRootProject); foreach (var package in packages) { var mapPackage = new Package { FullPath = package.PackagePath }; foreach (var asset in package.Assets) { if (typeof(EffectShaderAsset).IsAssignableFrom(asset.AssetType)) { mapPackage.Assets.Add(new AssetItem(asset.Url, asset.Asset) { SourceFolder = asset.AssetItem.SourceFolder, AlternativePath = asset.AssetItem.AlternativePath }); } } importShadersProjectSession.Projects.Add(new StandalonePackage(mapPackage)); importShadersRootProject.FlattenedDependencies.Add(new Dependency(mapPackage)); } // compile the fake project (create the build steps) var assetProjectCompiler = new PackageCompiler(new PackageAssetEnumerator(importShadersRootProject.Package)); var dependenciesCompileResult = assetProjectCompiler.Prepare(new AssetCompilerContext { CompilationContext = typeof(AssetCompilationContext) }); var buildSteps = dependenciesCompileResult.BuildSteps; buildSteps?.Add(new UpdateImportShaderCacheBuildStep(new HashSet <string>(), packages.Select(x => x.Package.Meta.Name).ToList())); return(buildSteps); }
private BuildResultCode BuildMaster() { try { PackageSessionPublicHelper.FindAndSetMSBuildVersion(); } catch (Exception e) { var message = "Could not find a compatible version of MSBuild.\r\n\r\n" + "Check that you have a valid installation with the required workloads, or go to [www.visualstudio.com/downloads](https://www.visualstudio.com/downloads) to install a new one.\r\n\r\n" + e; builderOptions.Logger.Error(message); return(BuildResultCode.BuildError); } AssetCompilerContext context = null; PackageSession projectSession = null; try { var sessionLoadParameters = new PackageLoadParameters { AutoCompileProjects = !builderOptions.DisableAutoCompileProjects, ExtraCompileProperties = builderOptions.ExtraCompileProperties, RemoveUnloadableObjects = true, BuildConfiguration = builderOptions.ProjectConfiguration, }; // Loads the root Package var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters); projectSessionResult.CopyTo(builderOptions.Logger); if (projectSessionResult.HasErrors) { return(BuildResultCode.BuildError); } projectSession = projectSessionResult.Session; // Find loaded package (either xkpkg or csproj) -- otherwise fallback to first one var packageFile = (UFile)builderOptions.PackageFile; var package = projectSession.LocalPackages.FirstOrDefault(x => x.FullPath == packageFile || (x.Container is SolutionProject project && project.FullPath == packageFile)) ?? projectSession.LocalPackages.First(); // Setup variables var buildDirectory = builderOptions.BuildDirectory; var outputDirectory = builderOptions.OutputDirectory; // Process game settings asset var gameSettingsAsset = package.GetGameSettingsAsset(); if (gameSettingsAsset == null) { builderOptions.Logger.Warning($"Could not find game settings asset at location [{GameSettingsAsset.GameSettingsLocation}]. Use a Default One"); gameSettingsAsset = GameSettingsFactory.Create(); } // Create context context = new AssetCompilerContext { Platform = builderOptions.Platform, CompilationContext = typeof(AssetCompilationContext), BuildConfiguration = builderOptions.ProjectConfiguration, Package = package, }; // Command line properties foreach (var property in builderOptions.Properties) { context.OptionProperties.Add(property.Key, property.Value); } // Set current game settings context.SetGameSettingsAsset(gameSettingsAsset); // Builds the project var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler; context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true); var assetBuildResult = assetBuilder.Prepare(context); assetBuildResult.CopyTo(builderOptions.Logger); if (assetBuildResult.HasErrors) { return(BuildResultCode.BuildError); } // Setup the remote process build var remoteBuilderHelper = new PackageBuilderRemoteHelper(projectSession.AssemblyContainer, builderOptions); var indexName = "index." + package.Meta.Name; // Add runtime identifier (if any) to avoid clash when building multiple at the same time (this happens when using ExtrasBuildEachRuntimeIdentifier feature of MSBuild.Sdk.Extras) if (builderOptions.Properties.TryGetValue("RuntimeIdentifier", out var runtimeIdentifier)) { indexName += $".{runtimeIdentifier}"; } // Create the builder builder = new Builder(builderOptions.Logger, buildDirectory, indexName) { ThreadCount = builderOptions.ThreadCount, TryExecuteRemote = remoteBuilderHelper.TryExecuteRemote }; builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames); // Add build steps generated by AssetBuilder builder.Root.Add(assetBuildResult.BuildSteps); // Run builder var result = builder.Run(Builder.Mode.Build); builder.WriteIndexFile(false); // Fill list of bundles var bundlePacker = new BundlePacker(); bundlePacker.Build(builderOptions.Logger, projectSession, indexName, outputDirectory, builder.DisableCompressionIds, context.GetCompilationMode() != CompilationMode.AppStore); return(result); } finally { builder?.Dispose(); // Dispose the session (in order to unload assemblies) projectSession?.Dispose(); context?.Dispose(); // Make sure that MSBuild doesn't hold anything else VSProjectHelper.Reset(); } }
private BuildResultCode BuildMaster() { // Only querying graphics platform, let's load package, print it and exit if (builderOptions.GetGraphicsPlatform) { return(BuildGetGraphicsPlatform()); } AssetCompilerContext context = null; PackageSession projectSession = null; try { // TODO handle solution file + package-id ? // When the current platform is not on windows, we need to make sure that all plugins are build, so we // setup auto-compile when loading the session var sessionLoadParameters = new PackageLoadParameters { AutoCompileProjects = builderOptions.Platform != PlatformType.Windows || !builderOptions.DisableAutoCompileProjects, ExtraCompileProperties = builderOptions.ExtraCompileProperties, }; // Loads the root Package var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters); if (projectSessionResult.HasErrors) { projectSessionResult.CopyTo(builderOptions.Logger); return(BuildResultCode.BuildError); } projectSession = projectSessionResult.Session; // Check build configuration var package = projectSession.LocalPackages.Last(); // Check build profile var sharedProfile = package.Profiles.FindSharedProfile(); var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile); if (buildProfile == null) { builderOptions.Logger.Error("Unable to find profile [{0}] in package [{1}]", builderOptions.BuildProfile, package.FullPath); return(BuildResultCode.BuildError); } // Setup variables var buildDirectory = builderOptions.BuildDirectory; var outputDirectory = builderOptions.OutputDirectory; // Process game settings asset var gameSettingsAsset = package.GetGameSettingsAsset(); if (gameSettingsAsset == null) { builderOptions.Logger.Warning("Could not find game settings asset at location [{0}]. Use a Default One", GameSettingsAsset.GameSettingsLocation); gameSettingsAsset = GameSettingsFactory.Create(); } // Create context context = new AssetCompilerContext { Profile = builderOptions.BuildProfile, Platform = builderOptions.Platform, BuildConfiguration = builderOptions.ProjectConfiguration }; // Command line properties foreach (var property in builderOptions.Properties) { context.OptionProperties.Add(property.Key, property.Value); } // Set current game settings context.SetGameSettingsAsset(gameSettingsAsset); // Copy properties from shared profiles to context properties if (sharedProfile != null) { sharedProfile.Properties.CopyTo(context.PackageProperties, true); } // Copy properties from build profile buildProfile.Properties.CopyTo(context.PackageProperties, true); // Builds the project var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler; var assetBuildResult = assetBuilder.Compile(context); assetBuildResult.CopyTo(builderOptions.Logger); if (assetBuildResult.HasErrors) { return(BuildResultCode.BuildError); } // Add specific steps to generate shaders // TODO: This doesn't really belong here, where should we move it? //assetBuildResult.BuildSteps.Add(new WaitBuildStep()); //assetBuildResult.BuildSteps.Add(new CompileDefaultSceneEffectCommand(context, package, assetBuildResult)); // Create the builder var indexName = "index." + builderOptions.BuildProfile; builder = new Builder(builderOptions.Logger, buildDirectory, builderOptions.BuildProfile, indexName) { ThreadCount = builderOptions.ThreadCount }; builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames); // Add build steps generated by AssetBuilder builder.Root.Add(assetBuildResult.BuildSteps); // Run builder var result = builder.Run(Builder.Mode.Build); builder.WriteIndexFile(false); // Fill list of bundles var bundlePacker = new BundlePacker(); bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds); return(result); } finally { builder?.Dispose(); // Dispose the session (in order to unload assemblies) projectSession?.Dispose(); context?.Dispose(); } }
static int Main(string[] args) { if (args.Length < 1) { Help(); return(1); } switch (args[0].ToLower()) { case "-?": case "/?": case "/h": case "-h": case "?": Help(); return(1); case "listcerts": { Console.WriteLine("Available certificates:"); foreach (string s in Certificates.GetCertificates(StoreLocation.CurrentUser)) { Console.WriteLine(" " + s); } Console.WriteLine("Available CSPs:"); foreach (string s in SmartCards.GetCSPProviders()) { Console.WriteLine(" " + s); } return(0); } case "compile": { if (args.Length < 4) { Console.WriteLine("Insufficient argurments."); return(1); } string filename = args[1]; CertMethod certmeth = CertMethod.UNKNOWN; switch (args[2].ToLower()) { case "cert": certmeth = CertMethod.CERT; break; case "csp": certmeth = CertMethod.CSP; break; } if (certmeth == CertMethod.UNKNOWN) { Console.WriteLine("Unknown certificate method."); return(1); } string certname = args[3]; PKGCompilerArgs pkgcompiler = new PKGCompilerArgs(); pkgcompiler.UseExtSign = certmeth == CertMethod.CSP ? true : false; pkgcompiler.SignCert = certname; pkgcompiler.SignExtCert = certname; pkgcompiler.SignLocation = StoreLocation.CurrentUser; pkgcompiler.PIN = null; string ErrorText; PackageCompiler PackageCompiler = new PackageCompiler(); PackageCompiler.OnStatusUpdate += PackageCompiler_OnStatusUpdate; bool res = PackageCompiler.CompilePackage(filename, pkgcompiler, out ErrorText); if (res == false) { Console.WriteLine("\n" + ErrorText + "\n\nFAILED!\n"); return(5); } Console.WriteLine("Success"); return(0); } default: { Console.WriteLine("Unsupported command"); break; } } return(1); }
private BuildResultCode BuildMaster() { // Only querying graphics platform, let's load package, print it and exit if (builderOptions.GetGraphicsPlatform) { return(BuildGetGraphicsPlatform()); } assetLogger = new RemoteLogForwarder(builderOptions.Logger, builderOptions.LogPipeNames); GlobalLogger.GlobalMessageLogged += assetLogger; try { // TODO handle solution file + package-id ? // When the current platform is not on windows, we need to make sure that all plugins are build, so we // setup auto-compile when loading the session var sessionLoadParameters = new PackageLoadParameters { AutoCompileProjects = builderOptions.Platform != PlatformType.Windows || builderOptions.ProjectConfiguration != "Debug", // Avoid compiling if Windows|Debug ExtraCompileProperties = builderOptions.ExtraCompileProperties, }; // Loads the root Package var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters); if (projectSessionResult.HasErrors) { projectSessionResult.CopyTo(builderOptions.Logger); return(BuildResultCode.BuildError); } var projectSession = projectSessionResult.Session; // Check build configuration var package = projectSession.LocalPackages.First(); // Check build profile var sharedProfile = package.Profiles.FindSharedProfile(); var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile); if (buildProfile == null) { builderOptions.Logger.Error("Unable to find profile [{0}] in package [{1}]", builderOptions.BuildProfile, package.FullPath); return(BuildResultCode.BuildError); } // Setup variables var buildDirectory = builderOptions.BuildDirectory; var outputDirectory = builderOptions.OutputDirectory; // Builds the project var assetBuilder = new PackageCompiler(); assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler; // Create context var context = new AssetCompilerContext { Package = package, Platform = builderOptions.Platform }; // Copy properties from shared profiles to context properties if (sharedProfile != null) { sharedProfile.Properties.CopyTo(context.PackageProperties, true); } // Copy properties from build profile buildProfile.Properties.CopyTo(context.PackageProperties, true); var gameSettingsAsset = context.Package.GetGameSettingsAsset(); if (gameSettingsAsset == null) { builderOptions.Logger.Error("Could not find game settings asset at location [{0}]", GameSettingsAsset.GameSettingsLocation); return(BuildResultCode.BuildError); } context.SetGameSettingsAsset(gameSettingsAsset); var assetBuildResult = assetBuilder.Compile(context); assetBuildResult.CopyTo(builderOptions.Logger); if (assetBuildResult.HasErrors) { return(BuildResultCode.BuildError); } // Create the builder var indexName = "index." + builderOptions.BuildProfile; builder = new Builder(buildDirectory, builderOptions.BuildProfile, indexName, "InputHashes", builderOptions.Logger) { ThreadCount = builderOptions.ThreadCount }; builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames); // Add build steps generated by AssetBuilder builder.Root.Add(assetBuildResult.BuildSteps); // Run builder var result = builder.Run(Builder.Mode.Build); builder.WriteIndexFile(false); // Fill list of bundles var bundlePacker = new BundlePacker(); bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds); return(result); } finally { if (builder != null) { builder.Dispose(); } // Flush and close logger GlobalLogger.GlobalMessageLogged -= assetLogger; assetLogger.Dispose(); } }
private BuildResultCode BuildMaster() { // Only querying graphics platform, let's load package, print it and exit if (builderOptions.GetGraphicsPlatform) { return(BuildGetGraphicsPlatform()); } AssetCompilerContext context = null; PackageSession projectSession = null; try { if (!PackageSessionPublicHelper.FindAndSetMSBuildVersion()) { var message = "Could not find a compatible version of MSBuild.\r\n\r\n" + "Check that you have a valid installation with the required workloads, or go to [www.visualstudio.com/downloads](https://www.visualstudio.com/downloads) to install a new one."; builderOptions.Logger.Error(message); return(BuildResultCode.BuildError); } var sessionLoadParameters = new PackageLoadParameters { AutoCompileProjects = !builderOptions.DisableAutoCompileProjects, ExtraCompileProperties = builderOptions.ExtraCompileProperties, RemoveUnloadableObjects = true, }; // Loads the root Package var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters); projectSessionResult.CopyTo(builderOptions.Logger); if (projectSessionResult.HasErrors) { return(BuildResultCode.BuildError); } projectSession = projectSessionResult.Session; // Check build configuration var package = projectSession.LocalPackages.Last(); // Check build profile var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile); if (buildProfile == null) { builderOptions.Logger.Error($"Unable to find profile [{builderOptions.BuildProfile}] in package [{package.FullPath}]"); return(BuildResultCode.BuildError); } // Setup variables var buildDirectory = builderOptions.BuildDirectory; var outputDirectory = builderOptions.OutputDirectory; // Process game settings asset var gameSettingsAsset = package.GetGameSettingsAsset(); if (gameSettingsAsset == null) { builderOptions.Logger.Warning($"Could not find game settings asset at location [{GameSettingsAsset.GameSettingsLocation}]. Use a Default One"); gameSettingsAsset = GameSettingsFactory.Create(); } // Create context context = new AssetCompilerContext { Profile = builderOptions.BuildProfile, Platform = builderOptions.Platform, CompilationContext = typeof(AssetCompilationContext), BuildConfiguration = builderOptions.ProjectConfiguration }; // Command line properties foreach (var property in builderOptions.Properties) { context.OptionProperties.Add(property.Key, property.Value); } // Set current game settings context.SetGameSettingsAsset(gameSettingsAsset); // Builds the project var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler; context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true); var assetBuildResult = assetBuilder.Prepare(context); assetBuildResult.CopyTo(builderOptions.Logger); if (assetBuildResult.HasErrors) { return(BuildResultCode.BuildError); } // Setup the remote process build var remoteBuilderHelper = new PackageBuilderRemoteHelper(projectSession.AssemblyContainer, builderOptions); // Create the builder var indexName = "index." + builderOptions.BuildProfile; builder = new Builder(builderOptions.Logger, buildDirectory, builderOptions.BuildProfile, indexName) { ThreadCount = builderOptions.ThreadCount, TryExecuteRemote = remoteBuilderHelper.TryExecuteRemote }; builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames); // Add build steps generated by AssetBuilder builder.Root.Add(assetBuildResult.BuildSteps); // Run builder var result = builder.Run(Builder.Mode.Build); builder.WriteIndexFile(false); // Fill list of bundles var bundlePacker = new BundlePacker(); bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds, context.GetCompilationMode() != CompilationMode.AppStore); return(result); } finally { builder?.Dispose(); // Dispose the session (in order to unload assemblies) projectSession?.Dispose(); context?.Dispose(); // Make sure that MSBuild doesn't hold anything else VSProjectHelper.Reset(); } }
private BuildResultCode BuildMaster() { // Only querying graphics platform, let's load package, print it and exit if (builderOptions.GetGraphicsPlatform) { return(BuildGetGraphicsPlatform()); } AssetCompilerContext context = null; PackageSession projectSession = null; try { // When the current platform is not on windows, we need to make sure that all plugins are build, so we // setup auto-compile when loading the session var sessionLoadParameters = new PackageLoadParameters { AutoCompileProjects = builderOptions.Platform != PlatformType.Windows || !builderOptions.DisableAutoCompileProjects, ExtraCompileProperties = builderOptions.ExtraCompileProperties, RemoveUnloadableObjects = true, }; // Loads the root Package var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters); projectSessionResult.CopyTo(builderOptions.Logger); if (projectSessionResult.HasErrors) { return(BuildResultCode.BuildError); } projectSession = projectSessionResult.Session; // Check build configuration var package = projectSession.LocalPackages.Last(); // Check build profile var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile); if (buildProfile == null) { builderOptions.Logger.Error($"Unable to find profile [{builderOptions.BuildProfile}] in package [{package.FullPath}]"); return(BuildResultCode.BuildError); } // Setup variables var buildDirectory = builderOptions.BuildDirectory; var outputDirectory = builderOptions.OutputDirectory; // Process game settings asset var gameSettingsAsset = package.GetGameSettingsAsset(); if (gameSettingsAsset == null) { builderOptions.Logger.Warning($"Could not find game settings asset at location [{GameSettingsAsset.GameSettingsLocation}]. Use a Default One"); gameSettingsAsset = GameSettingsFactory.Create(); } // Create context context = new AssetCompilerContext { Profile = builderOptions.BuildProfile, Platform = builderOptions.Platform, CompilationContext = typeof(AssetCompilationContext), BuildConfiguration = builderOptions.ProjectConfiguration }; // Command line properties foreach (var property in builderOptions.Properties) { context.OptionProperties.Add(property.Key, property.Value); } // Set current game settings context.SetGameSettingsAsset(gameSettingsAsset); // Builds the project var assetBuilder = new PackageCompiler(new RootPackageAssetEnumerator(package)); assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler; context.Properties.Set(BuildAssetNode.VisitRuntimeTypes, true); var assetBuildResult = assetBuilder.Prepare(context); assetBuildResult.CopyTo(builderOptions.Logger); if (assetBuildResult.HasErrors) { return(BuildResultCode.BuildError); } // Create the builder var indexName = "index." + builderOptions.BuildProfile; builder = new Builder(builderOptions.Logger, buildDirectory, builderOptions.BuildProfile, indexName) { ThreadCount = builderOptions.ThreadCount }; // Note: try to get exec server if it exists, otherwise use CompilerApp.exe builder.SlaveBuilderPath = (string)AppDomain.CurrentDomain.GetData("RealEntryAssemblyFile") ?? typeof(PackageBuilder).Assembly.Location; builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames); // Add build steps generated by AssetBuilder builder.Root.Add(assetBuildResult.BuildSteps); // Run builder var result = builder.Run(Builder.Mode.Build); builder.WriteIndexFile(false); // Fill list of bundles var bundlePacker = new BundlePacker(); bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds, context.GetCompilationMode() != CompilationMode.AppStore); return(result); } finally { builder?.Dispose(); // Dispose the session (in order to unload assemblies) projectSession?.Dispose(); context?.Dispose(); } }
private BuildResultCode BuildMaster() { assetLogger = new RemoteLogForwarder(builderOptions.Logger, builderOptions.LogPipeNames); GlobalLogger.GlobalMessageLogged += assetLogger; // TODO handle solution file + package-id ? // When the current platform is not on windows, we need to make sure that all plugins are build, so we // setup auto-compile when loading the session var sessionLoadParameters = new PackageLoadParameters() { AutoCompileProjects = builderOptions.Platform != PlatformType.Windows || builderOptions.ProjectConfiguration != "Debug", // Avoid compiling if Windows|Debug ExtraCompileProperties = builderOptions.ExtraCompileProperties, }; // Loads the root Package var projectSessionResult = PackageSession.Load(builderOptions.PackageFile, sessionLoadParameters); if (projectSessionResult.HasErrors) { projectSessionResult.CopyTo(builderOptions.Logger); return(BuildResultCode.BuildError); } var projectSession = projectSessionResult.Session; // Check build configuration var package = projectSession.LocalPackages.First(); // Check build profile var buildProfile = package.Profiles.FirstOrDefault(pair => pair.Name == builderOptions.BuildProfile); if (buildProfile == null) { builderOptions.Logger.Error("Unable to find profile [{0}] in package [{1}]", builderOptions.BuildProfile, package.FullPath); return(BuildResultCode.BuildError); } // Setup variables var buildDirectory = builderOptions.BuildDirectory; var outputDirectory = builderOptions.OutputDirectory; // Builds the project var assetBuilder = new PackageCompiler(); assetBuilder.AssetCompiled += RegisterBuildStepProcessedHandler; // Create context var context = new AssetCompilerContext { Package = package, Platform = builderOptions.Platform }; // If a build profile is available, output the properties context.Properties.Set(SiliconStudio.Paradox.Assets.ParadoxConfig.GraphicsPlatform, builderOptions.GraphicsPlatform.HasValue ? builderOptions.GraphicsPlatform.Value : builderOptions.GetDefaultGraphicsPlatform()); foreach (var propertyValue in buildProfile.Properties) { context.Properties.Set(propertyValue.Key, propertyValue.Value); } var assetBuildResult = assetBuilder.Compile(context); assetBuildResult.CopyTo(builderOptions.Logger); if (assetBuildResult.HasErrors) { return(BuildResultCode.BuildError); } // Create the builder var indexName = "index." + builderOptions.BuildProfile; builder = new Builder(buildDirectory, builderOptions.BuildProfile, indexName, "InputHashes", builderOptions.Logger) { ThreadCount = builderOptions.ThreadCount }; builder.MonitorPipeNames.AddRange(builderOptions.MonitorPipeNames); // Add build steps generated by AssetBuilder builder.Root.Add(assetBuildResult.BuildSteps); // Run builder var result = builder.Run(Builder.Mode.Build); builder.WriteIndexFile(false); // Fill list of bundles var bundlePacker = new BundlePacker(); bundlePacker.Build(builderOptions.Logger, projectSession, buildProfile, indexName, outputDirectory, builder.DisableCompressionIds); // Flush and close logger GlobalLogger.GlobalMessageLogged -= assetLogger; assetLogger.Dispose(); return(result); }