// 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);
        }
Example #3
0
        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();
        }
Example #4
0
        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");
        }
Example #5
0
        /*
         * 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.");
            }
        }
Example #6
0
    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");
        }
    }