Beispiel #1
0
        private void SynthesizeAndAppendCopyJobFromCMakeFiles(Framework framework)
        {
            var fwPath = string.Format("{0}\\lib\\ksdk_{1}_lib\\armgcc", Directories.InputDir, framework.ID.Substring(framework.ID.LastIndexOf(".") + 1));
            var cmakeFiles = Directory.GetFiles(fwPath, "CMakeLists.txt", SearchOption.AllDirectories);
            var filesToFamilies = new Dictionary<string, HashSet<string>>();
            var families = new List<string>();
            var copyPaths = new HashSet<string>();
            var allFiles = new HashSet<string>();

            foreach (var cmakeFile in cmakeFiles) {
                var splitPath = cmakeFile.Split(Path.DirectorySeparatorChar);
                var family = splitPath[splitPath.Length - 2];
                families.Add(family);
                var contents = File.ReadAllText(cmakeFile);
                var includeDirs = Regex.Matches(contents, @"INCLUDE_DIRECTORIES\(\${ProjDirPath}\/..\/..\/..\/..\/([\w\/]+)\)").Cast<Match>().Select(m => m.Groups[1].Value).ToList();
                var sourceFiles = Regex.Matches(contents, @"\${ProjDirPath}\/..\/..\/..\/..\/([\w\/.]+)").Cast<Match>().Select(m => m.Groups[1].Value).ToList();
                var allFamilyFiles = sourceFiles.Concat(includeDirs).Where(
                    f =>
                    {
                        var t = f.ToLower();
                        return !t.Contains(DEVICES_FOLDER) && !t.Contains(CMSIS_FOLDER) && !t.Contains("iar") && !t.Contains("realview") && !t.Contains("mdk") && !t.Contains("rtos/freertos/config");
                    }).ToArray();

                allFiles.UnionWith(allFamilyFiles);

                foreach (var file in allFamilyFiles) {
                    var filePath = file;

                    if (file.EndsWith(".h") || file.EndsWith(".c") || file.EndsWith(".txt")) {
                        filePath = file.Substring(0, file.LastIndexOf('/'));
                    }

                    if (file == "rtos")
                        continue;

                    filePath = filePath.Replace("/", "\\");
                    filePath += "\\";
                    copyPaths.Add(filePath + "*.c");
                    copyPaths.Add(filePath + "*.h");
                }

                foreach (var file in allFamilyFiles.Select(f => f.Replace("/", "\\\\"))) {
                    if (!filesToFamilies.ContainsKey(file)) {
                        filesToFamilies.Add(file, new HashSet<string>());
                    }
                    filesToFamilies[file].Add(family);
                }
            }

            var dirs = allFiles.Where(f => !f.EndsWith(".h") && !f.EndsWith(".c")).Select(f => "$$SYS:BSP_ROOT$$/" + f).ToArray();
            var allIncludeDirs = new HashSet<string>();
            for (int i = 0; i < dirs.Length; i++) {
                var familyFound = false;
                foreach (var fam in families) {
                    if (dirs[i].Contains(fam)) {
                        familyFound = true;
                        allIncludeDirs.Add(dirs[i].Replace(fam, "$$SYS:FAMILY_ID$$"));
                        break;
                    }
                }
                if (!familyFound) {
                    allIncludeDirs.Add(dirs[i]);
                }
            }

            allIncludeDirs.Remove("$$SYS:BSP_ROOT$$/rtos/FreeRTOS/config/$$SYS:FAMILY_ID$$/gcc");   //FreeRTOS config files are copied to each project individually

            var frameworkMCUs = new List<string>();
            foreach (var familyName in families) {
                frameworkMCUs.AddRange(_familyToMCUs[familyName]);
            }

            framework.Filter = string.Join("|", frameworkMCUs);

            var fileConditions = new Dictionary<string, string>();
            foreach (var fileFamilies in filesToFamilies) {
                var fcKey = fileFamilies.Key;
                string absPath = Path.Combine(Directories.InputDir, fcKey);
                if (!File.Exists(absPath) && !Directory.Exists(absPath))
                {
                    if (fcKey == @"rtos\\mqx\\config\\mcu\\MK66F18" ||
                        fcKey == @"rtos\\mqx\\config\\mcu\\MKV10Z1287" ||
                        fcKey == @"rtos\\uCOSII\\src\\uCOS" ||
                        fcKey == @"rtos\\uCOSIII\\src\\uCOS" ||
                        fcKey == @"rtos\\uCOSIII\\src\\uC")
                        continue;

                    throw new Exception("Non-existing path mentioned in Kinetis CMake files. Please investigate.");
                }

                if (fileFamilies.Value.Count == 1) {
                    fileConditions.Add(fcKey, fileFamilies.Value.First());
                }
                else if (fileFamilies.Value.Count < families.Count) {
                    fileConditions.Add(fcKey, string.Join(" | ", fileFamilies.Value));
                }
            }

            var newJob = new CopyJob
            {
                SourceFolder = Directories.InputDir,
                TargetFolder = "",
                FilesToCopy = "-platform\\devices\\startup.*;" + string.Join(";", copyPaths),
                SimpleFileConditions = fileConditions.Select(kv => string.Format("{0}: $$SYS:FAMILY_ID$$ =~ {1}", kv.Key.Replace(".", "\\."), kv.Value)).ToArray(),
                AdditionalIncludeDirs = string.Join(";", allIncludeDirs.ToArray()),
                ProjectInclusionMask = string.Join(";", allFiles.Where(f => f.EndsWith(".h", StringComparison.CurrentCultureIgnoreCase) || f.EndsWith(".c", StringComparison.CurrentCultureIgnoreCase))),
                AlreadyCopied = true,
                AutoIncludeMask = "-*",
            };

            framework.CopyJobs = framework.CopyJobs.Concat(new CopyJob[] { newJob }).ToArray();
        }