private static void ApplyConfiguration(Dictionary<string, string> dict, PropertyDictionary2 values, PropertyDictionary2 values2 = null) { if (values?.Entries != null) foreach (var kv in values.Entries) dict[kv.Key] = kv.Value; if (values2?.Entries != null) foreach (var kv in values2.Entries) dict[kv.Key] = kv.Value; }
//STM32CubeMX v5.3.0 does not reference some of the FreeRTOS-specific files and references an incorrect system file. //The method below detects and fixes this condition. static void ApplyFreeRTOSFixes(ImportedExternalProject.ConstructedVirtualDirectory dir, HashSet <string> includeDirs, ref PropertyDictionary2 mcuConfiguration) { List <FlatFileReference> allFiles = new List <FlatFileReference>(); FillFlatFileCollectionRecursively(dir, allFiles); var fileListsByName = allFiles.GroupBy(f => Path.GetFileName(f.File.FullPath), StringComparer.InvariantCultureIgnoreCase).ToDictionary(g => g.Key, StringComparer.InvariantCultureIgnoreCase); if (!fileListsByName.TryGetValue("queue.c", out var queueFiles) || queueFiles.Count() == 0) { return; //Could not find the FreeRTOS base directory } var queueCFile = queueFiles.First(); string baseDir = Path.GetFullPath(Path.GetDirectoryName(queueCFile.File.FullPath)); string portFile = FindAndAddFileIfMissing(fileListsByName, "port.c", Path.Combine(baseDir, "portable"), queueCFile.Directory, includeDirs); FindAndAddFileIfMissing(fileListsByName, "cmsis_os.c", baseDir, queueCFile.Directory, includeDirs); foreach (var file in fileListsByName.SelectMany(g => g.Value)) { if (Path.GetFileName(file.File.FullPath).StartsWith("system_stm32", StringComparison.InvariantCultureIgnoreCase) && !File.Exists(file.File.FullPath)) { //Found an incorrectly referenced system file (typically Source\Templates\system_stm32f7xx.c). Replace it with the real path. string foundReplacement = null; foreach (var f2 in fileListsByName.SelectMany(g => g.Value)) { string candidatePath = Path.Combine(Path.GetDirectoryName(f2.File.FullPath), Path.GetFileName(file.File.FullPath)); if (File.Exists(candidatePath)) { foundReplacement = candidatePath; break; } } if (foundReplacement != null) { file.File.FullPath = foundReplacement; } } } if (portFile != null) { string relPath = portFile.Substring(baseDir.Length); if (relPath.Contains("ARM_CM7") || relPath.Contains("ARM_CM4F")) { if (mcuConfiguration == null) { mcuConfiguration = new PropertyDictionary2(); } if (mcuConfiguration.Entries == null) { mcuConfiguration.Entries = new PropertyDictionary2.KeyValue[0]; } mcuConfiguration.Entries = mcuConfiguration.Entries.Concat(new[] { new PropertyDictionary2.KeyValue { Key = "com.sysprogs.bspoptions.arm.floatmode", Value = "-mfloat-abi=hard" } }).ToArray(); } } }
protected virtual VendorSampleConfiguration DetectKnownFrameworksAndFilterPaths(ref string[] sources, ref string[] headers, ref string[] includeDirs, ref ParsedDependency[] dependencies, PropertyDictionary2 mcuConfiguration) { List <AutoDetectedFramework> matchedFrameworks = new List <AutoDetectedFramework>(); foreach (var fw in AutoDetectedFrameworks) { if (sources?.FirstOrDefault(s => fw.FileRegex.IsMatch(s) && !fw.DisableTriggerRegex.IsMatch(s)) != null) { fw.FindAndFilterOut(ref sources); fw.FindAndFilterOut(ref headers); fw.FindAndFilterOut(ref includeDirs); fw.FindAndFilterOut(ref dependencies, d => d.MappedFile); matchedFrameworks.Add(fw); } } foreach (var map in AutoPathMappings) { map.MapArray(ref sources); map.MapArray(ref headers); map.MapArray(ref includeDirs); for (int i = 0; i < dependencies.Length; i++) { if (dependencies[i].MappedFile != null && map.TryMap(dependencies[i].MappedFile) != null) { dependencies[i].MappedFile = null; } } } dependencies = dependencies.Where(d => d.MappedFile != null).ToArray(); return(new VendorSampleConfiguration { Frameworks = matchedFrameworks.Select(f => f.FrameworkID).Distinct().ToArray(), Configuration = new PropertyDictionary2 { Entries = matchedFrameworks.SelectMany(f => f.Configuration).Select(kv => new PropertyDictionary2.KeyValue { Key = kv.Key, Value = kv.Value }).ToArray() }, MCUConfiguration = mcuConfiguration }); }
public static TestStatistics TestVendorSamples(VendorSampleDirectory samples, string bspDir, string temporaryDirectory, double testProbability = 1, bool esp32 = false) { string defaultToolchainID = "SysGCC-arm-eabi-6.2.0"; flEsp32 = false; if (esp32) { defaultToolchainID = "SysGCC-xtensa-esp32-elf-5.2.0"; flEsp32 = true; } var toolchainPath = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(defaultToolchainID); if (toolchainPath == null) { throw new Exception("Cannot locate toolchain path from registry"); } var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(toolchainPath))); var bsp = LoadedBSP.Load(new BSPEngine.BSPSummary(Environment.ExpandEnvironmentVariables(Path.GetFullPath(bspDir))), toolchain); if (flEsp32) { toolchainPath = toolchainPath.Replace('\\', '/'); //esp32 } TestStatistics stats = new TestStatistics(); int cnt = 0, failed = 0, succeeded = 0; LoadedBSP.LoadedMCU[] MCUs = bsp.MCUs.ToArray(); string outputDir = Path.Combine(temporaryDirectory, "VendorSamples"); if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } int sampleCount = samples.Samples.Length; Random rng = new Random(); using (var r = new TestResults(Path.Combine(temporaryDirectory, "bsptest.log"))) { r.BeginSample("Vendor Samples"); foreach (var vs in samples.Samples) { LoadedBSP.LoadedMCU mcu; try { var rgFilterID = new Regex(vs.DeviceID.Replace('x', '.'), RegexOptions.IgnoreCase); mcu = bsp.MCUs.Where(f => rgFilterID.IsMatch(f.ExpandedMCU.ID)).ToArray()?.First(); vs.DeviceID = mcu.ExpandedMCU.ID; } catch (Exception ex) { r.ExceptionSample(ex.Message, "mcu " + vs.DeviceID + " not found in bsp"); Console.WriteLine("bsp have not mcu:" + vs.DeviceID); continue; } if (testProbability < 1 && rng.NextDouble() > testProbability) { cnt++; continue; } string mcuDir = Path.Combine(temporaryDirectory, "VendorSamples", vs.UserFriendlyName); mcuDir += $"-{mcu.ExpandedMCU.ID}"; if (!Directory.Exists(mcuDir)) { Directory.CreateDirectory(mcuDir); } DateTime start = DateTime.Now; string[] hwSubstrings = new[] { @"\ARM_CM4F\port.c", @"ARM_CM7\r0p1\port.c", @"CM4_GCC.a", }; if (vs.SourceFiles.FirstOrDefault(f => ContainsAnySubstrings(f, hwSubstrings)) != null) { if (vs.Configuration.MCUConfiguration != null) { var dict = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.MCUConfiguration); dict["com.sysprogs.bspoptions.arm.floatmode"] = "-mfloat-abi=hard"; vs.Configuration.MCUConfiguration = new PropertyDictionary2 { Entries = dict.Select(kv => new PropertyDictionary2.KeyValue { Key = kv.Key, Value = kv.Value }).ToArray() }; } else { vs.Configuration.MCUConfiguration = new PropertyDictionary2 { Entries = new PropertyDictionary2.KeyValue[] { new PropertyDictionary2.KeyValue { Key = "com.sysprogs.bspoptions.arm.floatmode", Value = "-mfloat-abi=hard" } } }; } } vs.SourceFiles = vs.SourceFiles.Where(s => !IsNonGCCFile(vs, s)).ToArray(); var result = TestVendorSample(mcu, vs, mcuDir, samples); Console.WriteLine($"[{(DateTime.Now - start).TotalMilliseconds:f0} msec]"); if (result == TestResult.Failed) { failed++; } else if (result == TestResult.Succeeded) { succeeded++; } r.LogTestResult(vs.UserFriendlyName, result); cnt++; Console.WriteLine("{0}: {1}% done ({2}/{3} projects, {4} failed)", vs.UserFriendlyName, (cnt * 100) / sampleCount, cnt, sampleCount, failed); } r.EndSample(); } stats.Passed += succeeded; stats.Failed += failed; if (samples is ConstructedVendorSampleDirectory) { (samples as ConstructedVendorSampleDirectory).ToolchainDirectory = toolchainPath; (samples as ConstructedVendorSampleDirectory).BSPDirectory = Path.GetFullPath(bspDir); } return(stats); }
private static void ApplyConfiguration(Dictionary <string, string> dict, PropertyDictionary2 values, PropertyDictionary2 values2 = null) { if (values?.Entries != null) { foreach (var kv in values.Entries) { dict[kv.Key] = kv.Value; } } if (values2?.Entries != null) { foreach (var kv in values2.Entries) { dict[kv.Key] = kv.Value; } } }
public static TestResult TestVendorSampleAndUpdateDependencies(LoadedBSP.LoadedMCU mcu, VendorSample vs, string mcuDir, string sampleDirPath, bool codeRequiresDebugInfoFlag, bool keepDirectoryAfterSuccessfulBuild) { if (Directory.Exists(mcuDir)) { Directory.Delete(mcuDir, true); } Directory.CreateDirectory(mcuDir); var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties)); configuredMCU.Configuration["com.sysprogs.toolchainoptions.arm.libnosys"] = "--specs=nosys.specs"; if (configuredMCU.ExpandedMCU.FLASHSize == 0) { configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram"; } var entries = vs.Configuration.MCUConfiguration?.Entries; if (entries != null) { foreach (var e in entries) { configuredMCU.Configuration[e.Key] = e.Value; } } var bspDict = configuredMCU.BuildSystemDictionary(default(SystemDirectories)); bspDict["PROJECTNAME"] = "test"; if (sampleDirPath != null) { bspDict["SYS:VSAMPLE_DIR"] = sampleDirPath; } var prj = new GeneratedProject(configuredMCU, vs, mcuDir, bspDict, vs.Configuration.Frameworks ?? new string[0]); var projectCfg = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.MCUConfiguration); var frameworkCfg = PropertyDictionary2.ReadPropertyDictionary(vs.Configuration.Configuration); foreach (var k in projectCfg.Keys) { bspDict[k] = projectCfg[k]; } var frameworkIDs = vs.Configuration.Frameworks?.ToDictionary(fw => fw, fw => true); prj.AddBSPFilesToProject(bspDict, frameworkCfg, frameworkIDs); var flags = prj.GetToolFlags(bspDict, frameworkCfg, frameworkIDs); if (flags.LinkerScript != null && !Path.IsPathRooted(flags.LinkerScript)) { flags.LinkerScript = Path.Combine(VariableHelper.ExpandVariables(vs.Path, bspDict, frameworkCfg), flags.LinkerScript).Replace('\\', '/'); } //ToolFlags flags = new ToolFlags { CXXFLAGS = " ", COMMONFLAGS = "-mcpu=cortex-m3 -mthumb", LDFLAGS = "-Wl,-gc-sections -Wl,-Map," + "test.map", CFLAGS = "-ffunction-sections -Os -MD" }; if (!string.IsNullOrEmpty(vs.CLanguageStandard)) { flags.CFLAGS += $" -std={vs.CLanguageStandard}"; } if (!string.IsNullOrEmpty(vs.CPPLanguageStandard)) { flags.CXXFLAGS += $" -std={vs.CPPLanguageStandard}"; } flags.CFLAGS += " -MD"; flags.CXXFLAGS += " -MD"; if (codeRequiresDebugInfoFlag) { flags.CFLAGS += " -ggdb"; flags.CXXFLAGS += " -ggdb"; } flags.IncludeDirectories = LoadedBSP.Combine(flags.IncludeDirectories, vs.IncludeDirectories).Distinct().ToArray(); flags.PreprocessorMacros = LoadedBSP.Combine(flags.PreprocessorMacros, vs.PreprocessorMacros); flags.LDFLAGS = flags.LDFLAGS + " " + vs.LDFLAGS; flags = LoadedBSP.ConfiguredMCU.ExpandToolFlags(flags, bspDict, null); Dictionary <string, bool> sourceExtensions = new Dictionary <string, bool>(StringComparer.InvariantCultureIgnoreCase); sourceExtensions.Add("c", true); sourceExtensions.Add("cpp", true); sourceExtensions.Add("s", true); return(BuildAndRunValidationJob(mcu, mcuDir, false, null, prj, flags, sourceExtensions, null, null, vs, keepDirectoryAfterSuccessfulBuild)); }