Ejemplo n.º 1
0
        private static void RunTests(MbedBSPGenerator generator)
        {
            var testFiles = new TestInfo[] {
                new TestInfo("test_ledblink.xml", 0, 0),
                new TestInfo("test_usbcd.xml", 0, 0),
                new TestInfo("test_ledblink_rtos.xml", 0, 0),
            };

            foreach (var test in testFiles)
            {
                Console.WriteLine($"Testing {test.Filename}...");
                var job = XmlTools.LoadObject <TestJob>(Path.Combine(generator.dataDir, test.Filename));
                if (job.ToolchainPath.StartsWith("["))
                {
                    job.ToolchainPath = (string)Registry.CurrentUser.OpenSubKey(@"Software\Sysprogs\GNUToolchains").GetValue(job.ToolchainPath.Trim('[', ']'));
                    if (job.ToolchainPath == null)
                    {
                        throw new Exception("Cannot locate toolchain path from registry");
                    }
                }
                var toolchain = LoadedToolchain.Load(new ToolchainSource.Other(Environment.ExpandEnvironmentVariables(job.ToolchainPath)));
                var lbsp      = LoadedBSP.Load(new BSPEngine.BSPSummary(Environment.ExpandEnvironmentVariables(Path.Combine(generator.outputDir, "mbed"))), toolchain);

                var r = StandaloneBSPValidator.Program.TestBSP(job, lbsp, Path.Combine(generator.outputDir, "TestResults"));
                test.Passed = r.Passed;
                test.Failed = r.Failed;
            }

            foreach (var test in testFiles)
            {
                Console.WriteLine("Results for the test: " + test.Filename);
                Console.WriteLine("Passed: " + test.Passed.ToString());
                Console.WriteLine("Failed: " + test.Failed.ToString());
                Console.WriteLine();
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            var generator = new MbedBSPGenerator("5.9.2");

            bool skipRescan = args.Contains("/norescan");

            string suffix = "";

            generator.UpdateGitAndRescanTargets(skipRescan);

            ParsedTargetList parsedTargets = XmlTools.LoadObject <ParsedTargetList>(Path.Combine(generator.outputDir, "mbed", "ParsedTargets.xml"));

            generator.PatchBuggyFiles();

            BoardSupportPackage bsp = new BoardSupportPackage
            {
                PackageID            = "com.sysprogs.arm.mbed",
                PackageDescription   = "ARM mbed",
                PackageVersion       = generator.Version + suffix,
                GNUTargetID          = "arm-eabi",
                GeneratedMakFileName = "mbed.mak",
                BSPSourceFolderName  = "mbed Files"
            };

            var validTargets = parsedTargets.Targets.Where(t => t.BaseConfiguration != null).ToArray();

            MCUFamily commonFamily = new MCUFamily
            {
                ID = "MBED_CORE",
                AdditionalSourceFiles         = generator.ConvertPaths(Intersect(validTargets.Select(t => t.BaseConfiguration.SourceFiles))),
                AdditionalHeaderFiles         = generator.ConvertPaths(Intersect(validTargets.Select(t => t.BaseConfiguration.HeaderFiles))),
                SymbolsRequiredByLinkerScript = new[] { "__Vectors", "Stack_Size" },
                CompilationFlags = new ToolFlags
                {
                    IncludeDirectories = generator.ConvertPaths(Intersect(validTargets.Select(t => t.BaseConfiguration.IncludeDirectories))),
                    PreprocessorMacros = Intersect(validTargets.Select(t => t.BaseConfiguration.EffectivePreprocessorMacros))
                }
            };

            bsp.MCUFamilies = new[] { commonFamily };

            List <MCU> mcus = new List <MCU>();
            Dictionary <string, ConditionalConfigAggregator> libraryAndFeatureConfigs = new Dictionary <string, ConditionalConfigAggregator>();

            Console.WriteLine("Generating target definitions...");

            foreach (var target in validTargets)
            {
                if (string.IsNullOrEmpty(target.BaseConfiguration.LinkerScript))
                {
                    Console.WriteLine($"Skipping {target.ID}: no linker script defined");
                    continue;
                }

                var mcu = new MCU
                {
                    FamilyID = commonFamily.ID,
                    ID       = target.ID,
                    AdditionalSourceFiles = generator.ConvertPaths(target.BaseConfiguration.SourceFiles),
                    AdditionalHeaderFiles = generator.ConvertPaths(target.BaseConfiguration.HeaderFiles),
                    CompilationFlags      = new ToolFlags
                    {
                        IncludeDirectories = generator.ConvertPaths(target.BaseConfiguration.IncludeDirectories),
                        PreprocessorMacros = target.BaseConfiguration.EffectivePreprocessorMacros,
                        LinkerScript       = generator.ConvertPaths(new[] { target.BaseConfiguration.LinkerScript })[0],
                        COMMONFLAGS        = target.CFLAGS.Replace(';', ' '),
                    },
                    ConfigurableProperties = new PropertyList
                    {
                        PropertyGroups = new List <PropertyGroup>
                        {
                            new PropertyGroup
                            {
                                UniqueID   = "com.sysprogs.mbed.",
                                Properties = target.BaseConfiguration.EffectiveConfigurableProperties.ToList()
                            }
                        }
                    }
                };

                generator.DetectAndApplyMemorySizes(mcu, target.BaseConfiguration.LinkerScript);

                if (mcu.CompilationFlags.COMMONFLAGS.Contains("-mfloat-abi"))
                {
                    string[] flags        = mcu.CompilationFlags.COMMONFLAGS.Split(' ');
                    string   defaultValue = flags.First(f => f.StartsWith("-mfloat-abi"));

                    var property = new PropertyEntry.Enumerated
                    {
                        Name           = "Floating point support",
                        UniqueID       = "floatmode",
                        SuggestionList = new PropertyEntry.Enumerated.Suggestion[]
                        {
                            new PropertyEntry.Enumerated.Suggestion {
                                InternalValue = "-mfloat-abi=soft", UserFriendlyName = "Software"
                            },
                            new PropertyEntry.Enumerated.Suggestion {
                                InternalValue = "-mfloat-abi=hard", UserFriendlyName = "Hardware"
                            },
                            new PropertyEntry.Enumerated.Suggestion {
                                InternalValue = "-mfloat-abi=softfp", UserFriendlyName = "Hardware with Software interface"
                            },
                            new PropertyEntry.Enumerated.Suggestion {
                                InternalValue = "", UserFriendlyName = "Unspecified"
                            },
                        },
                    };

                    property.DefaultEntryIndex = Enumerable.Range(0, property.SuggestionList.Length).First(i => property.SuggestionList[i].InternalValue == defaultValue);
                    flags[Array.IndexOf(flags, defaultValue)] = "$$" + mcu.ConfigurableProperties.PropertyGroups[0].UniqueID + property.UniqueID + "$$";
                    mcu.CompilationFlags.COMMONFLAGS          = string.Join(" ", flags);
                    mcu.ConfigurableProperties.PropertyGroups[0].Properties.Add(property);
                }

                mcu.AdditionalSourceFiles = mcu.AdditionalSourceFiles.Except(commonFamily.AdditionalSourceFiles).ToArray();
                mcu.AdditionalHeaderFiles = mcu.AdditionalHeaderFiles.Except(commonFamily.AdditionalHeaderFiles).ToArray();
                mcu.CompilationFlags.IncludeDirectories = mcu.CompilationFlags.IncludeDirectories.Except(commonFamily.CompilationFlags.IncludeDirectories).ToArray();
                mcu.CompilationFlags.PreprocessorMacros = mcu.CompilationFlags.PreprocessorMacros.Except(commonFamily.CompilationFlags.PreprocessorMacros).ToArray();

                foreach (var cfg in target.DerivedConfigurations)
                {
                    cfg.MergeScatteredConfigurations();

                    ConditionalConfigAggregator agg;
                    if (!libraryAndFeatureConfigs.TryGetValue(cfg.CanonicalKey, out agg))
                    {
                        agg = libraryAndFeatureConfigs[cfg.CanonicalKey] = new ConditionalConfigAggregator(cfg);
                    }

                    agg.AddedSettingsPerTargets[target.ID] = cfg.Configuration.Subtract(target.BaseConfiguration, cfg.CanonicalKey, cfg.Library != null);
                }

                if (!generator.ConvertSoftdevicesAndPatchTarget(mcu, target.BaseConfiguration.HexFiles))
                {
                    mcu.CompilationFlags.LinkerScript = generator.ConvertPath(generator.PreprocessLinkerScriptIfNeeded(mcu.CompilationFlags.LinkerScript));
                }

                generator.CopyAndAttachRegisterDefinitions(mcu);
                mcus.Add(mcu);
            }

            bsp.SupportedMCUs = mcus.ToArray();
            List <FileCondition>        fileConditions   = new List <FileCondition>();
            List <ConditionalToolFlags> conditionalFlags = new List <ConditionalToolFlags>();
            List <EmbeddedFramework>    frameworks       = new List <EmbeddedFramework>();

            Console.WriteLine("Merging library build settings...");

            foreach (var agg in libraryAndFeatureConfigs.Values)
            {
                EmbeddedFramework framework = new EmbeddedFramework
                {
                    ID = agg.ID,
                    UserFriendlyName             = agg.Name,
                    AdditionalSourceFiles        = generator.ConvertPaths(Union(agg.AddedSettingsPerTargets.Values.Select(t => t.SourceFiles))),
                    AdditionalHeaderFiles        = generator.ConvertPaths(Union(agg.AddedSettingsPerTargets.Values.Select(t => t.HeaderFiles))),
                    AdditionalIncludeDirs        = generator.ConvertPaths(Intersect(agg.AddedSettingsPerTargets.Values.Select(t => t.IncludeDirectories))),
                    AdditionalPreprocessorMacros = Intersect(agg.AddedSettingsPerTargets.Values.Select(t => t.EffectivePreprocessorMacros)),
                };

                var properties = Union(agg.AddedSettingsPerTargets.Values.Select(t => t.EffectiveConfigurableProperties), new PropertyComparerByID()).ToList();
                if (properties.Count > 0)
                {
                    framework.ConfigurableProperties = new PropertyList
                    {
                        PropertyGroups = new List <PropertyGroup>
                        {
                            new PropertyGroup
                            {
                                UniqueID   = "com.sysprogs.mbed.",
                                Properties = properties
                            }
                        }
                    }
                }
                ;

                foreach (var file in framework.AdditionalSourceFiles.Concat(framework.AdditionalHeaderFiles))
                {
                    var targetsWhereIncluded = agg.AddedSettingsPerTargets
                                               .Where(v => generator.ConvertPaths(v.Value.SourceFiles.Concat(v.Value.HeaderFiles)).Contains(file))
                                               .Select(kv => kv.Key)
                                               .ToArray();

                    if (targetsWhereIncluded.Length == agg.AddedSettingsPerTargets.Count)
                    {
                        continue;   //The file is included on all targets
                    }
                    fileConditions.Add(new FileCondition {
                        FilePath = file, ConditionToInclude = new Condition.MatchesRegex {
                            Expression = "$$SYS:MCU_ID$$", Regex = "^(" + string.Join("|", targetsWhereIncluded) + ")$"
                        }
                    });
                }


                foreach (var kv in agg.AddedSettingsPerTargets)
                {
                    var extraIncludeDirs        = generator.ConvertPaths(kv.Value.IncludeDirectories).Except(framework.AdditionalIncludeDirs).ToArray();
                    var extraPreprocessorMacros = kv.Value.EffectivePreprocessorMacros.Except(framework.AdditionalPreprocessorMacros).ToArray();
                    if (extraIncludeDirs.Length == 0 && extraPreprocessorMacros.Length == 0)
                    {
                        continue;
                    }

                    ToolFlags flags = new ToolFlags();
                    if (extraIncludeDirs.Length > 0)
                    {
                        flags.IncludeDirectories = extraIncludeDirs;
                    }
                    if (extraPreprocessorMacros.Length > 0)
                    {
                        flags.PreprocessorMacros = extraPreprocessorMacros;
                    }

                    conditionalFlags.Add(new ConditionalToolFlags
                    {
                        Flags         = flags,
                        FlagCondition = new Condition.And
                        {
                            Arguments = new Condition[]
                            {
                                new Condition.ReferencesFramework {
                                    FrameworkID = framework.ID
                                },
                                new Condition.Equals {
                                    Expression = "$$SYS:MCU_ID$$", ExpectedValue = kv.Key
                                }
                            }
                        }
                    });
                }

                frameworks.Add(framework);
            }

            bsp.FileConditions   = fileConditions.ToArray();
            bsp.ConditionalFlags = conditionalFlags.ToArray();
            bsp.Frameworks       = frameworks.ToArray();
            bsp.Examples         = generator.DetectSampleDirs();

            generator.ProduceBSPArchive(bsp);

            bool performTests = true;

            if (performTests)
            {
                RunTests(generator);
            }
        }