void AddRequiredPackages (IAssemblyContext assemblyContext, string variableName, string packageName, PackageContent packageContent) { SystemPackage package = assemblyContext.GetPackage (packageName); if (package != null && !string.IsNullOrEmpty (package.Requires)) { foreach (string requiredPackageName in package.Requires.Split (' ')) { if (!pkgNameToPkgVarName.ContainsKey (requiredPackageName)) { pkgNameToPkgVarName[requiredPackageName] = variableName; packageContent.RequiredPackages.Add (requiredPackageName); } AddRequiredPackages (assemblyContext, variableName, requiredPackageName, packageContent); } } }
void ReadPackagesList () { pkgVarNameToPkgName = new Dictionary<string, List<PackageContent>> (); pkgNameToPkgVarName = new Dictionary<string, string> (); varNameAcSubst = new Dictionary<string, string> (); string content = null; using (StreamReader sr = new StreamReader (fullpath)) content = sr.ReadToEnd (); var assemblyContext = MakefileData.GetMonoRuntimeContext (); foreach (Match match in PkgCheckModulesRegex.Matches (content)) { if (!match.Success) continue; List<PackageContent> pkgs = new List<PackageContent> (); string pkgId = match.Groups ["pkgId"].Value; if (pkgId.Length > 2 && pkgId [0] == '[' && pkgId [pkgId.Length - 1] == ']') // Remove [] used for quoting pkgId = pkgId.Substring (1, pkgId.Length - 2); foreach (Capture c in match.Groups ["content"].Captures) { string s = c.Value.Trim (); if (s.Length == 0) continue; if (s.Length > 2 && s [0] == '[' && s [s.Length - 1] == ']') // Remove [] used for quoting s = s.Substring (1, s.Length - 2); PackageContent packageContent = new PackageContent (s); pkgs.Add (packageContent); pkgNameToPkgVarName [s] = pkgId; AddRequiredPackages (assemblyContext, pkgId, s, packageContent); } pkgVarNameToPkgName [pkgId] = pkgs; } foreach (Match match in AcSubstRegex.Matches (content)) { if (!match.Success) continue; string s = match.Groups [1].Value; if (!s.EndsWith ("_LIBS")) continue; string pkgVarName = s.Replace ("_LIBS", String.Empty); List<PackageContent> l = GetPackageContentFromVarName (pkgVarName); IAssemblyContext r = MakefileData.GetMonoRuntimeContext (); if (l != null && l.Count == 1 && r.GetPackage (l [0].Name) != null) { //PKG_CHECK_MODULES for pkgVarName was found //and it references only a single managed package // //This ensures that we don't emit $(FOO_LIBS) //for pkgVarName's that reference > 1 package or //for unmanaged packages varNameAcSubst [s] = s; } } }