public XCProject(string filePath) : this() { if (!System.IO.Directory.Exists(filePath)) { Debug.LogWarning("Path does not exists."); return; } if (filePath.EndsWith(".xcodeproj")) { this.projectRootPath = Path.GetDirectoryName(filePath); this.filePath = filePath; } else { string[] projects = System.IO.Directory.GetDirectories(filePath, "*.xcodeproj"); if (projects.Length == 0) { Debug.LogWarning("Error: missing xcodeproj file"); return; } this.projectRootPath = filePath; this.filePath = projects[0]; } projectFileInfo = new FileInfo(Path.Combine(this.filePath, "project.pbxproj")); StreamReader sr = projectFileInfo.OpenText(); string contents = sr.ReadToEnd(); sr.Close(); PBXParser parser = new PBXParser(); _datastore = parser.Decode(contents); if (_datastore == null) { throw new System.Exception("Project file not found at file path " + filePath); } if (!_datastore.ContainsKey("objects")) { Debug.Log("Errore " + _datastore.Count); return; } _objects = (PBXDictionary) _datastore["objects"]; modified = false; _rootObjectKey = (string) _datastore["rootObject"]; if (!string.IsNullOrEmpty(_rootObjectKey)) { _project = new PBXProject(_rootObjectKey, (PBXDictionary) _objects[_rootObjectKey]); _rootGroup = new PBXGroup(_rootObjectKey, (PBXDictionary) _objects[_project.mainGroupID]); } else { Debug.LogWarning("Error: project has no root object"); _project = null; _rootGroup = null; } }
public PBXGroup GetGroup(string name, string path = null, PBXGroup parent = null) { if (string.IsNullOrEmpty(name)) { return null; } if (parent == null) { parent = rootGroup; } foreach (KeyValuePair<string, PBXGroup> current in groups) { if (string.IsNullOrEmpty(current.Value.name)) { if (current.Value.path.CompareTo(name) == 0) { return current.Value; } } else if (current.Value.name.CompareTo(name) == 0) { return current.Value; } } PBXGroup result = new PBXGroup(name, path); groups.Add(result); parent.AddChild(result); modified = true; return result; }
public bool AddFolder(string folderPath, PBXGroup parent = null, string[] exclude = null, bool recursive = true, bool createBuildFile = true) { if (!Directory.Exists(folderPath)) { return false; } DirectoryInfo sourceDirectoryInfo = new DirectoryInfo(folderPath); if (exclude == null) { exclude = new string[] {}; } if (parent == null) { parent = rootGroup; } // Create group PBXGroup newGroup = GetGroup(sourceDirectoryInfo.Name, null /*relative path*/, parent); foreach (string directory in Directory.GetDirectories(folderPath)) { Debug.Log("DIR: " + directory); if (directory.EndsWith(".bundle")) { // Treath it like a file and copy even if not recursive Debug.LogWarning("This is a special folder: " + directory); AddFile(directory, newGroup, "SOURCE_ROOT", createBuildFile); Debug.Log("fatto"); continue; } if (recursive) { Debug.Log("recursive"); AddFolder(directory, newGroup, exclude, recursive, createBuildFile); } } // Adding files. string regexExclude = string.Format(@"{0}", string.Join("|", exclude)); foreach (string file in Directory.GetFiles(folderPath)) { if (Regex.IsMatch(file, regexExclude)) { continue; } AddFile(file, newGroup, "SOURCE_ROOT", createBuildFile); } modified = true; return modified; }
public PBXDictionary AddFile(string filePath, PBXGroup parent = null, string tree = "SOURCE_ROOT", bool createBuildFiles = true, bool weak = false) { PBXDictionary results = new PBXDictionary(); string absPath = string.Empty; if (Path.IsPathRooted(filePath)) { absPath = filePath; } else if (tree.CompareTo("SDKROOT") != 0) { absPath = Path.Combine(Application.dataPath, filePath); } if (tree.CompareTo("SOURCE_ROOT") == 0) { System.Uri fileURI = new System.Uri(absPath); System.Uri rootURI = new System.Uri((projectRootPath + "/.")); filePath = rootURI.MakeRelativeUri(fileURI).ToString(); } if (parent == null) { parent = _rootGroup; } // TODO: Aggiungere controllo se file già presente PBXFileReference fileReference = GetFile(System.IO.Path.GetFileName(filePath)); if (fileReference != null) { return null; } fileReference = new PBXFileReference(filePath, (TreeEnum) System.Enum.Parse(typeof(TreeEnum), tree)); parent.AddChild(fileReference); fileReferences.Add(fileReference); results.Add(fileReference.guid, fileReference); // Find test target PBXNativeTarget nativeTestTarget = null; foreach (KeyValuePair<string, PBXNativeTarget> currentObject in nativeTargets) { PBXNativeTarget nativeTargetObj = currentObject.Value; if (nativeTargetObj != null && nativeTargetObj.data.ContainsKey("name")) { string name = (string) nativeTargetObj.data["name"]; if (name != null && name.Contains("Unity-iPhone Tests")) { nativeTestTarget = nativeTargetObj; break; } } } //Create a build file for reference if (!string.IsNullOrEmpty(fileReference.buildPhase) && createBuildFiles) { PBXBuildFile buildFile; switch (fileReference.buildPhase) { case "PBXFrameworksBuildPhase": foreach (KeyValuePair<string, PBXFrameworksBuildPhase> currentObject in frameworkBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } if (!string.IsNullOrEmpty(absPath) && (tree.CompareTo("SOURCE_ROOT") == 0) && File.Exists(absPath)) { string libraryPath = Path.Combine("$(SRCROOT)", Path.GetDirectoryName(filePath)); this.AddLibrarySearchPaths(new PBXList(libraryPath)); } break; case "PBXResourcesBuildPhase": foreach (KeyValuePair<string, PBXResourcesBuildPhase> currentObject in resourcesBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case "PBXShellScriptBuildPhase": foreach (KeyValuePair<string, PBXShellScriptBuildPhase> currentObject in shellScriptBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case "PBXSourcesBuildPhase": foreach (KeyValuePair<string, PBXSourcesBuildPhase> currentObject in sourcesBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case "PBXCopyFilesBuildPhase": foreach (KeyValuePair<string, PBXCopyFilesBuildPhase> currentObject in copyBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case null: Debug.LogWarning("fase non supportata null"); break; default: Debug.LogWarning("fase non supportata def"); return null; } } return results; }
public void ApplyMod(XCMod mod) { PBXGroup modGroup = this.GetGroup(mod.group); foreach (XCModFile libRef in mod.libs) { string completeLibPath; if (libRef.sourceTree.Equals("SDKROOT")) { completeLibPath = System.IO.Path.Combine("usr/lib", libRef.filePath); } else { completeLibPath = System.IO.Path.Combine(mod.path, libRef.filePath); } this.AddFile(MacPath(completeLibPath), modGroup, libRef.sourceTree, true, libRef.isWeak); } PBXGroup frameworkGroup = this.GetGroup("Frameworks"); if (mod.frameworks != null) { foreach (string framework in mod.frameworks) { string[] filename = framework.Split(':'); bool isWeak = (filename.Length > 1) ? true : false; string completePath = System.IO.Path.Combine("System/Library/Frameworks", filename[0]); this.AddFile(MacPath(completePath), frameworkGroup, "SDKROOT", true, isWeak); } } if (mod.files != null) { foreach (string filePath in mod.files) { string absoluteFilePath = System.IO.Path.Combine(mod.path, filePath); this.AddFile(MacPath(absoluteFilePath), modGroup); } } if (mod.folders != null) { foreach (string folderPath in mod.folders) { string absoluteFolderPath = AddXcodeQuotes(System.IO.Path.Combine(mod.path, folderPath)); this.AddFolder(MacPath(absoluteFolderPath), modGroup, (string[])mod.excludes.ToArray()); } } if (mod.headerpaths != null) { foreach (string headerpath in mod.headerpaths) { string absoluteHeaderPath = System.IO.Path.Combine(mod.path, headerpath); this.AddHeaderSearchPaths(AddXcodeQuotes(MacPath(headerpath.Contains("$(SRCROOT)") ? headerpath : absoluteHeaderPath))); } } if (mod.librarysearchpaths != null) { foreach (string librarypath in mod.librarysearchpaths) { string absolutePath = System.IO.Path.Combine(mod.path, librarypath); this.AddLibrarySearchPaths(AddXcodeQuotes(MacPath(librarypath.Contains("$(SRCROOT)") ? librarypath : absolutePath))); } } if (mod.frameworksearchpath != null) { foreach (string frameworksearchpath in mod.frameworksearchpath) { string absoluteHeaderPath = System.IO.Path.Combine(mod.path, frameworksearchpath); this.AddFrameworkSearchPaths(AddXcodeQuotes(MacPath(frameworksearchpath.Contains("$(SRCROOT)") ? frameworksearchpath : absoluteHeaderPath))); } } this.Consolidate(); }
public XCProject(string filePath) : this() { if (!System.IO.Directory.Exists(filePath)) { Debug.LogWarning("Path does not exists."); return; } if (filePath.EndsWith(".xcodeproj")) { this.projectRootPath = Path.GetDirectoryName(filePath); this.filePath = filePath; } else { string[] projects = System.IO.Directory.GetDirectories(filePath, "*.xcodeproj"); if (projects.Length == 0) { Debug.LogWarning("Error: missing xcodeproj file"); return; } this.projectRootPath = filePath; this.filePath = projects[0]; } projectFileInfo = new FileInfo(Path.Combine(this.filePath, "project.pbxproj")); StreamReader sr = projectFileInfo.OpenText(); string contents = sr.ReadToEnd(); sr.Close(); PBXParser parser = new PBXParser(); _datastore = parser.Decode(contents); if (_datastore == null) { throw new System.Exception("Project file not found at file path " + filePath); } if (!_datastore.ContainsKey("objects")) { Debug.Log("Errore " + _datastore.Count); return; } _objects = (PBXDictionary)_datastore["objects"]; modified = false; _rootObjectKey = (string)_datastore["rootObject"]; if (!string.IsNullOrEmpty(_rootObjectKey)) { _project = new PBXProject(_rootObjectKey, (PBXDictionary)_objects[_rootObjectKey]); _rootGroup = new PBXGroup(_rootObjectKey, (PBXDictionary)_objects[_project.mainGroupID]); } else { Debug.LogWarning("Error: project has no root object"); _project = null; _rootGroup = null; } }
public PBXDictionary AddFile(string filePath, PBXGroup parent = null, string tree = "SOURCE_ROOT", bool createBuildFiles = true, bool weak = false) { PBXDictionary results = new PBXDictionary(); string absPath = string.Empty; if (Path.IsPathRooted(filePath)) { absPath = filePath; } else if (tree.CompareTo("SDKROOT") != 0) { absPath = Path.Combine(Application.dataPath, filePath); } if (tree.CompareTo("SOURCE_ROOT") == 0) { System.Uri fileURI = new System.Uri(absPath); System.Uri rootURI = new System.Uri((projectRootPath + "/.")); filePath = rootURI.MakeRelativeUri(fileURI).ToString(); } if (parent == null) { parent = _rootGroup; } // TODO: Aggiungere controllo se file già presente PBXFileReference fileReference = GetFile(System.IO.Path.GetFileName(filePath)); if (fileReference != null) { return(null); } fileReference = new PBXFileReference(filePath, (TreeEnum)System.Enum.Parse(typeof(TreeEnum), tree)); parent.AddChild(fileReference); fileReferences.Add(fileReference); results.Add(fileReference.guid, fileReference); // Find test target PBXNativeTarget nativeTestTarget = null; foreach (KeyValuePair <string, PBXNativeTarget> currentObject in nativeTargets) { PBXNativeTarget nativeTargetObj = currentObject.Value; if (nativeTargetObj != null && nativeTargetObj.data.ContainsKey("name")) { string name = (string)nativeTargetObj.data["name"]; if (name != null && name.Contains("Unity-iPhone Tests")) { nativeTestTarget = nativeTargetObj; break; } } } //Create a build file for reference if (!string.IsNullOrEmpty(fileReference.buildPhase) && createBuildFiles) { PBXBuildFile buildFile; switch (fileReference.buildPhase) { case "PBXFrameworksBuildPhase": foreach (KeyValuePair <string, PBXFrameworksBuildPhase> currentObject in frameworkBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } if (!string.IsNullOrEmpty(absPath) && (tree.CompareTo("SOURCE_ROOT") == 0) && File.Exists(absPath)) { string libraryPath = Path.Combine("$(SRCROOT)", Path.GetDirectoryName(filePath)); this.AddLibrarySearchPaths(new PBXList(libraryPath)); } break; case "PBXResourcesBuildPhase": foreach (KeyValuePair <string, PBXResourcesBuildPhase> currentObject in resourcesBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case "PBXShellScriptBuildPhase": foreach (KeyValuePair <string, PBXShellScriptBuildPhase> currentObject in shellScriptBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case "PBXSourcesBuildPhase": foreach (KeyValuePair <string, PBXSourcesBuildPhase> currentObject in sourcesBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case "PBXCopyFilesBuildPhase": foreach (KeyValuePair <string, PBXCopyFilesBuildPhase> currentObject in copyBuildPhases) { if (nativeTestTarget == null || !nativeTestTarget.HasBuildphase(currentObject.Key.Split(' ')[0])) { buildFile = new PBXBuildFile(fileReference, weak); buildFiles.Add(buildFile); currentObject.Value.AddBuildFile(buildFile); } } break; case null: Debug.LogWarning("fase non supportata null"); break; default: Debug.LogWarning("fase non supportata def"); return(null); } } return(results); }