Esempio n. 1
0
        public void DoGenerateProjectFromEmbeddedSample(ConfiguredSample sample, bool plainC, Dictionary <string, string> bspDict)
        {
            Dictionary <string, bool> binaryFiles  = new Dictionary <string, bool>(StringComparer.CurrentCultureIgnoreCase);
            Dictionary <string, bool> ignoredFiles = new Dictionary <string, bool>(StringComparer.CurrentCultureIgnoreCase);
            var data = sample.Sample.Sample;

            if (data.IgnoredFiles != null)
            {
                foreach (var fn in data.IgnoredFiles)
                {
                    ignoredFiles[Path.Combine(sample.Sample.Directory, fn)] = true;
                }
            }
            if (data.BinaryFiles != null)
            {
                foreach (var fn in data.BinaryFiles)
                {
                    binaryFiles[Path.Combine(sample.Sample.Directory, fn)] = true;
                }
            }

            ignoredFiles[Path.Combine(sample.Sample.Directory, LoadedBSP.SampleDescriptionFile)] = true;
            DoImportSampleRecursively(bspDict, sample, sample.Sample.Directory, _ProjectDir, binaryFiles, ignoredFiles, plainC, "");
            if (data.AdditionalSourcesFromBSP != null)
            {
                AddBSPFilesRecursively(data.AdditionalSourcesFromBSP, bspDict, _ProjectDir);
            }
            if (data.AdditionalSourcesToCopy != null)
            {
                foreach (var fobj in data.AdditionalSourcesToCopy)
                {
                    string sourceFile = VariableHelper.ExpandVariables(fobj.SourcePath, bspDict);
                    string destFile   = Path.Combine(_ProjectDir, VariableHelper.ExpandVariables(fobj.TargetFileName ?? Path.GetFileName(sourceFile), bspDict));
                    File.Copy(sourceFile, destFile);
                    Directory.CreateDirectory(Path.GetDirectoryName(destFile));

                    string ext = Path.GetExtension(destFile).ToLower();
                    if (ext != ".h" && ext != ".hpp")
                    {
                        _SourceFiles.Add(destFile);
                    }
                }
            }
        }
Esempio n. 2
0
        private static TestResult TestMCU(LoadedBSP.LoadedMCU mcu, string mcuDir, TestedSample sample, DeviceParameterSet extraParameters, LoadedRenamingRule[] renameRules, string[] nonValidateReg)
        {
            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(new BSPManager(), null);
            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);
            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);

            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);
        }
Esempio n. 3
0
        void DoImportSampleRecursively(Dictionary <string, string> bspDict, ConfiguredSample sample, string sourceDir, string targetDir, Dictionary <string, bool> binaryFiles, Dictionary <string, bool> ignoredFiles, bool plainC, string relativePath)
        {
            foreach (var fn in Directory.GetFiles(sourceDir))
            {
                try
                {
                    string target = Path.Combine(targetDir, Path.GetFileName(fn));
                    if (!plainC && Path.GetExtension(target).ToLower() == ".c" && !sample.Sample.Sample.DoNotUpgradeCToCpp)
                    {
                        target = Path.ChangeExtension(target, ".cpp");
                    }
                    else if (plainC && Path.GetExtension(target).ToLower() == ".cpp")
                    {
                        target = Path.ChangeExtension(target, ".c");
                    }

                    if (target.Contains("$$"))
                    {
                        target = VariableHelper.ExpandVariables(target, bspDict, sample.Parameters);
                    }

                    if (ignoredFiles.ContainsKey(fn))
                    {
                        continue;
                    }
                    if (binaryFiles.ContainsKey(fn))
                    {
                        File.Copy(fn, target);
                    }
                    else
                    {
                        string str = File.ReadAllText(fn);

                        str = VariableHelper.ExpandVariables(str, bspDict, sample.Parameters);
                        File.WriteAllText(target, str);
                    }

                    string ext = Path.GetExtension(target).ToLower();
                    if (ext != ".h" && ext != ".hpp")
                    {
                        _SourceFiles.Add(target);
                    }
                }
                catch
                {
                }
            }
            foreach (var fn in Directory.GetDirectories(sourceDir))
            {
                string target;
                try
                {
                    target = Path.Combine(targetDir, Path.GetFileName(fn));
                    Directory.CreateDirectory(target);
                }
                catch
                {
                    continue;
                }
                DoImportSampleRecursively(bspDict, sample, fn, target, binaryFiles, ignoredFiles, plainC, relativePath + Path.GetFileName(fn) + "\\");
            }
        }
