// Create a release public virtual void Release(string baseOutputDir) { string srcDir = Path.Combine(baseOutputDir, this.CrossLibName + @"\src"); string releaseFileName = Path.Combine(Paths.ReleaseDir, this.OutputFileName); Con.WriteLine("Generating '{0}'...", releaseFileName); List <string> files = new List <string>(); string gccOptionForLink; string gccOptionForCompile; generateGccOptions(srcDir, false, false, out gccOptionForLink, out gccOptionForCompile); string targetName = this.Software.ToString(); // Makefile StringWriter mk = GenerateMakeFileForRelease(srcDir); byte[] mkData = Str.NormalizeCrlf(Str.Utf8Encoding.GetBytes(mk.ToString()), new byte[] { 10 }); TarPacker tar = new TarPacker(); tar.AddFileSimple(targetName + @"\Makefile", mkData, 0, mkData.Length, DateTime.Now); // Install Script string isText = File.ReadAllText(Paths.UnixInstallScript); isText = Str.ReplaceStr(isText, "<TITLE>", TitleString, false); byte[] scriptData = Str.NormalizeCrlf(Str.Utf8Encoding.GetBytes(isText), new byte[] { 10 }); tar.AddFileSimple(targetName + @"\.install.sh", scriptData, 0, scriptData.Length, DateTime.Now); // EULA Encoding enc = Str.Utf8Encoding; if (true) { string srcData = File.ReadAllText(Path.Combine(Paths.BinDirName, @"hamcore\eula.txt"), enc); byte[] destData = enc.GetBytes(srcData); tar.AddFileSimple(targetName + @"\" + "ReadMeFirst_License.txt", destData, 0, destData.Length, DateTime.Now); } if (true) { string srcData = File.ReadAllText(Path.Combine(Paths.BinDirName, @"hamcore\authors.txt"), enc); byte[] destData = enc.GetBytes(srcData); tar.AddFileSimple(targetName + @"\" + "Authors.txt", destData, 0, destData.Length, DateTime.Now); } if (true) { string srcData = File.ReadAllText(Path.Combine(Paths.BinDirName, @"hamcore\warning_ja.txt"), enc); byte[] destData = enc.GetBytes(srcData); tar.AddFileSimple(targetName + @"\" + "ReadMeFirst_Important_Notices_ja.txt", destData, 0, destData.Length, DateTime.Now); } if (true) { string srcData = File.ReadAllText(Path.Combine(Paths.BinDirName, @"hamcore\warning_en.txt"), enc); byte[] destData = enc.GetBytes(srcData); tar.AddFileSimple(targetName + @"\" + "ReadMeFirst_Important_Notices_en.txt", destData, 0, destData.Length, DateTime.Now); } if (true) { string srcData = File.ReadAllText(Path.Combine(Paths.BinDirName, @"hamcore\warning_cn.txt"), enc); byte[] destData = enc.GetBytes(srcData); tar.AddFileSimple(targetName + @"\" + "ReadMeFirst_Important_Notices_cn.txt", destData, 0, destData.Length, DateTime.Now); } // Codes string[] dirs = { Path.Combine(srcDir, "code"), Path.Combine(srcDir, "lib"), }; foreach (string dir in dirs) { string[] fileList = Directory.GetFiles(dir, "*.a", SearchOption.TopDirectoryOnly); if (Path.GetFileName(dir).Equals("code", StringComparison.InvariantCultureIgnoreCase)) { fileList = new string[] { Path.Combine(dir, string.Format("{0}.a", this.Software.ToString())), Path.Combine(dir, "vpncmd.a"), }; } foreach (string fileName in fileList) { if (Str.StrCmpi(Path.GetFileName(fileName), "libpcap.a") == false) { // Libpcap.a is not included in the release byte[] fileData = File.ReadAllBytes(fileName); tar.AddFileSimple(targetName + @"\" + IO.GetRelativeFileName(fileName, srcDir), fileData, 0, fileData.Length, DateTime.Now); } } } // License file byte[] lsFileData = File.ReadAllBytes(Path.Combine(CrossLibBaseDir, @"License.txt")); tar.AddFileSimple(targetName + @"\lib\License.txt", lsFileData, 0, lsFileData.Length, DateTime.Now); // HamCore byte[] hcData = File.ReadAllBytes(Path.Combine(Paths.BaseDirName, string.Format(@"bin\BuiltHamcoreFiles\hamcore_unix\hamcore.se2"))); tar.AddFileSimple(targetName + @"\hamcore.se2", hcData, 0, hcData.Length, DateTime.Now); // Generate a tar tar.Finish(); byte[] tarData = tar.CompressToGZip(); File.WriteAllBytes(releaseFileName, tarData); Con.WriteLine("Finished."); }
// Build SrcKit public virtual bool BuildSrcKit(string baseOutputDir, bool debugMode) { // Generate an Output directory name string outDir = Path.Combine(baseOutputDir, this.CrossLibName); string outSrcDir = Path.Combine(outDir, "src"); Con.WriteLine("BuildSrcKit for '{0}'...", this.IDString); Con.WriteLine("CrossLib Name: '{0}'.", this.CrossLibName); Con.WriteLine("BuildSrcKit Output Dir = '{0}'.", outDir); string tsFile = Path.Combine(outDir, "TimeStamp.txt"); string timeStamp = Str.DateTimeToStrShort(BuildSoftwareList.ListCreatedDateTime); Con.WriteLine("timestamp={0}", timeStamp); if (Directory.Exists(outDir)) { bool ok = false; // See TimeStamp.txt file if the directory already exists try { string[] ts = File.ReadAllLines(tsFile); if (ts[0] == timeStamp) { ok = true; } } catch { } if (ok) { Con.WriteLine("Skipped for '{0}'.", this.IDString); return(false); } } else { Directory.CreateDirectory(outDir); } // Copy the source code foreach (string srcDirName in SrcDirNameList) { string srcFullPath = Path.Combine(Paths.BaseDirName, srcDirName); string destFullPath = Path.Combine(outSrcDir, srcDirName); bool delete_bom = true; if (Str.InStr(srcDirName, "\\hamcore")) { delete_bom = false; } IO.CopyDir(srcFullPath, destFullPath, new IO.CopyDirPreCopyDelegate(CopySrcFilesDelegate), false, true, true, delete_bom); } IO.FileCopy(Path.Combine(Paths.BaseDirName, "CurrentBuild.txt"), Path.Combine(outSrcDir, "CurrentBuild.txt"), true, false); IO.FileCopy(Path.Combine(Paths.BaseDirName, "GlobalConst.h"), Path.Combine(outSrcDir, "GlobalConst.h"), true, false); IO.FileCopy(Path.Combine(Paths.BaseDirName, @"DebugFiles\Replace.h"), Path.Combine(outSrcDir, "Replace.h"), true, false); IO.FileCopy(Path.Combine(Paths.BaseDirName, @"bin\BuiltHamcoreFiles\hamcore_unix\hamcore.se2"), Path.Combine(outSrcDir, @"bin\hamcore.se2"), true, false); // Copy Crosslibs IO.CopyDir(Path.Combine(this.CrossLibBaseDir, this.CrossLibName), Path.Combine(outSrcDir, @"lib"), delegate(FileInfo fi) { if (fi.DirectoryName.IndexOf(@".svn", StringComparison.InvariantCultureIgnoreCase) != -1) { return(false); } return(true); }, false, true, true, false); // Generate Makefile for compilation byte[] makeFileDataForCross = Str.NormalizeCrlf(Str.Utf8Encoding.GetBytes(GenerateMakeFileForCompile(outSrcDir, debugMode, true).ToString()), new byte[] { 10, }); byte[] makeFileDataForSelf = Str.NormalizeCrlf(Str.Utf8Encoding.GetBytes(GenerateMakeFileForCompile(outSrcDir, debugMode, false).ToString()), new byte[] { 10, }); string makeFileName = Path.Combine(outSrcDir, "Makefile"); File.WriteAllBytes(makeFileName, makeFileDataForCross); // TimeStamp.txt File.WriteAllText(tsFile, timeStamp); // Create a tar.gz string tarGzFileName = Path.Combine(outSrcDir, this.SrcKitFileName); Con.WriteLine("Creating '{0}'...", tarGzFileName); List <string> files = new List <string>(); foreach (string srcDirName in Util.CombineArray <string>(SrcDirNameList, new string[] { "lib" })) { string dirFullPath = Path.Combine(outSrcDir, srcDirName); string[] fileList = Directory.GetFiles(dirFullPath, "*", srcDirName.Equals("lib", StringComparison.InvariantCultureIgnoreCase) ? SearchOption.TopDirectoryOnly : SearchOption.AllDirectories); foreach (string fileName in fileList) { files.Add(fileName); } } files.Add(Path.Combine(outSrcDir, @"CurrentBuild.txt")); files.Add(Path.Combine(outSrcDir, @"bin\hamcore.se2")); files.Add(Path.Combine(outSrcDir, @"Replace.h")); files.Add(Path.Combine(outSrcDir, @"GlobalConst.h")); files.Sort(); TarPacker tar = new TarPacker(); foreach (string file in files) { byte[] fileData = File.ReadAllBytes(file); tar.AddFileSimple(@"src\" + IO.GetRelativeFileName(file, outSrcDir), fileData, 0, fileData.Length, File.GetLastWriteTime(file), "0000750", "0000640"); } tar.AddFileSimple(@"src\Makefile", makeFileDataForSelf, 0, makeFileDataForSelf.Length, DateTime.Now, "0000750", "0000640"); tar.Finish(); byte[] tarGzData = tar.CompressToGZip(); File.WriteAllBytes(tarGzFileName, tarGzData); IO.MakeDir(Paths.ReleaseSrckitDir); File.WriteAllBytes(Path.Combine(Paths.ReleaseSrckitDir, this.SrcKitFileName), tarGzData); Con.WriteLine("Completed."); return(true); }
public void Run(string[] args) { string SDKdir = null; string specificSampleName = null; RunMode mode = RunMode.Invalid; foreach (var arg in args) { string singlePrefix = "/single:"; if (arg.StartsWith(singlePrefix, StringComparison.InvariantCultureIgnoreCase)) { mode = RunMode.SingleSample; specificSampleName = arg.Substring(singlePrefix.Length); } else if (arg.StartsWith("/")) { mode = Enum.GetValues(typeof(RunMode)).OfType <RunMode>().First(v => v.ToString().ToLower() == arg.Substring(1).ToLower()); } else { SDKdir = arg; } } if (SDKdir == null || mode == RunMode.Invalid) { Console.WriteLine($"Usage: {Path.GetFileName(Assembly.GetEntryAssembly().Location)} <mode> <SW package directory>"); Console.WriteLine($"Modes:"); Console.WriteLine($" /incremental - Only retest/rebuild previously failed samples."); Console.WriteLine($" This doesn't update the BSP archive."); Console.WriteLine($" /release - Reuse cached definitions, retest all samples. Update BSP."); Console.WriteLine($" /cleanRelease - Reparse/retest all samples. Update BSP."); Console.WriteLine($" /updateErrors - Re-categorize errors based on KnownProblems.xml"); Console.WriteLine($" /single:<name> - Run all phases of just one sample."); Console.WriteLine($"Press any key to continue..."); Console.ReadKey(); Environment.ExitCode = 1; return; } if (mode == RunMode.Incremental) { Console.WriteLine("*********************** WARNING ************************"); Console.WriteLine("* Vendor sample parser is running in incremental mode. *"); Console.WriteLine("* Only retested samples will be saved to BSP! *"); Console.WriteLine("* Re-run in /release mode to build a releasable BSP. *"); Console.WriteLine("********************************************************"); } if (mode == RunMode.UpdateErrors) { foreach (var rec in _Report.Records) { } XmlTools.SaveObject(_Report, ReportFile); return; } string archiveName = string.Format("{0}-{1}.vgdbxbsp", BSP.BSP.PackageID.Split('.').Last(), BSP.BSP.PackageVersion); string archiveFilePath = Path.Combine(BSPDirectory, archiveName); if (File.Exists(archiveFilePath)) { File.Delete(archiveFilePath); } string sampleListFile = Path.Combine(CacheDirectory, "Samples.xml"); var sampleDir = BuildOrLoadSampleDirectoryAndUpdateReportForFailedSamples(sampleListFile, SDKdir, mode, specificSampleName); Dictionary <VendorSampleID, string> encounteredIDs = new Dictionary <VendorSampleID, string>(); foreach (var vs in sampleDir.Samples) { var id = new VendorSampleID(vs); if (encounteredIDs.TryGetValue(id, out var dir)) { throw new Exception("Duplicate sample for " + id); } encounteredIDs[new VendorSampleID(vs)] = vs.Path; var rec = _Report.ProvideEntryForSample(new VendorSampleID(vs)); if (rec.LastSucceededPass < VendorSamplePass.InitialParse) { rec.LastSucceededPass = VendorSamplePass.InitialParse; } } //We cache unadjusted sample definitions to allow tweaking the adjusting code without the need to reparse everything. Console.WriteLine("Adjusting sample properties..."); foreach (var vs in sampleDir.Samples) { AdjustVendorSampleProperties(vs); if (vs.Path == null) { throw new Exception("Missing sample path for " + vs.UserFriendlyName); } } VendorSample[] pass1Queue, insertionQueue; switch (mode) { case RunMode.Incremental: pass1Queue = insertionQueue = sampleDir.Samples.Where(s => _Report.ShouldBuildIncrementally(new VendorSampleID(s), VendorSamplePass.InPlaceBuild)).ToArray(); break; case RunMode.Release: insertionQueue = sampleDir.Samples; if (sampleDir.Samples.FirstOrDefault(s => s.AllDependencies != null) == null) { pass1Queue = sampleDir.Samples; } else { pass1Queue = new VendorSample[0]; } break; case RunMode.CleanRelease: pass1Queue = insertionQueue = sampleDir.Samples; break; case RunMode.SingleSample: pass1Queue = insertionQueue = sampleDir.Samples.Where(s => new VendorSampleID(s).ToString() == specificSampleName).ToArray(); if (pass1Queue.Length == 0) { throw new Exception("No samples match " + specificSampleName); } break; default: throw new Exception("Invalid run mode"); } if (pass1Queue.Length > 0) { //Test the raw VendorSamples in-place and store AllDependencies TestVendorSamplesAndUpdateReportAndDependencies(pass1Queue, null, VendorSamplePass.InPlaceBuild, vs => _Report.HasSampleFailed(new VendorSampleID(vs))); foreach (var vs in pass1Queue) { if (vs.Path == null) { throw new Exception("Missing sample path for " + vs.UserFriendlyName); } } sampleDir.ToolchainDirectory = ToolchainDirectory; sampleDir.BSPDirectory = Path.GetFullPath(BSPDirectory); XmlTools.SaveObject(sampleDir, sampleListFile); } //Insert the samples into the generated BSP var relocator = CreateRelocator(sampleDir); relocator.InsertVendorSamplesIntoBSP(sampleDir, insertionQueue, BSPDirectory); var bsp = XmlTools.LoadObject <BoardSupportPackage>(Path.Combine(BSPDirectory, LoadedBSP.PackageFileName)); bsp.VendorSampleDirectoryPath = VendorSampleDirectoryName; bsp.VendorSampleCatalogName = VendorSampleCatalogName; XmlTools.SaveObject(bsp, Path.Combine(BSPDirectory, LoadedBSP.PackageFileName)); if (mode != RunMode.Incremental && mode != RunMode.SingleSample) { Console.WriteLine("Creating new BSP archive..."); string statFile = Path.ChangeExtension(archiveName, ".xml"); TarPacker.PackDirectoryToTGZ(BSPDirectory, archiveFilePath, fn => Path.GetExtension(fn).ToLower() != ".vgdbxbsp" && Path.GetFileName(fn) != statFile); } var vendorSampleListInBSP = Path.Combine(BSPDirectory, VendorSampleDirectoryName, "VendorSamples.xml"); // Finally verify that everything builds var expandedSamples = XmlTools.LoadObject <VendorSampleDirectory>(vendorSampleListInBSP); expandedSamples.Path = Path.GetFullPath(Path.Combine(BSPDirectory, VendorSampleDirectoryName)); var finalStats = TestVendorSamplesAndUpdateReportAndDependencies(expandedSamples.Samples, expandedSamples.Path, VendorSamplePass.RelocatedBuild); XmlTools.SaveObject(_Report, ReportFile); if (mode == RunMode.Incremental || mode == RunMode.SingleSample) { Console.WriteLine($"Deleting incomplete {vendorSampleListInBSP}...\n***Re-run in /release mode to produce a valid BSP."); File.Delete(vendorSampleListInBSP); //Incremental mode only places the samples that are currently built. } if (finalStats.Failed == 0) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"All {finalStats.Total} tests passed during final pass."); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"{finalStats.Failed} out of {finalStats.Total} tests failed during final pass."); } Console.ResetColor(); Console.WriteLine("============================================="); Console.WriteLine($"Overall statistics for v{BSP.BSP.PackageVersion}:"); List <KeyValuePair <string, string> > fields = new List <KeyValuePair <string, string> >(); fields.Add(new KeyValuePair <string, string>("Total samples discovered:", sampleDir.Samples.Length.ToString())); int unparsableSamples = _Report.Records.Count(r => r.LastSucceededPass == VendorSamplePass.None); int failedAtFirstBuild = _Report.Records.Count(r => r.LastSucceededPass == VendorSamplePass.InitialParse && r.BuildFailedExplicitly); int failedAtSecondBuild = _Report.Records.Count(r => r.LastSucceededPass == VendorSamplePass.InPlaceBuild && r.BuildFailedExplicitly); fields.Add(new KeyValuePair <string, string>("Failed during initial parse attempt:", $"{unparsableSamples}/{sampleDir.Samples.Length} ({unparsableSamples * 100.0 / sampleDir.Samples.Length:f1}%)")); fields.Add(new KeyValuePair <string, string>("Failed during in-place build:", $"{failedAtFirstBuild}/{sampleDir.Samples.Length} ({failedAtFirstBuild * 100.0 / sampleDir.Samples.Length:f1}%)")); fields.Add(new KeyValuePair <string, string>("Failed during relocated build:", $"{failedAtSecondBuild}/{sampleDir.Samples.Length} ({failedAtSecondBuild * 100.0 / sampleDir.Samples.Length:f1}%)")); if (mode != RunMode.Incremental) { fields.Add(new KeyValuePair <string, string>("Inserted into BSP:", expandedSamples.Samples.Length.ToString())); } OutputKeyValueList(fields); if (finalStats.Failed > 0 && mode != RunMode.Incremental) { throw new Exception("Some of the vendor samples have failed the final test. Fix this before releasing the BSP."); } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); }
static void Main(string[] args) { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; if (args.Length < 2) { throw new Exception("Usage: TestFrameworkGenerator <Rules subdir> <Source directory>"); } var dummyBSPBuilder = new DummyBSPBuilder(new BSPDirectories(args[1], @"..\..\Output\" + args[0], @"..\..\rules\" + args[0])); if (Directory.Exists(dummyBSPBuilder.Directories.OutputDir)) { Directory.Delete(dummyBSPBuilder.Directories.OutputDir, true); } Directory.CreateDirectory(dummyBSPBuilder.Directories.OutputDir); var fwObj = XmlTools.LoadObject <TestFrameworkDefinition>(Path.Combine(dummyBSPBuilder.Directories.RulesDir, "TestFramework.xml")); dummyBSPBuilder.FrameworkID = fwObj.ID; var rules = XmlTools.LoadObject <TestFrameworkRules>(Path.Combine(dummyBSPBuilder.Directories.RulesDir, "rules.xml")); List <string> projectFiles = new List <string>(); ToolFlags flags = new ToolFlags(); if (fwObj.Common == null) { fwObj.Common = new TestFrameworkDefinition.TestPlatformBuild(); } foreach (var job in rules.CopyJobs) { flags = flags.Merge(job.CopyAndBuildFlags(dummyBSPBuilder, projectFiles, null, ref fwObj.Common.ConfigurableProperties, null)); } Dictionary <string, FileCondition> matchedConditions = new Dictionary <string, FileCondition>(StringComparer.InvariantCultureIgnoreCase); foreach (var cond in dummyBSPBuilder.MatchedFileConditions) { matchedConditions[cond.FilePath] = cond; } var platformIndepenentFiles = projectFiles.Where(f => !matchedConditions.ContainsKey(f)).ToList(); List <string> embeddedFiles = new List <string>(); List <string> linuxFiles = new List <string>(); foreach (var f in projectFiles) { FileCondition cond; if (matchedConditions.TryGetValue(f, out cond)) { var eq = (cond.ConditionToInclude as Condition.Equals); if (eq?.Expression == "$$platform$$") { dummyBSPBuilder.MatchedFileConditions.Remove(cond); switch (eq.ExpectedValue) { case "embedded": embeddedFiles.Add(f); break; case "linux": linuxFiles.Add(f); break; default: throw new Exception("Invalid platform condition"); } } else if (!platformIndepenentFiles.Contains(f)) { platformIndepenentFiles.Add(f); } } } fwObj.Common.AdditionalSourceFiles = platformIndepenentFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).Select(f => dummyBSPBuilder.MakeRelativePath(f)).ToArray(); fwObj.Common.AdditionalHeaderFiles = platformIndepenentFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).Select(f => dummyBSPBuilder.MakeRelativePath(f)).ToArray(); fwObj.Common.AdditionalIncludeDirs = flags.IncludeDirectories?.Select(f => dummyBSPBuilder.MakeRelativePath(f))?.ToArray(); fwObj.Common.AdditionalPreprocessorMacros = flags.PreprocessorMacros?.Select(f => dummyBSPBuilder.MakeRelativePath(f))?.ToArray(); if (fwObj.Embedded != null) { fwObj.Embedded.AdditionalSourceFiles = embeddedFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).Select(f => dummyBSPBuilder.MakeRelativePath(f)).ToArray(); fwObj.Embedded.AdditionalHeaderFiles = embeddedFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).Select(f => dummyBSPBuilder.MakeRelativePath(f)).ToArray(); fwObj.Embedded.AdditionalIncludeDirs = fwObj.Embedded.AdditionalIncludeDirs?.Select(f => dummyBSPBuilder.MakeRelativePath(f))?.ToArray(); } if (fwObj.Linux != null) { fwObj.Linux.AdditionalSourceFiles = linuxFiles.Where(f => !MCUFamilyBuilder.IsHeaderFile(f)).Select(f => dummyBSPBuilder.MakeRelativePath(f)).ToArray(); fwObj.Linux.AdditionalHeaderFiles = linuxFiles.Where(f => MCUFamilyBuilder.IsHeaderFile(f)).Select(f => dummyBSPBuilder.MakeRelativePath(f)).ToArray(); fwObj.Linux.AdditionalIncludeDirs = fwObj.Linux.AdditionalIncludeDirs?.Select(f => dummyBSPBuilder.MakeRelativePath(f))?.ToArray(); } foreach (var cond in dummyBSPBuilder.MatchedFileConditions) { cond.FilePath = dummyBSPBuilder.MakeRelativePath(cond.FilePath); //Substitute $$SYS:BSP_ROOT$$ with $$SYS:TESTFW_BASE$$/... } fwObj.FileConditions = dummyBSPBuilder.MatchedFileConditions.ToArray(); CopyAndAdjustSamples(dummyBSPBuilder, fwObj.Embedded.Samples); CopyAndAdjustSamples(dummyBSPBuilder, fwObj.Common.Samples); XmlTools.SaveObject(fwObj, Path.Combine(dummyBSPBuilder.Directories.OutputDir, "TestFramework.xml")); string outDir = dummyBSPBuilder.Directories.OutputDir; string archiveName = $"{fwObj.ID.Split('.').Last()}-{fwObj.Version}.vgdbxtfp"; Console.WriteLine("Building archive..."); string archiveFile = Path.Combine(dummyBSPBuilder.Directories.OutputDir, archiveName); TarPacker.PackDirectoryToTGZ(outDir, archiveFile, fn => Path.GetExtension(fn).ToLower() != ".vgdbxtfp"); }
/* * PropertyList ConfigurableProperties= new PropertyList * { * PropertyGroups = new List<PropertyGroup> * { * new PropertyGroup * { * Properties = new List<PropertyEntry> * { * new PropertyEntry.Enumerated * { * Name = "Execute from", * UniqueID = PrimaryMemoryOptionName, * SuggestionList = new PropertyEntry.Enumerated.Suggestion[] * { * new PropertyEntry.Enumerated.Suggestion{InternalValue = "flash", UserFriendlyName = "FLASH"}, * new PropertyEntry.Enumerated.Suggestion{InternalValue = "sram", UserFriendlyName = "SRAM"}, * } * } * } * } * } */ //------------------------------------------------ static void Main(string[] args) { string tempDir; SDKdir = args[0]; tempDir = args[1]; string bspDir = SDKdir + @"\esp32-bsp"; //@"..\..\..\..\generators\Esp32\output"; const string bspRules = @"..\..\..\..\generators\Esp32\Rules"; if (args.Length > 2) { if (args[2] == "KConfig") { //Generate sdkconfig from KConfig CLParserKConfig.ParserAllFilesKConfig(bspDir); //CLParserKConfig.SdkconfigChangeMacros(@"C:\SysGCC\esp32\esp32-bsp\sysprogs\samples\01_Hello_world\sdkconfig.h"); CLParserKConfig.GenerateSdkconfigFile(); return; } } if (args.Length < 2) { throw new Exception("Usage: Esp32VendorSampleParser <Toolchain ESP32 Dir> <TestDir>"); } string sampleListFile = Path.Combine(outputDir, "samples.xml"); var sampleDir = BuildOrLoadSampleDirectory(SDKdir, outputDir, sampleListFile); if (sampleDir.Samples.FirstOrDefault(s => s.AllDependencies != null) == null) { //Perform Pass 1 testing - test the raw VendorSamples in-place StandaloneBSPValidator.Program.TestVendorSamples(sampleDir, bspDir, tempDir, 1, true); foreach (var smp in sampleDir.Samples) { if (smp.AllDependencies == null) { Console.WriteLine(smp.UserFriendlyName + "no dependes"); } else { for (int cntdep = 0; cntdep < smp.AllDependencies.Count(); cntdep++) { if (smp.AllDependencies[cntdep].StartsWith("/")) { smp.AllDependencies[cntdep] = smp.AllDependencies[cntdep].Replace("/usr/lib/", SDKdir + "/lib/");// @"c:/SysGCC/esp32/"); } if (smp.AllDependencies[cntdep].StartsWith("/")) { smp.AllDependencies[cntdep] = SDKdir + smp.AllDependencies[cntdep]; } } } } sampleDir.ToolchainDirectory = sampleDir.ToolchainDirectory.Replace('/', '\\'); XmlTools.SaveObject(sampleDir, sampleListFile); } //Insert the samples into the generated BSP var relocator = new Esp32SampleRelocator(); relocator.InsertVendorSamplesEsp32IntoBSP(sampleDir, bspDir); var bsp = XmlTools.LoadObject <BoardSupportPackage>(Path.Combine(bspDir, "bsp.xml")); bsp.VendorSampleDirectoryPath = "VendorSamples"; bsp.VendorSampleCatalogName = "ESP32 SDK Samples"; XmlTools.SaveObject(bsp, Path.Combine(bspDir, "bsp.xml")); string archiveName = string.Format("{0}-{1}.vgdbxbsp", bsp.PackageID.Split('.').Last(), bsp.PackageVersion); string statFile = Path.ChangeExtension(archiveName, ".xml"); TarPacker.PackDirectoryToTGZ(bspDir, Path.Combine(bspDir, archiveName), fn => Path.GetExtension(fn).ToLower() != ".vgdbxbsp" && Path.GetFileName(fn) != statFile); var expandedSamples = XmlTools.LoadObject <VendorSampleDirectory>(Path.Combine(bspDir, "VendorSamples", "VendorSamples.xml")); expandedSamples.Path = Path.GetFullPath(Path.Combine(bspDir, "VendorSamples")); var result = StandaloneBSPValidator.Program.TestVendorSamples(expandedSamples, bspDir, tempDir, 1, true); if (result.Failed > 0) { throw new Exception("Some of the vendor samples failed to build. Check the build log."); } }
public static byte[] PackFiles(PackerFileFormat format, string[] srcFileNameList, string[] relativeNameList, ProgressDelegate?proc = null) { if (srcFileNameList.Length != relativeNameList.Length) { throw new ApplicationException("srcFileNameList.Length != relativeNameList.Length"); } int num = srcFileNameList.Length; int i; ZipPacker zip = new ZipPacker(); TarPacker tar = new TarPacker(); for (i = 0; i < num; i++) { if (proc != null) { bool ret = proc(srcFileNameList[i], relativeNameList[i], i, num); if (ret == false) { continue; } } byte[] srcData = IO.ReadFile(srcFileNameList[i]); DateTime date = File.GetLastWriteTime(srcFileNameList[i]); switch (format) { case PackerFileFormat.Tar: case PackerFileFormat.TarGZip: tar.AddFileSimple(relativeNameList[i], srcData, 0, srcData.Length, date); break; case PackerFileFormat.ZipRaw: case PackerFileFormat.ZipCompressed: zip.AddFileSimple(relativeNameList[i], date, FileAttributes.Normal, srcData, (format == PackerFileFormat.ZipCompressed)); break; } } switch (format) { case PackerFileFormat.Tar: tar.Finish(); return(tar.GeneratedData.Read()); case PackerFileFormat.TarGZip: tar.Finish(); return(tar.CompressToGZip()); case PackerFileFormat.ZipCompressed: case PackerFileFormat.ZipRaw: zip.Finish(); return(zip.GeneratedData.Read()); default: throw new ApplicationException("format"); } }