private static TestResult TestMCU(LoadedBSP.LoadedMCU mcu, string mcuDir, TestedSample sample, DeviceParameterSet extraParameters, RegisterValidationParameters registerValidationParameters) { var samples = mcu.BSP.GetSamplesForMCU(mcu.ExpandedMCU.ID, false); LoadedBSP.LoadedSample sampleObj; if (string.IsNullOrEmpty(sample.Name)) { sampleObj = samples[0]; } else { sampleObj = samples.FirstOrDefault(s => s.Sample.Name == sample.Name); } if (sampleObj == null) { if (sample.SkipIfNotFound) { return(new TestResult(TestBuildResult.Skipped, null)); } else { throw new Exception("Cannot find sample: " + sample.Name); } } return(TestSingleSample(sampleObj, mcu, mcuDir, sample, extraParameters, registerValidationParameters)); }
private static TestResult TestVendorSample(LoadedBSP.LoadedMCU mcu, BSPEngine.VendorSample vs, string mcuDir, VendorSampleDirectory sampleDir) { 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(SystemDirs); bspDict["PROJECTNAME"] = "test"; bspDict["SYS:VSAMPLE_DIR"] = sampleDir.Path; 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); //ToolFlags flags = new ToolFlags { CXXFLAGS = " ", COMMONFLAGS = "-mcpu=cortex-m3 -mthumb", LDFLAGS = "-Wl,-gc-sections -Wl,-Map," + "test.map", CFLAGS = "-ffunction-sections -Os -MD" }; flags.CFLAGS += " -MD"; flags.CXXFLAGS += " -MD"; flags.IncludeDirectories = LoadedBSP.Combine(flags.IncludeDirectories, vs.IncludeDirectories).Distinct().ToArray(); flags.PreprocessorMacros = LoadedBSP.Combine(flags.PreprocessorMacros, vs.PreprocessorMacros); 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)); }
private static TestResult BuildAndRunValidationJob(LoadedBSP.LoadedMCU mcu, string mcuDir, bool validateRegisters, LoadedRenamingRule[] renameRules, GeneratedProject prj, ToolFlags flags, Dictionary <string, bool> sourceExtensions, string[] nonValidateReg, string[] UndefinedMacros, BSPEngine.VendorSample vendorSample = null) { BuildJob job = new BuildJob(); string prefix = string.Format("{0}\\{1}\\{2}-", mcu.BSP.Toolchain.Directory, mcu.BSP.Toolchain.Toolchain.BinaryDirectory, mcu.BSP.Toolchain.Toolchain.GNUTargetID); //esp32 if (flEsp32) { prefix = prefix.Replace('\\', '/'); } job.OtherTasks.Add(new BuildTask { Executable = prefix + "g++", Arguments = $"{flags.StartGroup} {flags.EffectiveLDFLAGS} $^ {flags.EndGroup} -o $@", AllInputs = prj.SourceFiles.Where(f => sourceExtensions.ContainsKey(Path.GetExtension(f).TrimStart('.'))) .Select(f => Path.ChangeExtension(Path.GetFileName(f), ".o")) .Concat(prj.SourceFiles.Where(f => f.EndsWith(".a", StringComparison.InvariantCultureIgnoreCase))) .ToArray(), PrimaryOutput = "test.elf", }); job.OtherTasks.Add(new BuildTask { Executable = prefix + "objcopy", Arguments = "-O binary $< $@", AllInputs = new[] { "test.elf" }, PrimaryOutput = "test.bin", }); foreach (var sf in prj.SourceFiles) { var sfE = sf.Replace('\\', '/'); string ext = Path.GetExtension(sf); if (!sourceExtensions.ContainsKey(ext.TrimStart('.'))) { if (ext != ".txt" && ext != ".a" && ext != ".h") { Console.WriteLine($"#{sf} is not a recognized source file"); } } else { bool isCpp = ext.ToLower() != ".c"; string obj = Path.ChangeExtension(Path.GetFileName(sfE), ".o"); job.CompileTasks.Add(new BuildTask { PrimaryOutput = Path.ChangeExtension(Path.GetFileName(sfE), ".o"), AllInputs = new[] { sfE }, Executable = prefix + (isCpp ? "g++" : "gcc"), Arguments = $"-c $< { (isCpp ? "-std=gnu++11 ":" ")} {flags.GetEffectiveCFLAGS(isCpp, ToolFlags.FlagEscapingMode.ForMakefile)} -o {obj}".Replace('\\', '/').Replace("/\"", "\\\""), }); } } bool errorsFound = false; foreach (var g in job.CompileTasks.GroupBy(t => t.PrimaryOutput.ToLower())) { if (g.Count() > 1) { Console.WriteLine($"ERROR: {g.Key} corresponds to the following files:"); foreach (var f in g) { Console.WriteLine("\t" + f.AllInputs.FirstOrDefault()); } errorsFound = true; } } if (errorsFound) { throw new Exception("Multiple source files with the same name found"); } job.GenerateMakeFile(Path.Combine(mcuDir, "Makefile"), "test.bin"); if (!string.IsNullOrEmpty(mcu.MCUDefinitionFile) && validateRegisters) { string firstSrcFileInPrjDir = prj.SourceFiles.First(fn => Path.GetDirectoryName(fn) == mcuDir); InsertRegisterValidationCode(firstSrcFileInPrjDir, XmlTools.LoadObject <MCUDefinition>(mcu.MCUDefinitionFile), renameRules, nonValidateReg, UndefinedMacros); } Console.Write("Building {0}...", Path.GetFileName(mcuDir)); bool buildSucceeded; if (true) { var proc = Process.Start(new ProcessStartInfo("cmd.exe", "/c " + Path.Combine(mcu.BSP.Toolchain.Directory, mcu.BSP.Toolchain.Toolchain.BinaryDirectory, "make.exe") + " -j" + Environment.ProcessorCount + " > build.log 2>&1") { UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = mcuDir }); proc.WaitForExit(); buildSucceeded = proc.ExitCode == 0; } else { buildSucceeded = job.BuildFast(mcuDir, Environment.ProcessorCount); } bool success = false; string mapFile = Path.Combine(mcuDir, GeneratedProject.MapFileName); if (buildSucceeded && File.Exists(mapFile)) { success = File.ReadAllLines(Path.Combine(mcuDir, mapFile)).Where(l => RgMainMap.IsMatch(l)).Count() > 0; if (success) { string binFile = Path.Combine(mcuDir, "test.bin"); using (var fs = File.Open(binFile, FileMode.Open)) if (fs.Length < 512) { success = false; } } } if (!success) { return(TestResult.Failed); } if (vendorSample != null) { FillSampleDependenciesFromDepFiles(vendorSample, mcuDir); } Directory.Delete(mcuDir, true); return(TestResult.Succeeded); }
private static TestResult TestMCU(LoadedBSP.LoadedMCU mcu, string mcuDir, TestedSample sample, DeviceParameterSet extraParameters, LoadedRenamingRule[] renameRules, string[] nonValidateReg, string[] pUndefinedMacros) { const int RepeatCount = 20; for (var i = 0; i < RepeatCount; ++i) { if (!Directory.Exists(mcuDir)) { break; } Console.WriteLine("Deleting " + mcuDir + "..."); Directory.Delete(mcuDir, true); if (i == RepeatCount - 1) { throw new Exception("Cannot remove folder!"); } Thread.Sleep(50); } for (var i = 0; i < RepeatCount; ++i) { if (Directory.Exists(mcuDir)) { break; } Directory.CreateDirectory(mcuDir); if (i == RepeatCount - 1) { throw new Exception("Cannot create folder!"); } Thread.Sleep(50); } var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties)); if (configuredMCU.ExpandedMCU.FLASHSize == 0) { configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram"; } var samples = mcu.BSP.GetSamplesForMCU(mcu.ExpandedMCU.ID, false); LoadedBSP.LoadedSample sampleObj; if (string.IsNullOrEmpty(sample.Name)) { sampleObj = samples[0]; } else { sampleObj = samples.FirstOrDefault(s => s.Sample.Name == sample.Name); } if (sampleObj == null) { if (sample.SkipIfNotFound) { Directory.Delete(mcuDir, true); return(TestResult.Skipped); } else { throw new Exception("Cannot find sample: " + sample.Name); } } string[] frameworks = sampleObj.Sample.RequiredFrameworks ?? new string[0]; //frameworkCfg["com.sysprogs.bspoptions.stm32.freertos.heap"] = "heap_4"; //frameworkCfg["com.sysprogs.bspoptions.stm32.freertos.portcore"] = "CM0"; //frameworkCfg["com.sysprogs.bspoptions.stm32.usb.devclass"] = "CDC"; //frameworkCfg["com.sysprogs.bspoptions.stm32.usb.speed"] = "FS"; 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); //configuredSample.Parameters["com.sysprogs.examples.ledblink.LEDPORT"] = "GPIOA"; //configuredSample.Parameters["com.sysprogs.examples.stm32.LEDPORT"] = "GPIOA"; //configuredSample.Parameters["com.sysprogs.examples.stm32.freertos.heap_size"] = "0"; var bspDict = configuredMCU.BuildSystemDictionary(SystemDirs); 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); var prj = new GeneratedProject(mcuDir, configuredMCU, frameworks) { DataSections = sample.DataSections }; prj.DoGenerateProjectFromEmbeddedSample(configuredSample, false, bspDict); Dictionary <string, bool> frameworkIDs = new Dictionary <string, bool>(); if (frameworks != null) { foreach (var fw in frameworks) { frameworkIDs[fw] = true; } } if (sample.AdditionalFrameworks != null) { foreach (var fw in sample.AdditionalFrameworks) { frameworkIDs[fw] = true; } } prj.AddBSPFilesToProject(bspDict, configuredSample.FrameworkParameters, frameworkIDs); var flags = prj.GetToolFlags(bspDict, configuredSample.FrameworkParameters, frameworkIDs); flags.COMMONFLAGS += " -save-temps "; Dictionary <string, bool> sourceExtensions = new Dictionary <string, bool>(StringComparer.InvariantCultureIgnoreCase); foreach (var ext in sample.SourceFileExtensions.Split(';')) { sourceExtensions[ext] = true; } return(BuildAndRunValidationJob(mcu, mcuDir, sample.ValidateRegisters, renameRules, prj, flags, sourceExtensions, nonValidateReg, pUndefinedMacros)); }
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)); }
private static TestResult BuildAndRunValidationJob(LoadedBSP.LoadedMCU mcu, string mcuDir, GeneratedProject prj, ToolFlags flags, Dictionary <string, bool> sourceExtensions, VendorSample vendorSample = null, RegisterValidationParameters registerValidationParameters = null, BSPValidationFlags validationFlags = BSPValidationFlags.None) { BuildJob job = new BuildJob(); string prefix = string.Format("{0}\\{1}\\{2}", mcu.BSP.Toolchain.Directory, mcu.BSP.Toolchain.Toolchain.BinaryDirectory, mcu.BSP.Toolchain.Toolchain.Prefix); foreach (var sf in prj.SourceFiles) { var sfE = sf.Replace('\\', '/'); string ext = Path.GetExtension(sf); if (!sourceExtensions.ContainsKey(ext.TrimStart('.'))) { if (ext != ".txt" && ext != ".a" && ext != ".h") { Console.WriteLine($"#{sf} is not a recognized source file"); } } else { bool isCpp = ext.ToLower() != ".c"; string obj = Path.ChangeExtension(Path.GetFileName(sfE), ".o"); job.CompileTasks.Add(new BuildTask { PrimaryOutput = Path.ChangeExtension(Path.GetFileName(sfE), ".o"), AllInputs = new[] { sfE }, Executable = prefix + (isCpp ? "g++" : "gcc"), Arguments = $"-c -o $@ $< { (isCpp ? "-std=gnu++11 " : " ")} {flags.GetEffectiveCFLAGS(isCpp, ToolchainSubtype.GCC, ToolFlags.FlagEscapingMode.ForMakefile)}".Replace('\\', '/').Replace("/\"", "\\\""), }); } } bool errorsFound = false; foreach (var g in job.CompileTasks.GroupBy(t => t.PrimaryOutput.ToLower())) { if (g.Count() > 1) { int i = 0; foreach (var j2 in g) { j2.AttachDisambiguationSuffix($"_{++i}"); } Console.WriteLine($"ERROR: {g.Key} corresponds to the following files:"); foreach (var f in g) { Console.WriteLine("\t" + f.AllInputs.FirstOrDefault()); } errorsFound = true; } } if (errorsFound && (validationFlags & BSPValidationFlags.ResolveNameCollisions) == BSPValidationFlags.None) { throw new Exception("Multiple source files with the same name found"); } job.OtherTasks.Add(new BuildTask { Executable = prefix + "g++", Arguments = $"{flags.StartGroup} {flags.EffectiveLDFLAGS} $^ {flags.EndGroup} -o $@", AllInputs = job.CompileTasks.Select(t => t.PrimaryOutput) .Concat(prj.SourceFiles.Where(f => f.EndsWith(".a", StringComparison.InvariantCultureIgnoreCase))) .ToArray(), PrimaryOutput = "test.elf", }); job.OtherTasks.Add(new BuildTask { Executable = prefix + "objcopy", Arguments = "-O binary $< $@", AllInputs = new[] { "test.elf" }, PrimaryOutput = "test.bin", }); List <string> comments = new List <string>(); comments.Add("Original directory:" + vendorSample?.Path); comments.Add("Tool flags:"); comments.Add("\tInclude directories:"); foreach (var dir in flags.IncludeDirectories ?? new string[0]) { comments.Add("\t\t" + dir); } comments.Add("\tPreprocessor macros:"); foreach (var dir in flags.PreprocessorMacros ?? new string[0]) { comments.Add("\t\t" + dir); } comments.Add("\tLibrary directories:"); foreach (var dir in flags.AdditionalLibraryDirectories ?? new string[0]) { comments.Add("\t\t" + dir); } comments.Add("\tLibrary names:"); foreach (var dir in flags.AdditionalLibraries ?? new string[0]) { comments.Add("\t\t" + dir); } comments.Add("\tExtra linker inputs:"); foreach (var dir in flags.AdditionalLinkerInputs ?? new string[0]) { comments.Add("\t\t" + dir); } comments.Add("\tCFLAGS:" + flags.CFLAGS); comments.Add("\tCXXFLAGS:" + flags.CXXFLAGS); comments.Add("\tLDFLAGS:" + flags.LDFLAGS); comments.Add("\tCOMMONFLAGS:" + flags.COMMONFLAGS); job.GenerateMakeFile(Path.Combine(mcuDir, "Makefile"), "test.bin", comments, (validationFlags & BSPValidationFlags.ContinuePastCompilationErrors) != BSPValidationFlags.None); if (!string.IsNullOrEmpty(mcu.MCUDefinitionFile) && registerValidationParameters != null) { string firstSrcFileInPrjDir = prj.SourceFiles.First(fn => Path.GetDirectoryName(fn) == mcuDir); InsertRegisterValidationCode(firstSrcFileInPrjDir, XmlTools.LoadObject <MCUDefinition>(mcu.MCUDefinitionFile), registerValidationParameters); } bool buildSucceeded; if (true) { var proc = Process.Start(new ProcessStartInfo("cmd.exe", "/c " + Path.Combine(mcu.BSP.Toolchain.Directory, mcu.BSP.Toolchain.Toolchain.BinaryDirectory, "make.exe") + " -j" + Environment.ProcessorCount + " > build.log 2>&1") { UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = mcuDir }); proc.WaitForExit(); buildSucceeded = proc.ExitCode == 0; } else { buildSucceeded = job.BuildFast(mcuDir, Environment.ProcessorCount); } bool success = false; string mapFile = Path.Combine(mcuDir, GeneratedProject.MapFileName); if (buildSucceeded && File.Exists(mapFile)) { success = File.ReadAllLines(Path.Combine(mcuDir, mapFile)).Where(l => RgMainMap.IsMatch(l)).Count() > 0; if (success) { string binFile = Path.Combine(mcuDir, "test.bin"); using (var fs = File.Open(binFile, FileMode.Open)) if (fs.Length < 512) { success = false; } } } if (!success) { if (vendorSample != null) { vendorSample.AllDependencies = null; } return(new TestResult(TestBuildResult.Failed, Path.Combine(mcuDir, "build.log"))); } if (vendorSample != null) { vendorSample.AllDependencies = Directory.GetFiles(mcuDir, "*.d") .SelectMany(f => SplitDependencyFile(f).Where(t => !t.EndsWith(":"))) .Concat(prj.SourceFiles.SelectMany(sf => FindIncludedResources(vendorSample.Path, sf))) .Distinct() .ToArray(); } if ((validationFlags & BSPValidationFlags.KeepDirectoryAfterSuccessfulTest) == BSPValidationFlags.None) { Directory.Delete(mcuDir, true); } return(new TestResult(TestBuildResult.Succeeded, Path.Combine(mcuDir, "build.log"))); }
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)); }