Пример #1
0
    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;
        }
    }
Пример #2
0
    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;
    }
Пример #3
0
    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;
    }
Пример #4
0
    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;
    }
Пример #5
0
        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();
        }
Пример #6
0
        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;
            }
        }
Пример #7
0
        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);
        }