/// <summary> /// Run with following arguments: /// /// </summary> /// <param name="args"></param> /// <returns></returns> static int Main ( string[] args ) { Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; Log.AddListener( new StdLogListener() ); var options = new BuildOptions(); var parser = new CommandLineParser( options ); try { if ( args.Any( a => a=="/help" )) { PrintHelp( parser ); return 0; } if ( !parser.ParseCommandLine( args ) ) { return 1; } Builder.Build( options ); } catch ( Exception ex ) { parser.ShowError( ex.Message ); return 1; } return 0; }
/// <summary> /// /// </summary> /// <param name="options"></param> public BuildContext ( BuildOptions options, IniData iniData ) { this.Options = options; Log.Message("Source directories:"); contentPaths = new List<string>(); contentPaths.Add( options.FullInputDirectory ); contentPaths.AddRange( GetAllKeysFromSection( iniData, "ContentDirectories" ).Select( p => ResolveDirectory( p )).Where( p1 => p1!=null ) ); foreach ( var dir in contentPaths ) { Log.Message(" {0}", dir ); } Log.Message(""); Log.Message("Binary directories:"); binaryPaths = new List<string>(); binaryPaths.AddRange( GetAllKeysFromSection( iniData, "BinaryDirectories" ).Select( p => ResolveDirectory( p )).Where( p1 => p1!=null ) ); foreach ( var dir in binaryPaths ) { Log.Message(" {0}", dir ); } Log.Message(""); Log.Message("Target directory:"); Log.Message(" {0}", options.FullOutputDirectory ); Log.Message(""); Log.Message("Temp directory:"); Log.Message(" {0}", options.FullTempDirectory ); Log.Message(""); }
/// <summary> /// /// </summary> /// <param name="options"></param> public static void Build ( BuildOptions options ) { Log.Message(""); Log.Message("-------- Build started : {0} --------", options.InputDirectory ); options.CheckOptionsAndMakeDirs(); Log.Message("Reading '.content'..."); // // Parse INI file : // var ip = new StreamIniDataParser(); ip.Parser.Configuration.AllowDuplicateSections = true; ip.Parser.Configuration.AllowDuplicateKeys = true; ip.Parser.Configuration.CommentString = "#"; ip.Parser.Configuration.OverrideDuplicateKeys = true; ip.Parser.Configuration.KeyValueAssigmentChar = '='; ip.Parser.Configuration.AllowKeysWithoutValues = true; var iniData = ip.ReadData( new StreamReader( options.ContentIniFile ) ); // // Setup builder : // var bindings = AssetProcessorBinding.GatherAssetProcessors(); Log.Message("Asset processors:"); foreach ( var bind in bindings ) { Log.Message(" {0,-20} - {1}", bind.Name, bind.Type.Name ); } Log.Message(""); var builder = new Builder( bindings ); var result = builder.Build( options, iniData ); Log.Message("-------- {5} total, {0} succeeded, {1} failed, {2} up-to-date, {3} ignored, {4} skipped --------", result.Succeded, result.Failed, result.UpToDate, result.Ignored, result.Skipped, result.Total ); Log.Message(""); if (result.Failed>0) { throw new BuildException("Build errors"); } }
static Builder() { Options = new BuildOptions(); }
/// <summary> /// /// </summary> /// <param name="sourceFolder"></param> /// <param name="targetFolder"></param> /// <param name="force"></param> public BuildResult Build ( BuildOptions options, IniData iniData ) { BuildResult result = new BuildResult(); context = new BuildContext( options, iniData ); var ignorePatterns = new string[0]; if ( iniData.Sections.ContainsSection("Ignore") ) { ignorePatterns = iniData.Sections["Ignore"] .Select( element => element.KeyName ) .Select( key => ContentUtils.BackslashesToSlashes( key ) ) .ToArray(); } if ( iniData.Sections.ContainsSection("Download") ) { Download( context, iniData.Sections["Download"], result ); } // // gather files on source folder ignoring // files that match ignore pattern : // Log.Message("Gathering files..."); var assetSources = GatherAssetFiles( ignorePatterns, iniData, context, ref result ); Log.Message(""); // // Check hash collisions : // var collisions = assetSources .GroupBy( file0 => file0.TargetName ) .Where( fileGroup1 => fileGroup1.Count() > 1 ) .Distinct() .ToArray(); if (collisions.Any()) { Log.Error("Hash collisions detected:"); int collisionCount = 0; foreach ( var collision in collisions ) { Log.Error(" [{0}] {1}", collisionCount++, collision.Key); foreach ( var collisionEntry in collision ) { Log.Error( " {0}", collisionEntry.FullSourcePath ); } } throw new BuildException("Hash collisions detected"); } // // remove stale built content : // Log.Message("Cleaning stale content up..."); CleanStaleContent( options.FullOutputDirectory, assetSources ); Log.Message(""); // // Build everything : // foreach ( var assetSource in assetSources ) { var proc = assetSource.CreateProcessor(); BuildAsset( proc, assetSource.BuildArguments, assetSource, ref result ); } return result; }
/// <summary> /// /// </summary> /// <param name="sourceFolder"></param> /// <param name="targetFolder"></param> /// <param name="force"></param> BuildResult Build(BuildOptions options, IniData iniData) { BuildResult result = new BuildResult(); context = new BuildContext(options, iniData); var ignorePatterns = new string[0]; if (iniData.Sections.ContainsSection("Ignore")) { ignorePatterns = iniData.Sections["Ignore"] .Select(element => element.KeyName) .Select(key => ContentUtils.BackslashesToSlashes(key)) .ToArray(); } if (iniData.Sections.ContainsSection("Download")) { Download(context, iniData.Sections["Download"], result); } // // gather files on source folder ignoring // files that match ignore pattern : // Log.Message("Gathering files..."); var assetSources = new List <AssetSource>(); assetSources.AddRange(GatherRequiredShaders(context, result)); assetSources.AddRange(GatherAssetFiles(ignorePatterns, iniData, context, ref result)); Log.Message(""); File.WriteAllLines(Path.Combine(options.FullOutputDirectory, "assetdb"), assetSources.Select(asset => asset.KeyPath).OrderBy(n => n)); // // Check hash collisions : // var collisions = assetSources .GroupBy(file0 => file0.TargetName) .Where(fileGroup1 => fileGroup1.Count() > 1) .Distinct() .ToArray(); if (collisions.Any()) { Log.Error("Hash collisions detected:"); int collisionCount = 0; foreach (var collision in collisions) { Log.Error(" [{0}] {1}", collisionCount++, collision.Key); foreach (var collisionEntry in collision) { Log.Error(" {0}", collisionEntry.FullSourcePath); } } throw new BuildException("Hash collisions detected"); } // // remove stale built content : // Log.Message("Cleaning stale content up..."); CleanStaleContent(options.FullOutputDirectory, assetSources); Log.Message(""); // // Build everything : // foreach (var assetSource in assetSources) { var proc = assetSource.CreateProcessor(); BuildAsset(proc, assetSource.BuildArguments, assetSource, ref result); } // // Build megatexture // BuildMegatexture(ref result); return(result); }