public static TestStatistics TestBSP(TestJob job, LoadedBSP bsp, string temporaryDirectory) { TestStatistics stats = new TestStatistics(); Directory.CreateDirectory(temporaryDirectory); using (var r = new TestResultLogger(Path.Combine(temporaryDirectory, "bsptest.log"))) { LoadedBSP.LoadedMCU[] MCUs; if (job.DeviceRegex == null) { MCUs = bsp.MCUs.ToArray(); } else { var rgFilter = new Regex(job.DeviceRegex); MCUs = bsp.MCUs.Where(mcu => rgFilter.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } if (job.SkippedDeviceRegex != null) { var rg = new Regex(job.SkippedDeviceRegex); MCUs = MCUs.Where(mcu => !rg.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } var loadedRules = job.RegisterRenamingRules?.Select(rule => new LoadedRenamingRule(rule))?.ToArray(); var noValidateReg = job.NonValidatedRegisters; foreach (var sample in job.Samples) { r.BeginSample(sample.Name); int cnt = 0, failed = 0, succeeded = 0; var effectiveMCUs = MCUs; if (!string.IsNullOrEmpty(sample.DeviceRegex)) { Regex rgDevice = new Regex(sample.DeviceRegex); effectiveMCUs = MCUs.Where(mcu => rgDevice.IsMatch(mcu.ExpandedMCU.ID)).ToArray(); } if (sample.Name == "ValidateGenerateFramwoks") { var sampleFramwork = XmlTools.LoadObject <EmbeddedProjectSample>(Path.Combine(job.BSPPath, "FramworkSamples", "sample.xml")); LoadedBSP.LoadedSample sampleObj1 = new LoadedBSP.LoadedSample() { Sample = sampleFramwork }; effectiveMCUs[0].BSP.Samples.Add(sampleObj1); effectiveMCUs[0].BSP.Samples[effectiveMCUs[0].BSP.Samples.Count - 1].Directory = effectiveMCUs[0].BSP.Samples[effectiveMCUs[0].BSP.Samples.Count - 2].Directory.Remove(effectiveMCUs[0].BSP.Samples[effectiveMCUs[0].BSP.Samples.Count - 2].Directory.LastIndexOf("samples")) + "FramworkSamples"; } foreach (var mcu in effectiveMCUs) { if (string.IsNullOrEmpty(mcu.ExpandedMCU.ID)) { throw new Exception("Invalid MCU ID!"); } var extraParams = job.DeviceParameterSets?.FirstOrDefault(s => s.DeviceRegexObject?.IsMatch(mcu.ExpandedMCU.ID) == true); string mcuDir = Path.Combine(temporaryDirectory, mcu.ExpandedMCU.ID); DateTime start = DateTime.Now; var result = TestMCU(mcu, mcuDir + sample.TestDirSuffix, sample, extraParams, loadedRules, noValidateReg, job.UndefinedMacros); Console.WriteLine($"[{(DateTime.Now - start).TotalMilliseconds:f0} msec]"); if (result.Result == TestBuildResult.Failed) { failed++; } else if (result.Result == TestBuildResult.Succeeded) { succeeded++; } r.LogTestResult(mcu.ExpandedMCU.ID, result); cnt++; Console.WriteLine("{0}: {1}% done ({2}/{3} devices, {4} failed)", sample.Name, (cnt * 100) / effectiveMCUs.Length, cnt, effectiveMCUs.Length, failed); } if ((succeeded + failed) == 0) { throw new Exception("Not a single MCU supports " + sample.Name); } r.EndSample(); stats.Passed += succeeded; stats.Failed += failed; } } return(stats); }
private List <ConfigurationFixDatabase.SecondaryObjectEntry> ComputeSymbolToFileMap(BSPReportWriter reportWriter) { var result = new HashSet <ConfigurationFixDatabase.SecondaryObjectEntry>(); if (_ReverseConditionTable.ConfigurationFixSamples == null) { return(result.ToList()); } Dictionary <string, bool> fileBuildStatus = new Dictionary <string, bool>(); foreach (var sample in _ReverseConditionTable.ConfigurationFixSamples) { var sampleDir = GetFullPath(sample.SamplePath); LoadedBSP.LoadedSample sampleObj = new LoadedBSP.LoadedSample { BSP = _BSP, Directory = sampleDir, Sample = XmlTools.LoadObject <EmbeddedProjectSample>(Path.Combine(sampleDir, "sample.xml")) }; var mcu = _BSP.MCUs.First(m => m.ExpandedMCU.ID == sample.MCUID); List <int> queue = Enumerable.Range(0, _ReverseConditionTable.FileTable.Count).ToList(); while (queue.Count > 0) { Console.WriteLine($"Analyzing {sampleObj.Sample.Name} ({result.Count} symbols mapped, {queue.Count} files left)..."); List <int> rejects = new List <int>(); List <int> handledFiles = new List <int>(); ConstructedConfiguration cfg = new ConstructedConfiguration(_ReverseConditionTable); foreach (var i in queue) { var file = _ReverseConditionTable.FileTable[i]; string ext = Path.GetExtension(file.ObjectName).ToLower(); if (ext != ".c" && ext != ".cpp") { continue; } if (cfg.TryMerge(file)) { handledFiles.Add(i); } else { rejects.Add(i); } } var buildResult = Program.TestSingleSample(sampleObj, mcu, _TestDirectory, cfg.ToSampleJobObject(), null, null, BSPValidationFlags.KeepDirectoryAfterSuccessfulTest | BSPValidationFlags.ContinuePastCompilationErrors); BuildSymbolTableFromBuildResults(handledFiles, result, fileBuildStatus); if (rejects.Count == queue.Count) { break; } queue = rejects; } } foreach (var kv in fileBuildStatus) { if (!kv.Value) { reportWriter.ReportMergeableMessage(BSPReportWriter.MessageSeverity.Warning, "Could not obtain symbol list provided by the following files", kv.Key, false); } } return(result.ToList()); }
public static TestResult TestSingleSample(LoadedBSP.LoadedSample sampleObj, LoadedBSP.LoadedMCU mcu, string testDirectory, TestedSample sample, DeviceParameterSet extraParameters, RegisterValidationParameters registerValidationParameters, BSPValidationFlags validationFlags = BSPValidationFlags.None) { CreateEmptyDirectoryForTestingMCU(testDirectory); var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties)); if (configuredMCU.ExpandedMCU.FLASHSize == 0) { configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram"; } var configuredSample = new ConfiguredSample { Sample = sampleObj, Parameters = GetDefaultPropertyValues(sampleObj.Sample.ConfigurableProperties), Frameworks = (sampleObj.Sample.RequiredFrameworks == null) ? null : sampleObj.Sample.RequiredFrameworks.Select(fwId => { return(configuredMCU.BSP.BSP.Frameworks.First(fwO => fwO.ID == fwId || fwO.ClassID == fwId && fwO.IsCompatibleWithMCU(configuredMCU.ExpandedMCU.ID))); }).ToList(), FrameworkParameters = new Dictionary <string, string>(), }; ApplyConfiguration(configuredMCU.Configuration, extraParameters?.MCUConfiguration, sample.MCUConfiguration); var bspDict = configuredMCU.BuildSystemDictionary(default(SystemDirectories)); bspDict["PROJECTNAME"] = "test"; if (configuredSample.Frameworks != null) { foreach (var fw in configuredSample.Frameworks) { if (fw.AdditionalSystemVars != null) { foreach (var kv in fw.AdditionalSystemVars) { bspDict[kv.Key] = kv.Value; } } if (fw.ConfigurableProperties != null) { var defaultFwConfig = GetDefaultPropertyValues(fw.ConfigurableProperties); if (defaultFwConfig != null) { foreach (var kv in defaultFwConfig) { configuredSample.FrameworkParameters[kv.Key] = kv.Value; } } } } } if (sampleObj.Sample?.DefaultConfiguration?.Entries != null) { foreach (var kv in sampleObj.Sample.DefaultConfiguration.Entries) { configuredSample.FrameworkParameters[kv.Key] = kv.Value; } } ApplyConfiguration(configuredSample.FrameworkParameters, extraParameters?.FrameworkConfiguration, sample.FrameworkConfiguration); ApplyConfiguration(configuredSample.Parameters, extraParameters?.SampleConfiguration, sample.SampleConfiguration); Dictionary <string, bool> frameworkIDs = new Dictionary <string, bool>(); foreach (var fw in sampleObj.Sample.RequiredFrameworks ?? new string[0]) { frameworkIDs[fw] = true; } foreach (var fw in sample.AdditionalFrameworks ?? new string[0]) { frameworkIDs[fw] = true; } var prj = new GeneratedProject(testDirectory, configuredMCU, frameworkIDs.Keys.ToArray()) { DataSections = sample.DataSections }; prj.DoGenerateProjectFromEmbeddedSample(configuredSample, false, bspDict); prj.AddBSPFilesToProject(bspDict, configuredSample.FrameworkParameters, frameworkIDs); var flags = prj.GetToolFlags(bspDict, configuredSample.FrameworkParameters, frameworkIDs); // if(sampleObj.Sample.LinkerScript!=null) // flags.LinkerScript = sampleObj.Sample.LinkerScript; if (!string.IsNullOrEmpty(configuredSample.Sample.Sample.LinkerScript)) { flags.LinkerScript = VariableHelper.ExpandVariables(configuredSample.Sample.Sample.LinkerScript, bspDict, configuredSample.FrameworkParameters); } if (!string.IsNullOrEmpty(configuredSample.Sample.Sample.CLanguageStandard)) { flags.CFLAGS += $" -std={configuredSample.Sample.Sample.CLanguageStandard}"; } if (!string.IsNullOrEmpty(configuredSample.Sample.Sample.CPPLanguageStandard)) { flags.CXXFLAGS += $" -std={configuredSample.Sample.Sample.CPPLanguageStandard}"; } flags.COMMONFLAGS += " -save-temps "; Dictionary <string, bool> sourceExtensions = new Dictionary <string, bool>(StringComparer.InvariantCultureIgnoreCase); foreach (var ext in sample.SourceFileExtensions.Split(';')) { sourceExtensions[ext] = true; } Console.WriteLine("Building {0}...", Path.GetFileName(testDirectory)); return(BuildAndRunValidationJob(mcu, testDirectory, prj, flags, sourceExtensions, null, sample.ValidateRegisters ? registerValidationParameters : null, validationFlags)); }