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(); }