Esempio n. 4
0
        void DoImportSampleRecursively(Dictionary<string, string> bspDict, ConfiguredSample sample, string sourceDir, string targetDir, Dictionary<string, bool> binaryFiles, Dictionary<string, bool> ignoredFiles, bool plainC, string relativePath)
        {
            foreach (var fn in Directory.GetFiles(sourceDir))
            {
                try
                {
                    string target = Path.Combine(targetDir, Path.GetFileName(fn));
                    if (!plainC && Path.GetExtension(target).ToLower() == ".c" && !sample.Sample.Sample.DoNotUpgradeCToCpp)
                        target = Path.ChangeExtension(target, ".cpp");
                    else if (plainC && Path.GetExtension(target).ToLower() == ".cpp")
                        target = Path.ChangeExtension(target, ".c");

                    if (target.Contains("$$"))
                        target = VariableHelper.ExpandVariables(target, bspDict, sample.Parameters);

                    if (ignoredFiles.ContainsKey(fn))
                        continue;
                    if (binaryFiles.ContainsKey(fn))
                        File.Copy(fn, target);
                    else
                    {
                        string str = File.ReadAllText(fn);

                        str = VariableHelper.ExpandVariables(str, bspDict, sample.Parameters);
                        File.WriteAllText(target, str);
                    }

                    string ext = Path.GetExtension(target).ToLower();
                    if (ext != ".h" && ext != ".hpp")
                        _SourceFiles.Add(target);
                }
                catch
                {
                }
            }
            foreach (var fn in Directory.GetDirectories(sourceDir))
            {
                string target;
                try
                {
                    target = Path.Combine(targetDir, Path.GetFileName(fn));
                    Directory.CreateDirectory(target);
                }
                catch
                {
                    continue;
                }
                DoImportSampleRecursively(bspDict, sample, fn, target, binaryFiles, ignoredFiles, plainC, relativePath + Path.GetFileName(fn) + "\\");
            }
        }
Esempio n. 5
0
        public void DoGenerateProjectFromEmbeddedSample(ConfiguredSample sample, bool plainC, Dictionary<string, string> bspDict)
        {
            Dictionary<string, bool> binaryFiles = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase);
            Dictionary<string, bool> ignoredFiles = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase);
            var data = sample.Sample.Sample;
            if (data.IgnoredFiles != null)
                foreach (var fn in data.IgnoredFiles)
                    ignoredFiles[Path.Combine(sample.Sample.Directory, fn)] = true;
            if (data.BinaryFiles != null)
                foreach (var fn in data.BinaryFiles)
                    binaryFiles[Path.Combine(sample.Sample.Directory, fn)] = true;

            ignoredFiles[Path.Combine(sample.Sample.Directory, LoadedBSP.SampleDescriptionFile)] = true;
            DoImportSampleRecursively(bspDict, sample, sample.Sample.Directory, _ProjectDir, binaryFiles, ignoredFiles, plainC, "");
            if (data.AdditionalSourcesFromBSP != null)
                AddBSPFilesRecursively(data.AdditionalSourcesFromBSP, bspDict, _ProjectDir);
            if (data.AdditionalSourcesToCopy != null)
                foreach (var fobj in data.AdditionalSourcesToCopy)
                {
                    string sourceFile = VariableHelper.ExpandVariables(fobj.SourcePath, bspDict);
                    string destFile = Path.Combine(_ProjectDir, VariableHelper.ExpandVariables(fobj.TargetFileName ?? Path.GetFileName(sourceFile), bspDict));
                    File.Copy(sourceFile, destFile);
                    Directory.CreateDirectory(Path.GetDirectoryName(destFile));

                    string ext = Path.GetExtension(destFile).ToLower();
                    if (ext != ".h" && ext != ".hpp")
                        _SourceFiles.Add(destFile);
                }
        }
Esempio n. 6
0
        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));
        }
Esempio n. 7
0
        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));
        }