├── XcodeEdit.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── XcodeEdit_Info.plist ├── Info.plist ├── xcshareddata │ └── xcschemes │ │ ├── XcodeEdit-Package.xcscheme │ │ ├── XcodeEdit.xcscheme │ │ └── XcodeEdit-macOS.xcscheme └── project.pbxproj ├── Test_projects ├── SpmDependency.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── project.pbxproj ├── ExternalBuildTool.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── project.pbxproj ├── README.md └── HelloCpp.xcodeproj │ └── project.pbxproj ├── Example ├── XcodeEdit-Example.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── project.pbxproj └── XcodeEdit-Example │ └── main.swift ├── .github └── workflows │ └── swift.yml ├── Package.swift ├── .gitignore ├── Sources └── XcodeEdit │ ├── Extensions.swift │ ├── XCProjectFile+Rswift.swift │ ├── PBXIdentifier.swift │ ├── PBXObject+Fields.swift │ ├── XCProjectFile.swift │ ├── AllObjects.swift │ ├── Serialization.swift │ └── PBXObject.swift ├── XcodeEdit.podspec ├── LICENSE └── README.md /XcodeEdit.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /Test_projects/SpmDependency.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Test_projects/ExternalBuildTool.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/XcodeEdit-Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/workflows/swift.yml: -------------------------------------------------------------------------------- 1 | name: Swift 2 | 3 | on: 4 | push: 5 | branches: [ develop ] 6 | pull_request: 7 | branches: '*' 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Build 17 | run: swift build -v 18 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/XcodeEdit-Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Test_projects/SpmDependency.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Test_projects/ExternalBuildTool.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.0 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "XcodeEdit", 6 | platforms: [ 7 | .macOS(.v10_10) 8 | ], 9 | products: [ 10 | .library(name: "XcodeEdit", targets: ["XcodeEdit"]), 11 | ], 12 | dependencies: [], 13 | targets: [ 14 | .target(name: "XcodeEdit"), 15 | ] 16 | ) 17 | 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac 2 | .DS_Store 3 | 4 | # Xcode 5 | # 6 | build/ 7 | *.pbxuser 8 | !default.pbxuser 9 | *.mode1v3 10 | !default.mode1v3 11 | *.mode2v3 12 | !default.mode2v3 13 | *.perspectivev3 14 | !default.perspectivev3 15 | xcuserdata 16 | *.xccheckout 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | *.xcuserstate 22 | *.xcscmblueprint 23 | 24 | # CocoaPods 25 | # 26 | Pods/ 27 | 28 | # SPM 29 | # 30 | .build 31 | 32 | -------------------------------------------------------------------------------- /Test_projects/README.md: -------------------------------------------------------------------------------- 1 | # Test projects 2 | 3 | Sources: 4 | 5 | * ExternalBuildTool.xcodeproj: https://github.com/mac-cain13/R.swift/issues/419 6 | * HelloCpp.xcodeproj: https://github.com/cocos2d/cocos2d-x/tree/v3/templates/cpp-template-default/proj.ios_mac 7 | * Security.xcodeproj: http://www.opensource.apple.com/source/Security/Security-55179.1/ 8 | * SpmDependency.xcodeproj: https://github.com/mac-cain13/R.swift/issues/536 9 | 10 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extensions.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2015-08-29. 6 | // Copyright © 2015 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | internal func += (left: inout Dictionary, right: Dictionary) { 12 | for (k, v) in right { 13 | left.updateValue(v, forKey: k) 14 | } 15 | } 16 | 17 | internal extension Sequence { 18 | func grouped(by keyForValue: (Element) -> Key) -> [Key: [Element]] { 19 | return Dictionary(grouping: self, by: keyForValue) 20 | } 21 | 22 | func sorted(by comparableForValue: (Element) -> U) -> [Iterator.Element] { 23 | return self.sorted { comparableForValue($0) < comparableForValue($1) } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/XcodeEdit_Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundleDevelopmentRegion 5 | en 6 | CFBundleExecutable 7 | $(EXECUTABLE_NAME) 8 | CFBundleIdentifier 9 | $(PRODUCT_BUNDLE_IDENTIFIER) 10 | CFBundleInfoDictionaryVersion 11 | 6.0 12 | CFBundleName 13 | $(PRODUCT_NAME) 14 | CFBundlePackageType 15 | FMWK 16 | CFBundleShortVersionString 17 | 1.0 18 | CFBundleSignature 19 | ???? 20 | CFBundleVersion 21 | $(CURRENT_PROJECT_VERSION) 22 | NSPrincipalClass 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /XcodeEdit.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "XcodeEdit" 3 | s.version = "2.7.7" 4 | s.license = "MIT" 5 | 6 | s.summary = "Reading and writing the Xcode pbxproj file format, from Swift!" 7 | 8 | s.description = <<-DESC 9 | The main goal of this project is to generate project.pbxproj files in the legacy OpenStep format used by Xcode. Using this, a project file can be modified without changing it to XML format and causing a huge git diff. 10 | DESC 11 | 12 | s.authors = { "Tom Lokhorst" => "tom@lokhorst.eu" } 13 | s.social_media_url = "https://twitter.com/tomlokhorst" 14 | s.homepage = "https://github.com/tomlokhorst/XcodeEdit" 15 | 16 | s.ios.deployment_target = '9.0' 17 | s.osx.deployment_target = '10.11' 18 | 19 | s.source = { :git => "https://github.com/tomlokhorst/XcodeEdit.git", :tag => s.version } 20 | s.source_files = "Sources/XcodeEdit" 21 | s.swift_version = '5.1' 22 | 23 | end 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2023 Tom Lokhorst 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Example/XcodeEdit-Example/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // Example 4 | // 5 | // Created by Tom Lokhorst on 2015-08-14. 6 | // Copyright (c) 2015 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let args = CommandLine.arguments 12 | 13 | if args.count < 2 { 14 | print("Call with a .xcodeproj, e.g.: \"$SRCROOT/../Test projects/HelloCpp.xcodeproj\"") 15 | } 16 | 17 | let start = Date() 18 | 19 | // The xcodeproj file to load, test this with your own project! 20 | let xcodeproj = URL(fileURLWithPath: args[1]) 21 | let proj = try! XCProjectFile(xcodeprojURL: xcodeproj) 22 | 23 | //for obj in proj.allObjects.objects.values { 24 | // if let dep = obj as? XCSwiftPackageProductDependency { 25 | // if dep.productName?.hasPrefix("plugin:") == true { 26 | // dep.removePackage() 27 | // } 28 | // } 29 | //} 30 | 31 | // Write out a new pbxproj file 32 | try! proj.write(to: xcodeproj, format: .plist(.openStep)) 33 | 34 | let time = Date().timeIntervalSince(start) 35 | print("Timeinterval: \(time)") 36 | 37 | exit(0) 38 | 39 | // Print paths for all files in Resources build phases 40 | //for target in proj.project.targets.flatMap({ $0.value }) { 41 | // for resourcesBuildPhase in target.buildPhases.flatMap({ $0.value }) { 42 | // let files = resourcesBuildPhase.files.flatMap { $0.value } 43 | // for file in files { 44 | // if let fileReference = file.fileRef?.value as? PBXFileReference { 45 | // print(fileReference.fullPath!) 46 | // } 47 | // // Variant groups are localizable 48 | // else if let variantGroup = file.fileRef?.value as? PBXVariantGroup { 49 | // let fileRefs = variantGroup.fileRefs.flatMap { $0.value } 50 | // for variantFileReference in fileRefs { 51 | // print(variantFileReference.fullPath!) 52 | // } 53 | // } 54 | // } 55 | // } 56 | //} 57 | 58 | // Print shells 59 | for target in proj.project.targets.compactMap({ $0.value }) { 60 | 61 | print("Target \(target.name) - \(target.isa): \(target.buildPhases.count)") 62 | for bc in target.buildConfigurationList.value!.buildConfigurations.map({ $0.value! }) { 63 | print(bc.fields) 64 | } 65 | print("--") 66 | 67 | for buildPhase in target.buildPhases { 68 | print(buildPhase.value!) 69 | // if let shellScriptPhase = buildPhase.value as? PBXShellScriptBuildPhase { 70 | // print(shellScriptPhase.shellScript) 71 | // } 72 | print() 73 | } 74 | 75 | } 76 | 77 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/XCProjectFile+Rswift.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XCProjectFile+Rswift.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2017-12-28. 6 | // Copyright © 2017 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // Mutation functions needed by R.swift 12 | extension XCProjectFile { 13 | 14 | public func addReference(value: Value) -> Reference { 15 | return allObjects.createReference(value: value) 16 | } 17 | 18 | public func createShellScript(name: String, shellScript: String) throws -> PBXShellScriptBuildPhase { 19 | let fields: [String: Any] = [ 20 | "isa": "PBXShellScriptBuildPhase", 21 | "files": [] as [String], 22 | "name": name, 23 | "runOnlyForDeploymentPostprocessing": 0, 24 | "shellPath": "/bin/sh", 25 | "inputPaths": [] as [String], 26 | "outputPaths": [] as [String], 27 | "shellScript": shellScript, 28 | "buildActionMask": 0x7FFFFFFF 29 | ] 30 | 31 | let guid = allObjects.createFreshGuid(from: project.id) 32 | let scriptBuildPhase = try PBXShellScriptBuildPhase(id: guid, fields: fields, allObjects: allObjects) 33 | 34 | return scriptBuildPhase 35 | } 36 | 37 | public func createFileReference(path: String, name: String, sourceTree: SourceTree, lastKnownFileType: String = "sourcecode.swift") throws -> PBXFileReference { 38 | 39 | var fields: [String: Any] = [ 40 | "isa": "PBXFileReference", 41 | "lastKnownFileType": lastKnownFileType, 42 | "path": path, 43 | "sourceTree": sourceTree.rawValue 44 | ] 45 | 46 | if name != path { 47 | fields["name"] = name 48 | } 49 | 50 | let guid = allObjects.createFreshGuid(from: project.id) 51 | let fileReference = try PBXFileReference(id: guid, fields: fields, allObjects: allObjects) 52 | 53 | return fileReference 54 | } 55 | 56 | public func createBuildFile(fileReference: Reference) throws -> PBXBuildFile { 57 | 58 | let fields: [String: Any] = [ 59 | "isa": "PBXBuildFile", 60 | "fileRef": fileReference.id.value 61 | ] 62 | 63 | let guid = allObjects.createFreshGuid(from: project.id) 64 | let buildFile = try PBXBuildFile(id: guid, fields: fields, allObjects: allObjects) 65 | 66 | return buildFile 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/xcshareddata/xcschemes/XcodeEdit-Package.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 62 | 63 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/xcshareddata/xcschemes/XcodeEdit.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/xcshareddata/xcschemes/XcodeEdit-macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/PBXIdentifier.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PBXIdentifier.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2017-12-27. 6 | // Copyright © 2017 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // Based on: https://pewpewthespells.com/blog/pbxproj_identifiers.html 12 | 13 | public struct PBXIdentifier { 14 | let user: UInt8 // encoded username 15 | let pid: UInt8 // encoded current pid # 16 | var _random: UInt16 // encoded random value 17 | var _time: UInt32 // encoded time value 18 | let zero: UInt8 // zero 19 | let host_shift: UInt8 // encoded, shifted hostid 20 | let host_h: UInt8 // high byte of lower bytes of hostid 21 | let host_l: UInt8 // low byte of lower bytes of hostid 22 | 23 | public init?(string stringValue: String) { 24 | guard 25 | let user = stringValue.uint8(at: 0), 26 | let pid = stringValue.uint8(at: 2), 27 | let _random = stringValue.uint16(at: 4), 28 | let _time = stringValue.uint32(at: 8), 29 | let zero = stringValue.uint8(at: 16), 30 | let host_shift = stringValue.uint8(at: 18), 31 | let host_h = stringValue.uint8(at: 20), 32 | let host_l = stringValue.uint8(at: 22) 33 | else { return nil} 34 | 35 | self.user = user 36 | self.pid = pid 37 | self._random = _random 38 | self._time = _time 39 | self.zero = zero 40 | self.host_shift = host_shift 41 | self.host_h = host_h 42 | self.host_l = host_l 43 | } 44 | 45 | public var stringValue: String { 46 | let parts = [ 47 | String(format: "%02X", user), 48 | String(format: "%02X", pid), 49 | String(format: "%04X", _random), 50 | String(format: "%08X", _time), 51 | String(format: "%02X", zero), 52 | String(format: "%02X", host_shift), 53 | String(format: "%02X", host_h), 54 | String(format: "%02X", host_l) 55 | ] 56 | 57 | return parts.joined() 58 | } 59 | 60 | public func createFreshIdentifier() -> PBXIdentifier { 61 | var result = self 62 | result._time = UInt32(Date.timeIntervalSinceReferenceDate) 63 | result._random = UInt16.random(in: 0.. UInt8? { 71 | guard let str = self.substring(from: index, length: 2) else { return nil } 72 | return UInt8(str, radix: 16) 73 | } 74 | 75 | func uint16(at index: Int) -> UInt16? { 76 | guard let str = self.substring(from: index, length: 4) else { return nil } 77 | return UInt16(str, radix: 16) 78 | } 79 | 80 | func uint32(at index: Int) -> UInt32? { 81 | guard let str = self.substring(from: index, length: 8) else { return nil } 82 | return UInt32(str, radix: 16) 83 | } 84 | 85 | private func substring(from: Int, length: Int) -> String.SubSequence? { 86 | guard from + length <= self.count else { return nil } 87 | 88 | let start = self.index(startIndex, offsetBy: from) 89 | let end = self.index(start, offsetBy: length) 90 | 91 | return self[start.. 2 |
3 | 4 | Reading _and writing_ the Xcode pbxproj file format, from Swift! 5 | 6 | The main goal of this project is to generate `project.pbxproj` files in the legacy OpenStep format used by Xcode. Using this, a project file can be modified without changing it to XML format and causing a huge git diff. 7 | 8 | Currently, this project is mostly used to support [R.swift](https://github.com/mac-cain13/R.swift). 9 | 10 | ⚠️ Limited support for modificiation 11 | ----- 12 | 13 | At this time, there are only limited APIs for modifying a project file. 14 | Only features that are actually needed by R.swift are implemented. There is no generic way to modify the project strucuture. 15 | 16 | 17 | Usage 18 | ----- 19 | 20 | This reads a xcodeproj file (possibly in XML format), and writes it back out in OpenStep format: 21 | 22 | ```swift 23 | let xcodeproj = URL(fileURLWithPath: "Test.xcodeproj") 24 | 25 | let proj = try! XCProjectFile(xcodeprojURL: xcodeproj) 26 | 27 | try! proj.write(to: xcodeproj, format: PropertyListSerialization.PropertyListFormat.openStep) 28 | ``` 29 | 30 | 31 | Releases 32 | -------- 33 | 34 | - 2.13.0 - 2025-03-16 - Fix serialization for Xcode 16 projects 35 | - 2.12.0 - 2025-02-08 - Fix Linux support 36 | - 2.11.1 - 2024-11-03 - Make syncGroups property internal 37 | - 2.11.0 - 2024-11-03 - Add computed fullPath to PBXFileSystemSynchronizedRootGroup 38 | - 2.10.2 - 2024-09-24 - Add PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet 39 | - 2.10.1 - 2024-09-19 - Serialization fix for file system synchronized directories 40 | - 2.10.0 - 2024-09-19 - Add support for file system synchronized directories in Xcode 16 41 | - 2.9.2 - 2023-09-20 - Fix warnings in Xcode 15 42 | - 2.9.1 - 2023-09-10 - Add support for local Swift packages 43 | - 2.9.0 - 2022-11-07 - Add removePackage function to XCSwiftPackageProductDependency 44 | - 2.8.0 - 2021-11-17 - Add fields to PBXShellScriptBuildPhase 45 | - 2.7.7 - 2020-05-08 - Add support for remote swift packages 46 | - 2.7.6 - 2020-04-25 - Add support for SPM product dependencies 47 | - 2.7.5 - 2020-02-13 - Add support for PBXBuildRule 48 | - 2.7.4 - 2019-10-04 - Improved parsing of optional fields 49 | - 2.7.3 - 2019-07-28 - Use Swift native random function 50 | - 2.7.2 - 2019-07-28 - Improved suport for SPM 51 | - 2.7.0 - 2019-06-10 - Add suport for Xcode 13 SPM objects 52 | - 2.6.0 - 2019-01-23 - Improved error messages for broken project files 53 | - 2.5.2 - 2018-12-30 - Fixes incorrect generation of relative URLs, again 54 | - 2.5.1 - 2018-12-28 - Fixes incorrect generation of relative URLs 55 | - 2.5.0 - 2018-12-11 - Improve serialization for escaped identifiers in pbxproj 56 | - 2.4.2 - 2018-10-03 - Fix escaped strings in serializer 57 | - 2.4.0 - 2018-07-03 - Add support for SourceTreeFolder type `PLATFORM_DIR` 58 | - 2.3.0 - 2018-06-17 - Add support for PBXLegacyTarget 59 | - 2.2.0 - 2018-04-04 - Swift 4.1 support 60 | - 2.1.0 - 2018-01-23 - Add some specific modification functions for R.swift 61 | - **2.0.0** - 2017-12-17 - Support parsing for "broken" project files 62 | - 1.1.0 - 2017-05-07 - Error types now public 63 | - **1.0.0** - 2017-03-28 - Rename from Xcode.swift to XcodeEdit 64 | - **0.3.0** - 2016-04-27 - Fixes to SourceTreeFolder 65 | - 0.2.1 - 2015-12-30 - Add missing PBXProxyReference class 66 | - **0.2.0** - 2015-10-29 - Adds serialization support 67 | - **0.1.0** - 2015-09-28 - Initial public release 68 | 69 | 70 | Licence & Credits 71 | ----------------- 72 | 73 | XcodeEdit is written by [Tom Lokhorst](https://twitter.com/tomlokhorst) and available under the [MIT license](https://github.com/tomlokhorst/XcodeEdit/blob/develop/LICENSE), so feel free to use it in commercial and non-commercial projects. 74 | 75 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/PBXObject+Fields.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PBXObject+Fields.swift 3 | // Example 4 | // 5 | // Created by Tom Lokhorst on 2017-04-23. 6 | // Copyright © 2017 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | internal extension Dictionary where Key == Guid, Value == AnyObject { 12 | mutating func set(key: Guid, reference: Reference?) { 13 | if let reference = reference { 14 | self[key] = reference.id.value as NSString 15 | } 16 | else { 17 | self[key] = nil 18 | } 19 | } 20 | } 21 | 22 | internal extension Dictionary where Key == String { 23 | 24 | func id(_ key: String) throws -> Guid { 25 | guard let val = self[key] else { 26 | throw AllObjectsError.fieldMissing(key: key) 27 | } 28 | guard let value = val as? String else { 29 | throw AllObjectsError.wrongType(key: key) 30 | } 31 | 32 | return Guid(value) 33 | } 34 | 35 | func optionalId(_ key: String) throws -> Guid? { 36 | guard let val = self[key] else { 37 | return nil 38 | } 39 | guard let value = val as? String else { 40 | throw AllObjectsError.wrongType(key: key) 41 | } 42 | 43 | return Guid(value) 44 | } 45 | 46 | func ids(_ key: String) throws -> [Guid] { 47 | guard let val = self[key] else { 48 | throw AllObjectsError.fieldMissing(key: key) 49 | } 50 | guard let value = val as? [String] else { 51 | throw AllObjectsError.wrongType(key: key) 52 | } 53 | 54 | return value.map(Guid.init) 55 | } 56 | 57 | func optionalIds(_ key: String) throws -> [Guid]? { 58 | guard let val = self[key] else { 59 | return nil 60 | } 61 | guard let value = val as? [String] else { 62 | throw AllObjectsError.wrongType(key: key) 63 | } 64 | 65 | return value.map(Guid.init) 66 | } 67 | 68 | func bool(_ key: String) throws -> Bool { 69 | guard let val = self[key] else { 70 | throw AllObjectsError.fieldMissing(key: key) 71 | } 72 | guard let value = val as? String else { 73 | throw AllObjectsError.wrongType(key: key) 74 | } 75 | 76 | switch value { 77 | case "0": 78 | return false 79 | 80 | case "1": 81 | return true 82 | 83 | default: 84 | throw AllObjectsError.wrongType(key: key) 85 | } 86 | } 87 | 88 | func optionalBool(_ key: String) throws -> Bool? { 89 | guard let _ = self[key] else { 90 | return nil 91 | } 92 | 93 | return try bool(key) 94 | } 95 | 96 | func optionalURL(_ key: String) throws -> URL? { 97 | guard let val = self[key] else { 98 | return nil 99 | } 100 | guard let value = val as? String else { 101 | throw AllObjectsError.wrongType(key: key) 102 | } 103 | guard let url = URL(string: value) else { 104 | throw AllObjectsError.wrongType(key: key) 105 | } 106 | 107 | return url 108 | } 109 | 110 | func string(_ key: String) throws -> String { 111 | guard let val = self[key] else { 112 | throw AllObjectsError.fieldMissing(key: key) 113 | } 114 | guard let value = val as? String else { 115 | throw AllObjectsError.wrongType(key: key) 116 | } 117 | 118 | return value 119 | } 120 | 121 | func optionalString(_ key: String) throws -> String? { 122 | guard let val = self[key] else { 123 | return nil 124 | } 125 | guard let value = val as? String else { 126 | throw AllObjectsError.wrongType(key: key) 127 | } 128 | 129 | return value 130 | } 131 | 132 | func strings(_ key: String) throws -> [String] { 133 | guard let val = self[key] else { 134 | throw AllObjectsError.fieldMissing(key: key) 135 | } 136 | guard let value = val as? [String] else { 137 | throw AllObjectsError.wrongType(key: key) 138 | } 139 | 140 | return value 141 | } 142 | 143 | func optionalStrings(_ key: String) throws -> [String]? { 144 | guard let val = self[key] else { 145 | return nil 146 | } 147 | guard let value = val as? [String] else { 148 | throw AllObjectsError.wrongType(key: key) 149 | } 150 | 151 | return value 152 | } 153 | 154 | func fields(_ key: String) throws -> Fields { 155 | guard let val = self[key] else { 156 | throw AllObjectsError.fieldMissing(key: key) 157 | } 158 | guard let value = val as? Fields else { 159 | throw AllObjectsError.wrongType(key: key) 160 | } 161 | 162 | return value 163 | } 164 | 165 | func optionalFields(_ key: String) throws -> Fields? { 166 | guard let val = self[key] else { 167 | return nil 168 | } 169 | guard let value = val as? Fields else { 170 | throw AllObjectsError.wrongType(key: key) 171 | } 172 | 173 | return value 174 | } 175 | 176 | func fieldsArray(_ key: String) throws -> [Fields] { 177 | guard let val = self[key] else { 178 | throw AllObjectsError.fieldMissing(key: key) 179 | } 180 | guard let value = val as? [Fields] else { 181 | throw AllObjectsError.wrongType(key: key) 182 | } 183 | 184 | return value 185 | } 186 | 187 | func optionalFieldsArray(_ key: String) throws -> [Fields]? { 188 | guard let val = self[key] else { 189 | return nil 190 | } 191 | guard let value = val as? [Fields] else { 192 | throw AllObjectsError.wrongType(key: key) 193 | } 194 | 195 | return value 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/XCProjectFile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XCProjectFile.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2015-08-12. 6 | // Copyright (c) 2015 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public enum ProjectFileError: LocalizedError { 12 | case invalidData 13 | case notXcodeproj 14 | case missingPbxproj 15 | case internalInconsistency([ReferenceError]) 16 | 17 | public var errorDescription: String? { 18 | switch self { 19 | case .invalidData: 20 | return "Data in .pbxproj file not in expected format" 21 | 22 | case .notXcodeproj: 23 | return "Path is not a .xcodeproj package" 24 | 25 | case .missingPbxproj: 26 | return "project.pbxproj file missing" 27 | 28 | case .internalInconsistency(let errors): 29 | var str = "project.pbxproj is internally inconsistent.\n\n" 30 | 31 | for error in errors { 32 | switch error { 33 | case let .deadReference(type, id, keyPath, ref): 34 | str += " - \(type) (\(id.value)) references missing \(keyPath) \(ref.value)\n" 35 | 36 | case let .orphanObject(type, id): 37 | str += " - \(type) (\(id.value)) is not used\n" 38 | } 39 | } 40 | 41 | str += "\nPerhaps a merge conflict?\n" 42 | 43 | return str 44 | } 45 | } 46 | } 47 | 48 | public class XCProjectFile { 49 | public enum Format { 50 | case plist(PropertyListSerialization.PropertyListFormat) 51 | case json 52 | } 53 | 54 | public let project: PBXProject 55 | let fields: Fields 56 | var format: Format 57 | let objectVersion: String 58 | let allObjects = AllObjects() 59 | 60 | internal var isDetailedFileSystemSynchronization: Bool { 61 | objectVersion >= "77" 62 | } 63 | 64 | public convenience init(xcodeprojURL: URL, ignoreReferenceErrors: Bool = false) throws { 65 | let pbxprojURL = xcodeprojURL.appendingPathComponent("project.pbxproj", isDirectory: false) 66 | let data = try Data(contentsOf: pbxprojURL) 67 | 68 | try self.init(propertyListData: data, ignoreReferenceErrors: ignoreReferenceErrors) 69 | } 70 | 71 | public convenience init(propertyListData data: Data, ignoreReferenceErrors: Bool = false) throws { 72 | do { 73 | var format = PropertyListSerialization.PropertyListFormat.openStep 74 | let obj = try PropertyListSerialization.propertyList(from: data, options: [], format: &format) 75 | 76 | guard let fields = obj as? Fields else { 77 | throw ProjectFileError.invalidData 78 | } 79 | 80 | try self.init(fields: fields, format: .plist(format), ignoreReferenceErrors: ignoreReferenceErrors) 81 | } catch CocoaError.propertyListReadCorrupt { 82 | let obj = try JSONSerialization.jsonObject(with: data) 83 | 84 | guard let fields = obj as? Fields else { 85 | throw ProjectFileError.invalidData 86 | } 87 | 88 | try self.init(fields: fields, format: .json, ignoreReferenceErrors: ignoreReferenceErrors) 89 | } 90 | } 91 | 92 | private init(fields: Fields, format: Format, ignoreReferenceErrors: Bool = false) throws { 93 | 94 | guard let objects = fields["objects"] as? [String: Fields] else { 95 | throw AllObjectsError.wrongType(key: "objects") 96 | } 97 | 98 | for (key, obj) in objects { 99 | allObjects.objects[Guid(key)] = try AllObjects.createObject(Guid(key), fields: obj, allObjects: allObjects) 100 | } 101 | 102 | let rootObjectId = Guid(try fields.string("rootObject")) 103 | guard let projectFields = objects[rootObjectId.value] else { 104 | throw AllObjectsError.objectMissing(id: rootObjectId) 105 | } 106 | 107 | let project = try PBXProject(id: rootObjectId, fields: projectFields, allObjects: allObjects) 108 | guard let mainGroup = project.mainGroup.value else { 109 | throw AllObjectsError.objectMissing(id: project.mainGroup.id) 110 | } 111 | 112 | if !ignoreReferenceErrors { 113 | _ = allObjects.createReference(id: rootObjectId) 114 | try allObjects.validateReferences() 115 | } 116 | 117 | self.fields = fields 118 | self.format = format 119 | self.project = project 120 | self.objectVersion = try fields.string("objectVersion") 121 | self.allObjects.fullFilePaths = paths(mainGroup, prefix: "") 122 | } 123 | 124 | internal static func projectName(from url: URL) throws -> String { 125 | 126 | let subpaths = url.pathComponents 127 | guard let last = subpaths.last, 128 | let range = last.range(of: ".xcodeproj") 129 | else { 130 | throw ProjectFileError.notXcodeproj 131 | } 132 | 133 | return String(last[.. [Guid: Path] { 137 | 138 | var ps: [Guid: Path] = [:] 139 | 140 | let fileRefs = current.fileRefs.compactMap { $0.value } 141 | for file in fileRefs { 142 | guard let path = file.path else { continue } 143 | 144 | switch file.sourceTree { 145 | case .group: 146 | switch current.sourceTree { 147 | case .absolute: 148 | ps[file.id] = .absolute(prefix + path) 149 | 150 | case .group: 151 | ps[file.id] = .relativeTo(.sourceRoot, prefix + path) 152 | 153 | case .relativeTo(let sourceTreeFolder): 154 | ps[file.id] = .relativeTo(sourceTreeFolder, prefix + path) 155 | } 156 | 157 | case .absolute: 158 | ps[file.id] = .absolute(path) 159 | 160 | case let .relativeTo(sourceTreeFolder): 161 | ps[file.id] = .relativeTo(sourceTreeFolder, path) 162 | } 163 | } 164 | 165 | let syncRoots = current.syncRoots.compactMap { $0.value } 166 | for sync in syncRoots { 167 | guard let path = sync.path else { continue } 168 | 169 | switch sync.sourceTree { 170 | case .group: 171 | switch current.sourceTree { 172 | case .absolute: 173 | ps[sync.id] = .absolute(prefix + path) 174 | 175 | case .group: 176 | ps[sync.id] = .relativeTo(.sourceRoot, prefix + path) 177 | 178 | case .relativeTo(let sourceTreeFolder): 179 | ps[sync.id] = .relativeTo(sourceTreeFolder, prefix + path) 180 | } 181 | 182 | case .absolute: 183 | ps[sync.id] = .absolute(path) 184 | 185 | case let .relativeTo(sourceTreeFolder): 186 | ps[sync.id] = .relativeTo(sourceTreeFolder, path) 187 | } 188 | } 189 | 190 | let subGroups = current.subGroups.compactMap { $0.value } 191 | for group in subGroups { 192 | if let path = group.path { 193 | 194 | let str: String 195 | 196 | switch group.sourceTree { 197 | case .absolute: 198 | str = path 199 | 200 | case .group: 201 | str = prefix + path 202 | 203 | case .relativeTo(.sourceRoot): 204 | str = path 205 | 206 | case .relativeTo(.buildProductsDir): 207 | str = path 208 | 209 | case .relativeTo(.developerDir): 210 | str = path 211 | 212 | case .relativeTo(.sdkRoot): 213 | str = path 214 | 215 | case .relativeTo(.platformDir): 216 | str = path 217 | } 218 | 219 | ps += paths(group, prefix: str + "/") 220 | } 221 | else { 222 | ps += paths(group, prefix: prefix) 223 | } 224 | } 225 | 226 | return ps 227 | } 228 | 229 | } 230 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/AllObjects.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AllObjects.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2017-03-27. 6 | // Copyright © 2017 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public enum AllObjectsError: Error { 12 | case fieldMissing(key: String) 13 | case wrongType(key: String) 14 | case objectMissing(id: Guid) 15 | } 16 | 17 | public enum ReferenceError: Error { 18 | case deadReference(type: String, id: Guid, keyPath: String, ref: Guid) 19 | case orphanObject(type: String, id: Guid) 20 | } 21 | 22 | public struct Guid : Hashable, Comparable { 23 | public let value: String 24 | 25 | public init(_ value: String) { 26 | self.value = value 27 | } 28 | 29 | static public func <(lhs: Guid, rhs: Guid) -> Bool { 30 | return lhs.value < rhs.value 31 | } 32 | } 33 | 34 | public struct Reference : Hashable, Comparable { 35 | internal let allObjects: AllObjects 36 | 37 | public let id: Guid 38 | 39 | internal init(allObjects: AllObjects, id: Guid) { 40 | self.allObjects = allObjects 41 | self.id = id 42 | } 43 | 44 | public var value: Value? { 45 | guard let object = allObjects.objects[id] as? Value else { return nil } 46 | 47 | return object 48 | } 49 | 50 | static public func ==(lhs: Reference, rhs: Reference) -> Bool { 51 | return lhs.id == rhs.id 52 | } 53 | 54 | public func hash(into hasher: inout Hasher) { 55 | hasher.combine(id.value) 56 | } 57 | 58 | static public func <(lhs: Reference, rhs: Reference) -> Bool { 59 | return lhs.id < rhs.id 60 | } 61 | } 62 | 63 | public class AllObjects { 64 | internal var objects: [Guid: PBXObject] = [:] 65 | internal var fullFilePaths: [Guid: Path] = [:] 66 | internal var refCounts: [Guid: Int] = [:] 67 | 68 | internal func createReferences(ids: [Guid]) -> [Reference] { 69 | return ids.map(createReference) 70 | } 71 | 72 | internal func createOptionalReferences(ids: [Guid]?) -> [Reference]? { 73 | ids.map { createReferences(ids: $0) } 74 | } 75 | 76 | internal func createOptionalReference(id: Guid?) -> Reference? { 77 | guard let id = id else { return nil } 78 | return createReference(id: id) 79 | } 80 | 81 | internal func createReference(id: Guid) -> Reference { 82 | refCounts[id, default: 0] += 1 83 | 84 | let ref: Reference = Reference(allObjects: self, id: id) 85 | return ref 86 | } 87 | 88 | internal func createReference(value: Value) -> Reference { 89 | refCounts[value.id, default: 0] += 1 90 | 91 | objects[value.id] = value 92 | let ref: Reference = Reference(allObjects: self, id: value.id) 93 | return ref 94 | } 95 | 96 | internal func removeReference(_ ref: Reference?) { 97 | guard let ref = ref else { return } 98 | guard let count = refCounts[ref.id], count > 0 else { 99 | assertionFailure("refCount[\(ref.id)] is \(refCounts[ref.id]?.description ?? "nil")") 100 | return 101 | } 102 | 103 | refCounts[ref.id] = count - 1 104 | 105 | if count == 1 { 106 | objects[ref.id] = nil 107 | } 108 | } 109 | 110 | internal func createFreshGuid(from original: Guid) -> Guid { 111 | // If original isn't a PBXIdentifier, just return a UUID 112 | guard let identifier = PBXIdentifier(string: original.value) else { 113 | return Guid(UUID().uuidString) 114 | } 115 | 116 | // Ten attempts at generating fresh identifier 117 | for _ in 0..<10 { 118 | let guid = Guid(identifier.createFreshIdentifier().stringValue) 119 | 120 | if objects.keys.contains(guid) { 121 | continue 122 | } 123 | 124 | return guid 125 | } 126 | 127 | // Fallback to UUID 128 | return Guid(UUID().uuidString) 129 | } 130 | 131 | internal static func createObject(_ id: Guid, fields: Fields, allObjects: AllObjects) throws -> PBXObject { 132 | let isa = try fields.string("isa") 133 | if let type = types[isa] { 134 | return try type.init(id: id, fields: fields, allObjects: allObjects) 135 | } 136 | 137 | // Fallback 138 | assertionFailure("Unknown PBXObject subclass isa=\(isa)") 139 | return try PBXObject(id: id, fields: fields, allObjects: allObjects) 140 | } 141 | 142 | internal func validateReferences() throws { 143 | 144 | let refKeys = Set(refCounts.keys) 145 | let objKeys = Set(objects.keys) 146 | 147 | let deadRefs = refKeys.subtracting(objKeys).sorted() 148 | let orphanObjs = objKeys.subtracting(refKeys).sorted() 149 | 150 | var errors: [ReferenceError] = [] 151 | 152 | for (id, object) in objects { 153 | for (path, guid) in findGuids(object) { 154 | 155 | if !objKeys.contains(guid) { 156 | let error = ReferenceError.deadReference(type: object.isa, id: id, keyPath: path, ref: guid) 157 | errors.append(error) 158 | } 159 | } 160 | } 161 | 162 | for id in orphanObjs { 163 | guard let object = objects[id] else { continue } 164 | 165 | let error = ReferenceError.orphanObject(type: object.isa, id: id) 166 | errors.append(error) 167 | } 168 | 169 | if !deadRefs.isEmpty || !orphanObjs.isEmpty { 170 | if deadRefs.count + orphanObjs.count != errors.count { 171 | assertionFailure("Error count doesn't equal dead ref count + orphan object count") 172 | } 173 | throw ProjectFileError.internalInconsistency(errors) 174 | } 175 | } 176 | } 177 | 178 | private func referenceGuid(_ obj: Any) -> Guid? { 179 | 180 | // Should figure out a better way to test obj is of type Reference 181 | let m = Mirror(reflecting: obj) 182 | guard m.displayStyle == Mirror.DisplayStyle.`struct` else { return nil } 183 | 184 | return m.descendant("id") as? Guid 185 | } 186 | 187 | private func findGuids(_ obj: Any, parentPath: String? = nil) -> [(String, Guid)] { 188 | 189 | var result: [(String, Guid)] = [] 190 | 191 | var objMirror: Mirror? = Mirror(reflecting: obj) 192 | while let mirror = objMirror { 193 | defer { objMirror = objMirror?.superclassMirror } 194 | 195 | for child in mirror.children { 196 | 197 | guard let label = child.label else { continue } 198 | let path = parentPath.map { "\($0).\(label)" } ?? label 199 | let value = child.value 200 | 201 | let m = Mirror(reflecting: value) 202 | if m.displayStyle == Mirror.DisplayStyle.`struct` { 203 | if let guid = referenceGuid(value) { 204 | result.append((path, guid)) 205 | } 206 | } 207 | if m.displayStyle == Mirror.DisplayStyle.optional 208 | || m.displayStyle == Mirror.DisplayStyle.collection 209 | { 210 | for item in m.children { 211 | if let guid = referenceGuid(item.value) { 212 | result.append((path, guid)) 213 | } 214 | } 215 | } 216 | if m.displayStyle == Mirror.DisplayStyle.optional { 217 | if let element = m.children.first { 218 | for item in Mirror(reflecting: element.value).children { 219 | let vals = findGuids(item.value, parentPath: path) 220 | result.append(contentsOf: vals) 221 | } 222 | } 223 | } 224 | } 225 | } 226 | 227 | return result 228 | } 229 | 230 | private let types: [String: PBXObject.Type] = [ 231 | "PBXProject": PBXProject.self, 232 | "PBXContainerItemProxy": PBXContainerItemProxy.self, 233 | "PBXBuildFile": PBXBuildFile.self, 234 | "PBXCopyFilesBuildPhase": PBXCopyFilesBuildPhase.self, 235 | "PBXFrameworksBuildPhase": PBXFrameworksBuildPhase.self, 236 | "PBXHeadersBuildPhase": PBXHeadersBuildPhase.self, 237 | "PBXResourcesBuildPhase": PBXResourcesBuildPhase.self, 238 | "PBXShellScriptBuildPhase": PBXShellScriptBuildPhase.self, 239 | "PBXSourcesBuildPhase": PBXSourcesBuildPhase.self, 240 | "PBXBuildRule": PBXBuildRule.self, 241 | "PBXBuildStyle": PBXBuildStyle.self, 242 | "XCBuildConfiguration": XCBuildConfiguration.self, 243 | "PBXAggregateTarget": PBXAggregateTarget.self, 244 | "PBXLegacyTarget": PBXLegacyTarget.self, 245 | "PBXNativeTarget": PBXNativeTarget.self, 246 | "PBXTargetDependency": PBXTargetDependency.self, 247 | "XCSwiftPackageProductDependency": XCSwiftPackageProductDependency.self, 248 | "XCRemoteSwiftPackageReference": XCRemoteSwiftPackageReference.self, 249 | "XCLocalSwiftPackageReference": XCLocalSwiftPackageReference.self, 250 | "XCConfigurationList": XCConfigurationList.self, 251 | "PBXReference": PBXReference.self, 252 | "PBXReferenceProxy": PBXReferenceProxy.self, 253 | "PBXFileReference": PBXFileReference.self, 254 | "PBXGroup": PBXGroup.self, 255 | "PBXVariantGroup": PBXVariantGroup.self, 256 | "PBXFileSystemSynchronizedRootGroup": PBXFileSystemSynchronizedRootGroup.self, 257 | "PBXFileSystemSynchronizedBuildFileExceptionSet": PBXFileSystemSynchronizedBuildFileExceptionSet.self, 258 | "PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet": PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet.self, 259 | "XCVersionGroup": XCVersionGroup.self 260 | ] 261 | -------------------------------------------------------------------------------- /Example/XcodeEdit-Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E22195B21B7C6EDA00F58D3F /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = E22195B11B7C6EDA00F58D3F /* main.swift */; }; 11 | E242AE821E88E3FA00F4CCA5 /* AllObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = E242AE811E88E3FA00F4CCA5 /* AllObjects.swift */; }; 12 | E262D4451B7E21190057CCEE /* XCProjectFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = E262D4441B7E21190057CCEE /* XCProjectFile.swift */; }; 13 | E292B9C71B9236D900D75DE2 /* Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = E292B9C61B9236D900D75DE2 /* Serialization.swift */; }; 14 | E292B9CE1B932F3200D75DE2 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E292B9CC1B932F3200D75DE2 /* Extensions.swift */; }; 15 | E292B9CF1B932F3200D75DE2 /* PBXObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = E292B9CD1B932F3200D75DE2 /* PBXObject.swift */; }; 16 | E29B539C1FF53CC100D64F5E /* XCProjectFile+Rswift.swift in Sources */ = {isa = PBXBuildFile; fileRef = E29B539B1FF53CC100D64F5E /* XCProjectFile+Rswift.swift */; }; 17 | E2E755AD1FF40C9600177FED /* PBXIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2E755AC1FF40C9600177FED /* PBXIdentifier.swift */; }; 18 | E2FD157C1EACCA7E00772CF1 /* PBXObject+Fields.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FD157B1EACCA7E00772CF1 /* PBXObject+Fields.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXCopyFilesBuildPhase section */ 22 | E22195AC1B7C6EDA00F58D3F /* CopyFiles */ = { 23 | isa = PBXCopyFilesBuildPhase; 24 | buildActionMask = 12; 25 | dstPath = Test.xcodeproj; 26 | dstSubfolderSpec = 16; 27 | files = ( 28 | ); 29 | runOnlyForDeploymentPostprocessing = 0; 30 | }; 31 | /* End PBXCopyFilesBuildPhase section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | E22195AE1B7C6EDA00F58D3F /* XcodeEdit-Example */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "XcodeEdit-Example"; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | E22195B11B7C6EDA00F58D3F /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 36 | E242AE811E88E3FA00F4CCA5 /* AllObjects.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllObjects.swift; sourceTree = ""; }; 37 | E262D4441B7E21190057CCEE /* XCProjectFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCProjectFile.swift; sourceTree = ""; }; 38 | E292B9C61B9236D900D75DE2 /* Serialization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Serialization.swift; sourceTree = ""; }; 39 | E292B9CC1B932F3200D75DE2 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 40 | E292B9CD1B932F3200D75DE2 /* PBXObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PBXObject.swift; sourceTree = ""; }; 41 | E29B539B1FF53CC100D64F5E /* XCProjectFile+Rswift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCProjectFile+Rswift.swift"; sourceTree = ""; }; 42 | E2E755AC1FF40C9600177FED /* PBXIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PBXIdentifier.swift; sourceTree = ""; }; 43 | E2FD157B1EACCA7E00772CF1 /* PBXObject+Fields.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PBXObject+Fields.swift"; sourceTree = ""; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | E22195AB1B7C6EDA00F58D3F /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | ); 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | /* End PBXFrameworksBuildPhase section */ 55 | 56 | /* Begin PBXGroup section */ 57 | E22195A51B7C6EDA00F58D3F = { 58 | isa = PBXGroup; 59 | children = ( 60 | E22195B01B7C6EDA00F58D3F /* XcodeEdit-Example */, 61 | E262D4411B7E20AA0057CCEE /* XcodeEdit */, 62 | E22195AF1B7C6EDA00F58D3F /* Products */, 63 | ); 64 | indentWidth = 4; 65 | sourceTree = ""; 66 | tabWidth = 4; 67 | usesTabs = 0; 68 | }; 69 | E22195AF1B7C6EDA00F58D3F /* Products */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | E22195AE1B7C6EDA00F58D3F /* XcodeEdit-Example */, 73 | ); 74 | name = Products; 75 | sourceTree = ""; 76 | }; 77 | E22195B01B7C6EDA00F58D3F /* XcodeEdit-Example */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | E22195B11B7C6EDA00F58D3F /* main.swift */, 81 | ); 82 | path = "XcodeEdit-Example"; 83 | sourceTree = ""; 84 | }; 85 | E262D4411B7E20AA0057CCEE /* XcodeEdit */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | E242AE811E88E3FA00F4CCA5 /* AllObjects.swift */, 89 | E292B9CC1B932F3200D75DE2 /* Extensions.swift */, 90 | E2E755AC1FF40C9600177FED /* PBXIdentifier.swift */, 91 | E292B9CD1B932F3200D75DE2 /* PBXObject.swift */, 92 | E2FD157B1EACCA7E00772CF1 /* PBXObject+Fields.swift */, 93 | E292B9C61B9236D900D75DE2 /* Serialization.swift */, 94 | E262D4441B7E21190057CCEE /* XCProjectFile.swift */, 95 | E29B539B1FF53CC100D64F5E /* XCProjectFile+Rswift.swift */, 96 | ); 97 | name = XcodeEdit; 98 | path = ../Sources/XcodeEdit; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | E22195AD1B7C6EDA00F58D3F /* XcodeEdit-Example */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = E22195B51B7C6EDA00F58D3F /* Build configuration list for PBXNativeTarget "XcodeEdit-Example" */; 107 | buildPhases = ( 108 | E22195AA1B7C6EDA00F58D3F /* Sources */, 109 | E22195AB1B7C6EDA00F58D3F /* Frameworks */, 110 | E22195AC1B7C6EDA00F58D3F /* CopyFiles */, 111 | ); 112 | buildRules = ( 113 | ); 114 | dependencies = ( 115 | ); 116 | name = "XcodeEdit-Example"; 117 | productName = "XcodeEdit-Example"; 118 | productReference = E22195AE1B7C6EDA00F58D3F /* XcodeEdit-Example */; 119 | productType = "com.apple.product-type.tool"; 120 | }; 121 | /* End PBXNativeTarget section */ 122 | 123 | /* Begin PBXProject section */ 124 | E22195A61B7C6EDA00F58D3F /* Project object */ = { 125 | isa = PBXProject; 126 | attributes = { 127 | BuildIndependentTargetsInParallel = YES; 128 | LastSwiftUpdateCheck = 0700; 129 | LastUpgradeCheck = 1600; 130 | ORGANIZATIONNAME = nonstrict; 131 | TargetAttributes = { 132 | E22195AD1B7C6EDA00F58D3F = { 133 | CreatedOnToolsVersion = 6.4; 134 | LastSwiftMigration = 1100; 135 | }; 136 | }; 137 | }; 138 | buildConfigurationList = E22195A91B7C6EDA00F58D3F /* Build configuration list for PBXProject "XcodeEdit-Example" */; 139 | compatibilityVersion = "Xcode 3.2"; 140 | developmentRegion = en; 141 | hasScannedForEncodings = 0; 142 | knownRegions = ( 143 | en, 144 | Base, 145 | ); 146 | mainGroup = E22195A51B7C6EDA00F58D3F; 147 | productRefGroup = E22195AF1B7C6EDA00F58D3F /* Products */; 148 | projectDirPath = ""; 149 | projectRoot = ""; 150 | targets = ( 151 | E22195AD1B7C6EDA00F58D3F /* XcodeEdit-Example */, 152 | ); 153 | }; 154 | /* End PBXProject section */ 155 | 156 | /* Begin PBXSourcesBuildPhase section */ 157 | E22195AA1B7C6EDA00F58D3F /* Sources */ = { 158 | isa = PBXSourcesBuildPhase; 159 | buildActionMask = 2147483647; 160 | files = ( 161 | E29B539C1FF53CC100D64F5E /* XCProjectFile+Rswift.swift in Sources */, 162 | E292B9CF1B932F3200D75DE2 /* PBXObject.swift in Sources */, 163 | E262D4451B7E21190057CCEE /* XCProjectFile.swift in Sources */, 164 | E292B9C71B9236D900D75DE2 /* Serialization.swift in Sources */, 165 | E2E755AD1FF40C9600177FED /* PBXIdentifier.swift in Sources */, 166 | E22195B21B7C6EDA00F58D3F /* main.swift in Sources */, 167 | E2FD157C1EACCA7E00772CF1 /* PBXObject+Fields.swift in Sources */, 168 | E242AE821E88E3FA00F4CCA5 /* AllObjects.swift in Sources */, 169 | E292B9CE1B932F3200D75DE2 /* Extensions.swift in Sources */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXSourcesBuildPhase section */ 174 | 175 | /* Begin XCBuildConfiguration section */ 176 | E22195B31B7C6EDA00F58D3F /* Debug */ = { 177 | isa = XCBuildConfiguration; 178 | buildSettings = { 179 | ALWAYS_SEARCH_USER_PATHS = NO; 180 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 181 | CLANG_CXX_LIBRARY = "libc++"; 182 | CLANG_ENABLE_MODULES = YES; 183 | CLANG_ENABLE_OBJC_ARC = YES; 184 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 185 | CLANG_WARN_BOOL_CONVERSION = YES; 186 | CLANG_WARN_COMMA = YES; 187 | CLANG_WARN_CONSTANT_CONVERSION = YES; 188 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 189 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 190 | CLANG_WARN_EMPTY_BODY = YES; 191 | CLANG_WARN_ENUM_CONVERSION = YES; 192 | CLANG_WARN_INFINITE_RECURSION = YES; 193 | CLANG_WARN_INT_CONVERSION = YES; 194 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 195 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 196 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 197 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 198 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 199 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 200 | CLANG_WARN_STRICT_PROTOTYPES = YES; 201 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 202 | CLANG_WARN_UNREACHABLE_CODE = YES; 203 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 204 | COPY_PHASE_STRIP = NO; 205 | DEAD_CODE_STRIPPING = YES; 206 | DEBUG_INFORMATION_FORMAT = dwarf; 207 | ENABLE_STRICT_OBJC_MSGSEND = YES; 208 | ENABLE_TESTABILITY = YES; 209 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 210 | GCC_C_LANGUAGE_STANDARD = gnu99; 211 | GCC_DYNAMIC_NO_PIC = NO; 212 | GCC_NO_COMMON_BLOCKS = YES; 213 | GCC_OPTIMIZATION_LEVEL = 0; 214 | GCC_PREPROCESSOR_DEFINITIONS = ( 215 | "DEBUG=1", 216 | "$(inherited)", 217 | ); 218 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 219 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 220 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 221 | GCC_WARN_UNDECLARED_SELECTOR = YES; 222 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 223 | GCC_WARN_UNUSED_FUNCTION = YES; 224 | GCC_WARN_UNUSED_VARIABLE = YES; 225 | MACOSX_DEPLOYMENT_TARGET = 13.5; 226 | MTL_ENABLE_DEBUG_INFO = YES; 227 | ONLY_ACTIVE_ARCH = YES; 228 | SDKROOT = macosx; 229 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 230 | SWIFT_VERSION = 6.0; 231 | }; 232 | name = Debug; 233 | }; 234 | E22195B41B7C6EDA00F58D3F /* Release */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 239 | CLANG_CXX_LIBRARY = "libc++"; 240 | CLANG_ENABLE_MODULES = YES; 241 | CLANG_ENABLE_OBJC_ARC = YES; 242 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 243 | CLANG_WARN_BOOL_CONVERSION = YES; 244 | CLANG_WARN_COMMA = YES; 245 | CLANG_WARN_CONSTANT_CONVERSION = YES; 246 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 247 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 248 | CLANG_WARN_EMPTY_BODY = YES; 249 | CLANG_WARN_ENUM_CONVERSION = YES; 250 | CLANG_WARN_INFINITE_RECURSION = YES; 251 | CLANG_WARN_INT_CONVERSION = YES; 252 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 253 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 254 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 255 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 256 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | COPY_PHASE_STRIP = NO; 263 | DEAD_CODE_STRIPPING = YES; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 268 | GCC_C_LANGUAGE_STANDARD = gnu99; 269 | GCC_NO_COMMON_BLOCKS = YES; 270 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 271 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 272 | GCC_WARN_UNDECLARED_SELECTOR = YES; 273 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 274 | GCC_WARN_UNUSED_FUNCTION = YES; 275 | GCC_WARN_UNUSED_VARIABLE = YES; 276 | MACOSX_DEPLOYMENT_TARGET = 13.5; 277 | MTL_ENABLE_DEBUG_INFO = NO; 278 | SDKROOT = macosx; 279 | SWIFT_COMPILATION_MODE = wholemodule; 280 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 281 | SWIFT_VERSION = 6.0; 282 | }; 283 | name = Release; 284 | }; 285 | E22195B61B7C6EDA00F58D3F /* Debug */ = { 286 | isa = XCBuildConfiguration; 287 | buildSettings = { 288 | CODE_SIGN_IDENTITY = "-"; 289 | DEAD_CODE_STRIPPING = YES; 290 | PRODUCT_NAME = "$(TARGET_NAME)"; 291 | SWIFT_VERSION = 5.0; 292 | }; 293 | name = Debug; 294 | }; 295 | E22195B71B7C6EDA00F58D3F /* Release */ = { 296 | isa = XCBuildConfiguration; 297 | buildSettings = { 298 | CODE_SIGN_IDENTITY = "-"; 299 | DEAD_CODE_STRIPPING = YES; 300 | PRODUCT_NAME = "$(TARGET_NAME)"; 301 | SWIFT_COMPILATION_MODE = wholemodule; 302 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 303 | SWIFT_VERSION = 5.0; 304 | }; 305 | name = Release; 306 | }; 307 | /* End XCBuildConfiguration section */ 308 | 309 | /* Begin XCConfigurationList section */ 310 | E22195A91B7C6EDA00F58D3F /* Build configuration list for PBXProject "XcodeEdit-Example" */ = { 311 | isa = XCConfigurationList; 312 | buildConfigurations = ( 313 | E22195B31B7C6EDA00F58D3F /* Debug */, 314 | E22195B41B7C6EDA00F58D3F /* Release */, 315 | ); 316 | defaultConfigurationIsVisible = 0; 317 | defaultConfigurationName = Release; 318 | }; 319 | E22195B51B7C6EDA00F58D3F /* Build configuration list for PBXNativeTarget "XcodeEdit-Example" */ = { 320 | isa = XCConfigurationList; 321 | buildConfigurations = ( 322 | E22195B61B7C6EDA00F58D3F /* Debug */, 323 | E22195B71B7C6EDA00F58D3F /* Release */, 324 | ); 325 | defaultConfigurationIsVisible = 0; 326 | defaultConfigurationName = Release; 327 | }; 328 | /* End XCConfigurationList section */ 329 | }; 330 | rootObject = E22195A61B7C6EDA00F58D3F /* Project object */; 331 | } 332 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/Serialization.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Serialization.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2015-08-29. 6 | // Copyright © 2015 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension XCProjectFile { 12 | 13 | public func write(to url: URL, format: Format? = nil) throws { 14 | 15 | try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil) 16 | 17 | let name = try XCProjectFile.projectName(from: url) 18 | let path = url.appendingPathComponent("project.pbxproj", isDirectory: false) 19 | 20 | let data = try serialized(projectName: name, format: format) 21 | try data.write(to: path) 22 | } 23 | 24 | public func serialized(projectName: String, format: Format? = nil) throws -> Data { 25 | let outputFormat = format ?? self.format 26 | switch outputFormat { 27 | case .plist(let plformat): 28 | switch plformat { 29 | case .openStep: 30 | let serializer = Serializer(projectName: projectName, projectFile: self) 31 | return Data(serializer.openStepSerialization.utf8) 32 | default: 33 | return try PropertyListSerialization.data(fromPropertyList: fields, format: plformat, options: 0) 34 | } 35 | 36 | case .json: 37 | return try JSONSerialization.data(withJSONObject: fields, options: [.sortedKeys, .prettyPrinted]) 38 | } 39 | 40 | } 41 | } 42 | 43 | private let nonescapeRegex = try! NSRegularExpression(pattern: "^[a-z0-9_\\$\\.\\/]+$", options: NSRegularExpression.Options.caseInsensitive) 44 | 45 | internal class Serializer { 46 | 47 | let projectName: String 48 | let projectFile: XCProjectFile 49 | 50 | init(projectName: String, projectFile: XCProjectFile) { 51 | self.projectName = projectName 52 | self.projectFile = projectFile 53 | } 54 | 55 | lazy var targetsByConfigId: [Guid: PBXTarget] = { 56 | var dict: [Guid: PBXTarget] = [:] 57 | for reference in self.projectFile.project.targets { 58 | if let target = reference.value { 59 | dict[target.buildConfigurationList.id] = target 60 | } 61 | } 62 | 63 | return dict 64 | }() 65 | 66 | lazy var buildPhaseByFileId: [Guid: PBXBuildPhase] = { 67 | 68 | let buildPhases = self.projectFile.allObjects.objects.values.compactMap { $0 as? PBXBuildPhase } 69 | 70 | var dict: [Guid: PBXBuildPhase] = [:] 71 | for buildPhase in buildPhases { 72 | for file in buildPhase.files { 73 | dict[file.id] = buildPhase 74 | } 75 | } 76 | 77 | return dict 78 | }() 79 | 80 | var openStepSerialization: String { 81 | var lines = [ 82 | "// !$*UTF8*$!", 83 | "{", 84 | ] 85 | 86 | for key in projectFile.fields.keys.sorted() { 87 | let val = projectFile.fields[key]! 88 | 89 | if key == "objects" { 90 | 91 | lines.append("\tobjects = {") 92 | 93 | let groupedObjects = projectFile.allObjects.objects.values 94 | .grouped { $0.isa } 95 | .map { (isa: $0.0, objects: $0.1) } 96 | .sorted { $0.isa } 97 | 98 | for (isa, objects) in groupedObjects { 99 | lines.append("") 100 | lines.append("/* Begin \(isa) section */") 101 | 102 | for object in objects.sorted(by: { $0.id }) { 103 | 104 | let multiline = isa != "PBXBuildFile" && isa != "PBXFileReference" 105 | let parts = rows(type: isa, objectId: object.id, multiline: multiline, fields: object.fields) 106 | if multiline { 107 | for ln in parts { 108 | lines.append("\t\t" + ln) 109 | } 110 | } 111 | else { 112 | lines.append("\t\t" + parts.joined(separator: "")) 113 | } 114 | } 115 | 116 | lines.append("/* End \(isa) section */") 117 | } 118 | lines.append("\t};") 119 | } 120 | else { 121 | var comment = ""; 122 | if key == "rootObject" { 123 | comment = " /* Project object */" 124 | } 125 | 126 | let row = "\(key) = \(val)\(comment);" 127 | for line in row.components(separatedBy: "\n") { 128 | lines.append("\t\(line)") 129 | } 130 | } 131 | } 132 | 133 | lines.append("}\n") 134 | 135 | return lines.joined(separator: "\n") 136 | } 137 | 138 | func comment(id: Guid) -> String? { 139 | if id == projectFile.project.id { 140 | return "Project object" 141 | } 142 | 143 | guard let obj = projectFile.allObjects.objects[id] else { return nil } 144 | 145 | if let ref = obj as? PBXReference { 146 | return ref.name ?? ref.path 147 | } 148 | if let target = obj as? PBXTarget { 149 | return target.name 150 | } 151 | if let config = obj as? XCBuildConfiguration { 152 | return config.name 153 | } 154 | if let copyFiles = obj as? PBXCopyFilesBuildPhase { 155 | return copyFiles.name ?? "CopyFiles" 156 | } 157 | if let dependency = obj as? XCSwiftPackageProductDependency { 158 | let plugin = "plugin:" 159 | if let productName = dependency.productName, productName.hasPrefix(plugin) { 160 | return String(productName.dropFirst(plugin.count)) 161 | } 162 | return dependency.productName 163 | } 164 | if let remoteRef = obj as? XCRemoteSwiftPackageReference { 165 | if let repositoryName = remoteRef.repositoryURL?.deletingPathExtension().lastPathComponent { 166 | return "XCRemoteSwiftPackageReference \"\(repositoryName)\"" 167 | } 168 | return "XCRemoteSwiftPackageReference" 169 | } 170 | if let localRef = obj as? XCLocalSwiftPackageReference { 171 | return "XCLocalSwiftPackageReference \"\(localRef.pathString)\"" 172 | } 173 | if obj is PBXFrameworksBuildPhase { 174 | return "Frameworks" 175 | } 176 | if obj is PBXHeadersBuildPhase { 177 | return "Headers" 178 | } 179 | if obj is PBXResourcesBuildPhase { 180 | return "Resources" 181 | } 182 | if let shellScript = obj as? PBXShellScriptBuildPhase { 183 | return shellScript.name ?? "ShellScript" 184 | } 185 | if obj is PBXSourcesBuildPhase { 186 | return "Sources" 187 | } 188 | if let obj = obj as? PBXFileSystemSynchronizedBuildFileExceptionSet { 189 | return commentFileSystemSynchronizedBuildFileExceptionSet(obj: obj) 190 | } 191 | if let obj = obj as? PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet { 192 | return commentFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet(obj: obj) 193 | } 194 | if let buildFile = obj as? PBXBuildFile { 195 | if let buildPhase = buildPhaseByFileId[id], 196 | let group = comment(id: buildPhase.id) { 197 | 198 | if let fileRefId = buildFile.fileRef?.id { 199 | if let fileRef = comment(id: fileRefId) { 200 | return "\(fileRef) in \(group)" 201 | } 202 | } 203 | else if let productRefId = buildFile.productRef?.id { 204 | if let productRef = comment(id: productRefId) { 205 | return "\(productRef) in \(group)" 206 | } 207 | } 208 | else { 209 | return "(null) in \(group)" 210 | } 211 | } 212 | } 213 | if obj is XCConfigurationList { 214 | if let target = targetsByConfigId[id] { 215 | return "Build configuration list for \(target.isa) \"\(target.name)\"" 216 | } 217 | return "Build configuration list for PBXProject \"\(projectName)\"" 218 | } 219 | 220 | return obj.isa 221 | } 222 | 223 | func commentFileSystemSynchronizedBuildFileExceptionSet(obj: PBXFileSystemSynchronizedBuildFileExceptionSet) -> String { 224 | guard projectFile.isDetailedFileSystemSynchronization else { return obj.isa } 225 | 226 | let groups = projectFile.allObjects.objects.values.compactMap { $0 as? PBXFileSystemSynchronizedRootGroup } 227 | guard 228 | let group = groups.first(where: { $0.exceptions?.contains { $0.id == obj.id } ?? false }), 229 | let path = group.path, 230 | let target = obj.target.value 231 | else { 232 | return obj.isa 233 | } 234 | 235 | return "Exceptions for \"\(path)\" folder in \"\(target.name)\" target" 236 | } 237 | 238 | func commentFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet(obj: PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet) -> String { 239 | guard projectFile.isDetailedFileSystemSynchronization else { return obj.isa } 240 | 241 | let groups = projectFile.allObjects.objects.values.compactMap { $0 as? PBXFileSystemSynchronizedRootGroup } 242 | guard 243 | let group = groups.first(where: { $0.exceptions?.contains { $0.id == obj.id } ?? false }), 244 | let path = group.path, 245 | let copyFilesBuildPhase = obj.buildPhase?.value as? PBXCopyFilesBuildPhase , 246 | let phaseName = copyFilesBuildPhase.name 247 | else { 248 | return obj.isa 249 | } 250 | 251 | let nativeTargets = projectFile.project.targets.compactMap({ $0.value as? PBXNativeTarget }) 252 | guard let target = nativeTargets.first(where: { $0.buildPhases.contains(where: { $0.id == copyFilesBuildPhase.id }) }) else { 253 | return obj.isa 254 | } 255 | 256 | return "Exceptions for \"\(path)\" folder in \"\(phaseName)\" phase from \"\(target.name)\" target" 257 | } 258 | 259 | func valStr(_ val: String) -> String { 260 | 261 | let replacements: [(String, String)] = [ 262 | ("\\", "\\\\"), 263 | ("\t", "\\t"), 264 | ("\n", "\\n"), 265 | ("\r", "\\r"), 266 | ("\"", "\\\"") 267 | ] 268 | 269 | var str = val 270 | for (template, replacement) in replacements { 271 | str = str.replacingOccurrences(of: template, with: replacement) 272 | } 273 | 274 | let range = NSRange(location: 0, length: str.utf16.count) 275 | if let _ = nonescapeRegex.firstMatch(in: str, options: [], range: range) { 276 | return str 277 | } 278 | 279 | return "\"\(str)\"" 280 | } 281 | 282 | func objval(key: String, val: Any, multiline: Bool, inlineArray: Bool) -> [String] { 283 | var parts: [String] = [] 284 | let keyStr = valStr(key) 285 | 286 | if let valArr = val as? [String], inlineArray { 287 | var ps: [String] = [] 288 | for valItem in valArr { 289 | let str = valStr(valItem) 290 | ps.append("\(str),") 291 | } 292 | parts.append("\(keyStr) = (" + ps.map { $0 + " "}.joined(separator: "") + ");") 293 | } 294 | else if let valArr = val as? [String] { 295 | parts.append("\(keyStr) = (") 296 | 297 | var ps: [String] = [] 298 | for valItem in valArr { 299 | let str = valStr(valItem) 300 | 301 | var extraComment = "" 302 | if let c = comment(id: Guid(valItem)) { 303 | extraComment = " /* \(c) */" 304 | } 305 | 306 | ps.append("\(str)\(extraComment),") 307 | } 308 | 309 | if multiline { 310 | for p in ps { 311 | parts.append("\t\(p)") 312 | } 313 | parts.append(");") 314 | } 315 | else { 316 | parts.append(ps.map { $0 + " "}.joined(separator: "") + "); ") 317 | } 318 | 319 | } 320 | else if let valArr = val as? [Fields] { 321 | parts.append("\(keyStr) = (") 322 | 323 | for valObj in valArr { 324 | if multiline { 325 | parts.append("\t{") 326 | } 327 | 328 | for valKey in valObj.keys.sorted() { 329 | let valVal = valObj[valKey]! 330 | let ps = objval(key: valKey, val: valVal, multiline: multiline, inlineArray: inlineArray) 331 | 332 | if multiline { 333 | for p in ps { 334 | parts.append("\t\t\(p)") 335 | } 336 | } 337 | else { 338 | parts.append("\t" + ps.joined(separator: "") + "}; ") 339 | } 340 | } 341 | 342 | if multiline { 343 | parts.append("\t},") 344 | } 345 | } 346 | 347 | parts.append(");") 348 | 349 | } 350 | else if let valObj = val as? Fields { 351 | parts.append("\(keyStr) = {") 352 | 353 | for valKey in valObj.keys.sorted() { 354 | let valVal = valObj[valKey]! 355 | 356 | let inlineArray = key == "assetTagsByRelativePath" && projectFile.isDetailedFileSystemSynchronization 357 | let ps = objval(key: valKey, val: valVal, multiline: multiline, inlineArray: inlineArray) 358 | 359 | if multiline { 360 | for p in ps { 361 | parts.append("\t\(p)") 362 | } 363 | } 364 | else { 365 | parts.append(ps.joined(separator: "")) 366 | } 367 | } 368 | 369 | if multiline { 370 | parts.append("};") 371 | } else { 372 | parts.append("}; ") 373 | } 374 | 375 | } 376 | else { 377 | let str = valStr("\(val)") 378 | 379 | var extraComment = ""; 380 | if let c = comment(id: Guid("\(val)")) { 381 | extraComment = " /* \(c) */" 382 | } 383 | 384 | if key == "remoteGlobalIDString" || key == "TestTargetID" { 385 | extraComment = "" 386 | } 387 | 388 | if multiline { 389 | parts.append("\(keyStr) = \(str)\(extraComment);") 390 | } 391 | else { 392 | parts.append("\(keyStr) = \(str)\(extraComment); ") 393 | } 394 | } 395 | 396 | return parts 397 | } 398 | 399 | func rows(type: String, objectId: Guid, multiline: Bool, fields: Fields) -> [String] { 400 | 401 | var parts: [String] = [] 402 | if multiline { 403 | parts.append("isa = \(type);") 404 | } 405 | else { 406 | parts.append("isa = \(type); ") 407 | } 408 | 409 | for key in fields.keys.sorted() { 410 | if key == "isa" { continue } 411 | let val = fields[key]! 412 | 413 | for p in objval(key: key, val: val, multiline: multiline, inlineArray: false) { 414 | parts.append(p) 415 | } 416 | } 417 | 418 | let keyStr = valStr(objectId.value) 419 | var objComment = "" 420 | if let c = comment(id: objectId) { 421 | objComment = " /* \(c) */" 422 | } 423 | 424 | let opening = "\(keyStr)\(objComment) = {" 425 | let closing = "};" 426 | 427 | if multiline { 428 | var lines: [String] = [] 429 | lines.append(opening) 430 | for part in parts { 431 | lines.append("\t\(part)") 432 | } 433 | lines.append(closing) 434 | return lines 435 | } 436 | else { 437 | return [opening + parts.joined(separator: "") + closing] 438 | } 439 | } 440 | } 441 | -------------------------------------------------------------------------------- /XcodeEdit.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | OBJ_27 /* AllObjects.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* AllObjects.swift */; }; 11 | OBJ_28 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* Extensions.swift */; }; 12 | OBJ_29 /* PBXIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* PBXIdentifier.swift */; }; 13 | OBJ_30 /* PBXObject+Fields.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* PBXObject+Fields.swift */; }; 14 | OBJ_31 /* PBXObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* PBXObject.swift */; }; 15 | OBJ_32 /* Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* Serialization.swift */; }; 16 | OBJ_33 /* XCProjectFile+Rswift.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* XCProjectFile+Rswift.swift */; }; 17 | OBJ_34 /* XCProjectFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* XCProjectFile.swift */; }; 18 | OBJ_41 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXFileReference section */ 22 | OBJ_10 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 23 | OBJ_11 /* PBXIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PBXIdentifier.swift; sourceTree = ""; }; 24 | OBJ_12 /* PBXObject+Fields.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PBXObject+Fields.swift"; sourceTree = ""; }; 25 | OBJ_13 /* PBXObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PBXObject.swift; sourceTree = ""; }; 26 | OBJ_14 /* Serialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Serialization.swift; sourceTree = ""; }; 27 | OBJ_15 /* XCProjectFile+Rswift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCProjectFile+Rswift.swift"; sourceTree = ""; }; 28 | OBJ_16 /* XCProjectFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCProjectFile.swift; sourceTree = ""; }; 29 | OBJ_18 /* Example */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Example; sourceTree = SOURCE_ROOT; }; 30 | OBJ_19 /* Test projects */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "Test projects"; sourceTree = SOURCE_ROOT; }; 31 | OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 32 | OBJ_9 /* AllObjects.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = AllObjects.swift; sourceTree = ""; tabWidth = 2; }; 33 | "XcodeEdit::XcodeEdit::Product" /* XcodeEdit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = XcodeEdit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | OBJ_35 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 0; 40 | files = ( 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | OBJ_17 /* Tests */ = { 48 | isa = PBXGroup; 49 | children = ( 50 | ); 51 | name = Tests; 52 | sourceTree = SOURCE_ROOT; 53 | }; 54 | OBJ_20 /* Products */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | "XcodeEdit::XcodeEdit::Product" /* XcodeEdit.framework */, 58 | ); 59 | name = Products; 60 | sourceTree = BUILT_PRODUCTS_DIR; 61 | }; 62 | OBJ_5 = { 63 | isa = PBXGroup; 64 | children = ( 65 | OBJ_6 /* Package.swift */, 66 | OBJ_7 /* Sources */, 67 | OBJ_17 /* Tests */, 68 | OBJ_18 /* Example */, 69 | OBJ_19 /* Test projects */, 70 | OBJ_20 /* Products */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | OBJ_7 /* Sources */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | OBJ_8 /* XcodeEdit */, 78 | ); 79 | name = Sources; 80 | sourceTree = SOURCE_ROOT; 81 | }; 82 | OBJ_8 /* XcodeEdit */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | OBJ_9 /* AllObjects.swift */, 86 | OBJ_10 /* Extensions.swift */, 87 | OBJ_11 /* PBXIdentifier.swift */, 88 | OBJ_13 /* PBXObject.swift */, 89 | OBJ_12 /* PBXObject+Fields.swift */, 90 | OBJ_14 /* Serialization.swift */, 91 | OBJ_16 /* XCProjectFile.swift */, 92 | OBJ_15 /* XCProjectFile+Rswift.swift */, 93 | ); 94 | name = XcodeEdit; 95 | path = Sources/XcodeEdit; 96 | sourceTree = SOURCE_ROOT; 97 | }; 98 | /* End PBXGroup section */ 99 | 100 | /* Begin PBXNativeTarget section */ 101 | "XcodeEdit::SwiftPMPackageDescription" /* XcodeEditPackageDescription */ = { 102 | isa = PBXNativeTarget; 103 | buildConfigurationList = OBJ_37 /* Build configuration list for PBXNativeTarget "XcodeEditPackageDescription" */; 104 | buildPhases = ( 105 | OBJ_40 /* Sources */, 106 | ); 107 | buildRules = ( 108 | ); 109 | dependencies = ( 110 | ); 111 | name = XcodeEditPackageDescription; 112 | productName = XcodeEditPackageDescription; 113 | productType = "com.apple.product-type.framework"; 114 | }; 115 | "XcodeEdit::XcodeEdit" /* XcodeEdit */ = { 116 | isa = PBXNativeTarget; 117 | buildConfigurationList = OBJ_23 /* Build configuration list for PBXNativeTarget "XcodeEdit" */; 118 | buildPhases = ( 119 | OBJ_26 /* Sources */, 120 | OBJ_35 /* Frameworks */, 121 | ); 122 | buildRules = ( 123 | ); 124 | dependencies = ( 125 | ); 126 | name = XcodeEdit; 127 | productName = XcodeEdit; 128 | productReference = "XcodeEdit::XcodeEdit::Product" /* XcodeEdit.framework */; 129 | productType = "com.apple.product-type.framework"; 130 | }; 131 | /* End PBXNativeTarget section */ 132 | 133 | /* Begin PBXProject section */ 134 | OBJ_1 /* Project object */ = { 135 | isa = PBXProject; 136 | attributes = { 137 | BuildIndependentTargetsInParallel = YES; 138 | LastUpgradeCheck = 1600; 139 | TargetAttributes = { 140 | "XcodeEdit::XcodeEdit" = { 141 | LastSwiftMigration = 1020; 142 | }; 143 | }; 144 | }; 145 | buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "XcodeEdit" */; 146 | compatibilityVersion = "Xcode 3.2"; 147 | developmentRegion = en; 148 | hasScannedForEncodings = 0; 149 | knownRegions = ( 150 | en, 151 | Base, 152 | ); 153 | mainGroup = OBJ_5; 154 | productRefGroup = OBJ_20 /* Products */; 155 | projectDirPath = ""; 156 | projectRoot = ""; 157 | targets = ( 158 | "XcodeEdit::XcodeEdit" /* XcodeEdit */, 159 | "XcodeEdit::SwiftPMPackageDescription" /* XcodeEditPackageDescription */, 160 | ); 161 | }; 162 | /* End PBXProject section */ 163 | 164 | /* Begin PBXSourcesBuildPhase section */ 165 | OBJ_26 /* Sources */ = { 166 | isa = PBXSourcesBuildPhase; 167 | buildActionMask = 0; 168 | files = ( 169 | OBJ_27 /* AllObjects.swift in Sources */, 170 | OBJ_28 /* Extensions.swift in Sources */, 171 | OBJ_29 /* PBXIdentifier.swift in Sources */, 172 | OBJ_30 /* PBXObject+Fields.swift in Sources */, 173 | OBJ_31 /* PBXObject.swift in Sources */, 174 | OBJ_32 /* Serialization.swift in Sources */, 175 | OBJ_33 /* XCProjectFile+Rswift.swift in Sources */, 176 | OBJ_34 /* XCProjectFile.swift in Sources */, 177 | ); 178 | runOnlyForDeploymentPostprocessing = 0; 179 | }; 180 | OBJ_40 /* Sources */ = { 181 | isa = PBXSourcesBuildPhase; 182 | buildActionMask = 0; 183 | files = ( 184 | OBJ_41 /* Package.swift in Sources */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | /* End PBXSourcesBuildPhase section */ 189 | 190 | /* Begin XCBuildConfiguration section */ 191 | OBJ_24 /* Debug */ = { 192 | isa = XCBuildConfiguration; 193 | buildSettings = { 194 | DEAD_CODE_STRIPPING = YES; 195 | ENABLE_TESTABILITY = YES; 196 | FRAMEWORK_SEARCH_PATHS = ( 197 | "$(inherited)", 198 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 199 | ); 200 | HEADER_SEARCH_PATHS = "$(inherited)"; 201 | INFOPLIST_FILE = XcodeEdit.xcodeproj/XcodeEdit_Info.plist; 202 | LD_RUNPATH_SEARCH_PATHS = ( 203 | "$(inherited)", 204 | "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", 205 | ); 206 | OTHER_CFLAGS = "$(inherited)"; 207 | OTHER_LDFLAGS = "$(inherited)"; 208 | OTHER_SWIFT_FLAGS = "$(inherited)"; 209 | PRODUCT_BUNDLE_IDENTIFIER = XcodeEdit; 210 | PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; 211 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 212 | SKIP_INSTALL = YES; 213 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; 214 | SWIFT_VERSION = 5.0; 215 | TARGET_NAME = XcodeEdit; 216 | }; 217 | name = Debug; 218 | }; 219 | OBJ_25 /* Release */ = { 220 | isa = XCBuildConfiguration; 221 | buildSettings = { 222 | DEAD_CODE_STRIPPING = YES; 223 | ENABLE_TESTABILITY = YES; 224 | FRAMEWORK_SEARCH_PATHS = ( 225 | "$(inherited)", 226 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 227 | ); 228 | HEADER_SEARCH_PATHS = "$(inherited)"; 229 | INFOPLIST_FILE = XcodeEdit.xcodeproj/XcodeEdit_Info.plist; 230 | LD_RUNPATH_SEARCH_PATHS = ( 231 | "$(inherited)", 232 | "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", 233 | ); 234 | OTHER_CFLAGS = "$(inherited)"; 235 | OTHER_LDFLAGS = "$(inherited)"; 236 | OTHER_SWIFT_FLAGS = "$(inherited)"; 237 | PRODUCT_BUNDLE_IDENTIFIER = XcodeEdit; 238 | PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; 239 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 240 | SKIP_INSTALL = YES; 241 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; 242 | SWIFT_VERSION = 5.0; 243 | TARGET_NAME = XcodeEdit; 244 | }; 245 | name = Release; 246 | }; 247 | OBJ_3 /* Debug */ = { 248 | isa = XCBuildConfiguration; 249 | buildSettings = { 250 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 251 | CLANG_ENABLE_OBJC_ARC = YES; 252 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 253 | CLANG_WARN_BOOL_CONVERSION = YES; 254 | CLANG_WARN_COMMA = YES; 255 | CLANG_WARN_CONSTANT_CONVERSION = YES; 256 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 257 | CLANG_WARN_EMPTY_BODY = YES; 258 | CLANG_WARN_ENUM_CONVERSION = YES; 259 | CLANG_WARN_INFINITE_RECURSION = YES; 260 | CLANG_WARN_INT_CONVERSION = YES; 261 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 262 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 263 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 264 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 265 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 266 | CLANG_WARN_STRICT_PROTOTYPES = YES; 267 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 268 | CLANG_WARN_UNREACHABLE_CODE = YES; 269 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 270 | COMBINE_HIDPI_IMAGES = YES; 271 | COPY_PHASE_STRIP = NO; 272 | DEAD_CODE_STRIPPING = YES; 273 | DEBUG_INFORMATION_FORMAT = dwarf; 274 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 275 | ENABLE_NS_ASSERTIONS = YES; 276 | ENABLE_STRICT_OBJC_MSGSEND = YES; 277 | ENABLE_TESTABILITY = YES; 278 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 279 | GCC_NO_COMMON_BLOCKS = YES; 280 | GCC_OPTIMIZATION_LEVEL = 0; 281 | GCC_PREPROCESSOR_DEFINITIONS = ( 282 | "DEBUG=1", 283 | "$(inherited)", 284 | ); 285 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 286 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 287 | GCC_WARN_UNDECLARED_SELECTOR = YES; 288 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 289 | GCC_WARN_UNUSED_FUNCTION = YES; 290 | GCC_WARN_UNUSED_VARIABLE = YES; 291 | MACOSX_DEPLOYMENT_TARGET = 11.5; 292 | ONLY_ACTIVE_ARCH = YES; 293 | OTHER_SWIFT_FLAGS = "-DXcode"; 294 | PRODUCT_NAME = "$(TARGET_NAME)"; 295 | SDKROOT = macosx; 296 | SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; 297 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "SWIFT_PACKAGE DEBUG"; 298 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 299 | USE_HEADERMAP = NO; 300 | }; 301 | name = Debug; 302 | }; 303 | OBJ_38 /* Debug */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | DEAD_CODE_STRIPPING = YES; 307 | LD = /usr/bin/true; 308 | OTHER_SWIFT_FLAGS = "-swift-version 4.2 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"; 309 | SWIFT_VERSION = 4.2; 310 | }; 311 | name = Debug; 312 | }; 313 | OBJ_39 /* Release */ = { 314 | isa = XCBuildConfiguration; 315 | buildSettings = { 316 | DEAD_CODE_STRIPPING = YES; 317 | LD = /usr/bin/true; 318 | OTHER_SWIFT_FLAGS = "-swift-version 4.2 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"; 319 | SWIFT_VERSION = 4.2; 320 | }; 321 | name = Release; 322 | }; 323 | OBJ_4 /* Release */ = { 324 | isa = XCBuildConfiguration; 325 | buildSettings = { 326 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 327 | CLANG_ENABLE_OBJC_ARC = YES; 328 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 329 | CLANG_WARN_BOOL_CONVERSION = YES; 330 | CLANG_WARN_COMMA = YES; 331 | CLANG_WARN_CONSTANT_CONVERSION = YES; 332 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 333 | CLANG_WARN_EMPTY_BODY = YES; 334 | CLANG_WARN_ENUM_CONVERSION = YES; 335 | CLANG_WARN_INFINITE_RECURSION = YES; 336 | CLANG_WARN_INT_CONVERSION = YES; 337 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 338 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 339 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 340 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 341 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 342 | CLANG_WARN_STRICT_PROTOTYPES = YES; 343 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 344 | CLANG_WARN_UNREACHABLE_CODE = YES; 345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 346 | COMBINE_HIDPI_IMAGES = YES; 347 | COPY_PHASE_STRIP = YES; 348 | DEAD_CODE_STRIPPING = YES; 349 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 350 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 353 | GCC_NO_COMMON_BLOCKS = YES; 354 | GCC_OPTIMIZATION_LEVEL = s; 355 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 356 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 357 | GCC_WARN_UNDECLARED_SELECTOR = YES; 358 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 359 | GCC_WARN_UNUSED_FUNCTION = YES; 360 | GCC_WARN_UNUSED_VARIABLE = YES; 361 | MACOSX_DEPLOYMENT_TARGET = 11.5; 362 | OTHER_SWIFT_FLAGS = "-DXcode"; 363 | PRODUCT_NAME = "$(TARGET_NAME)"; 364 | SDKROOT = macosx; 365 | SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; 366 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; 367 | SWIFT_COMPILATION_MODE = wholemodule; 368 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 369 | USE_HEADERMAP = NO; 370 | }; 371 | name = Release; 372 | }; 373 | /* End XCBuildConfiguration section */ 374 | 375 | /* Begin XCConfigurationList section */ 376 | OBJ_2 /* Build configuration list for PBXProject "XcodeEdit" */ = { 377 | isa = XCConfigurationList; 378 | buildConfigurations = ( 379 | OBJ_3 /* Debug */, 380 | OBJ_4 /* Release */, 381 | ); 382 | defaultConfigurationIsVisible = 0; 383 | defaultConfigurationName = Release; 384 | }; 385 | OBJ_23 /* Build configuration list for PBXNativeTarget "XcodeEdit" */ = { 386 | isa = XCConfigurationList; 387 | buildConfigurations = ( 388 | OBJ_24 /* Debug */, 389 | OBJ_25 /* Release */, 390 | ); 391 | defaultConfigurationIsVisible = 0; 392 | defaultConfigurationName = Release; 393 | }; 394 | OBJ_37 /* Build configuration list for PBXNativeTarget "XcodeEditPackageDescription" */ = { 395 | isa = XCConfigurationList; 396 | buildConfigurations = ( 397 | OBJ_38 /* Debug */, 398 | OBJ_39 /* Release */, 399 | ); 400 | defaultConfigurationIsVisible = 0; 401 | defaultConfigurationName = Release; 402 | }; 403 | /* End XCConfigurationList section */ 404 | }; 405 | rootObject = OBJ_1 /* Project object */; 406 | } 407 | -------------------------------------------------------------------------------- /Sources/XcodeEdit/PBXObject.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PBXObject.swift 3 | // XcodeEdit 4 | // 5 | // Created by Tom Lokhorst on 2015-08-29. 6 | // Copyright © 2015 nonstrict. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public typealias Fields = [String: Any] 12 | 13 | public /* abstract */ class PBXObject { 14 | internal var fields: Fields 15 | internal let allObjects: AllObjects 16 | 17 | public let id: Guid 18 | public let isa: String 19 | 20 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 21 | self.id = id 22 | self.fields = fields 23 | self.allObjects = allObjects 24 | 25 | self.isa = try self.fields.string("isa") 26 | } 27 | } 28 | 29 | public /* abstract */ class PBXContainer : PBXObject { 30 | } 31 | 32 | public class PBXProject : PBXContainer { 33 | public let buildConfigurationList: Reference 34 | public let attributes: Fields? 35 | public let developmentRegion: String 36 | public let hasScannedForEncodings: Bool 37 | public let knownRegions: [String]? 38 | public let knownAssetTags: [String]? 39 | public let mainGroup: Reference 40 | public let packageReferences: [Reference]? 41 | public let targets: [Reference] 42 | public let projectReferences: [ProjectReference]? 43 | 44 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 45 | self.attributes = try fields.optionalFields("attributes") 46 | self.developmentRegion = try fields.string("developmentRegion") 47 | self.hasScannedForEncodings = try fields.bool("hasScannedForEncodings") 48 | self.knownRegions = try fields.optionalStrings("knownRegions") 49 | self.knownAssetTags = try attributes?.optionalStrings("KnownAssetTags") 50 | self.buildConfigurationList = allObjects.createReference(id: try fields.id("buildConfigurationList")) 51 | self.mainGroup = allObjects.createReference(id: try fields.id("mainGroup")) 52 | self.packageReferences = allObjects.createOptionalReferences(ids: try fields.optionalIds("packageReferences")) 53 | self.targets = allObjects.createReferences(ids: try fields.ids("targets")) 54 | self.projectReferences = try fields.optionalFieldsArray("projectReferences")? 55 | .map { try ProjectReference(fields: $0, allObjects: allObjects) } 56 | 57 | try super.init(id: id, fields: fields, allObjects: allObjects) 58 | } 59 | 60 | public class ProjectReference { 61 | public let ProductGroup: Reference? 62 | public let ProjectRef: Reference 63 | 64 | public required init(fields: Fields, allObjects: AllObjects) throws { 65 | self.ProductGroup = allObjects.createOptionalReference(id: try fields.optionalId("ProductGroup")) 66 | self.ProjectRef = allObjects.createReference(id: try fields.id("ProjectRef")) 67 | } 68 | } 69 | } 70 | 71 | public /* abstract */ class PBXContainerItem : PBXObject { 72 | } 73 | 74 | public class PBXContainerItemProxy : PBXContainerItem { 75 | } 76 | 77 | public /* abstract */ class PBXProjectItem : PBXContainerItem { 78 | } 79 | 80 | public class PBXBuildFile : PBXProjectItem { 81 | public let fileRef: Reference? 82 | public let productRef: Reference? 83 | 84 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 85 | self.fileRef = allObjects.createOptionalReference(id: try fields.optionalId("fileRef")) 86 | self.productRef = allObjects.createOptionalReference(id: try fields.optionalId("productRef")) 87 | 88 | try super.init(id: id, fields: fields, allObjects: allObjects) 89 | } 90 | } 91 | 92 | 93 | public /* abstract */ class PBXBuildPhase : PBXProjectItem { 94 | private var _files: [Reference] 95 | 96 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 97 | self._files = allObjects.createReferences(ids: try fields.ids("files")) 98 | 99 | try super.init(id: id, fields: fields, allObjects: allObjects) 100 | } 101 | 102 | public var files: [Reference] { 103 | return _files 104 | } 105 | 106 | // Custom function for R.swift 107 | public func insertFile(_ reference: Reference, at index: Int) { 108 | if _files.contains(reference) { return } 109 | 110 | _files.insert(reference, at: index) 111 | fields["files"] = _files.map { $0.id.value } 112 | } 113 | } 114 | 115 | public class PBXCopyFilesBuildPhase : PBXBuildPhase { 116 | public let name: String? 117 | 118 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 119 | self.name = try fields.optionalString("name") 120 | 121 | try super.init(id: id, fields: fields, allObjects: allObjects) 122 | } 123 | } 124 | 125 | public class PBXFrameworksBuildPhase : PBXBuildPhase { 126 | } 127 | 128 | public class PBXHeadersBuildPhase : PBXBuildPhase { 129 | } 130 | 131 | public class PBXResourcesBuildPhase : PBXBuildPhase { 132 | } 133 | 134 | public class PBXShellScriptBuildPhase : PBXBuildPhase { 135 | public let name: String? 136 | public let shellScript: String 137 | public let alwaysOutOfDate: Bool? 138 | public let inputFileListPaths: [String]? 139 | public let inputPaths: [String]? 140 | public let outputFileListPaths: [String]? 141 | public let outputPaths: [String]? 142 | 143 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 144 | self.name = try fields.optionalString("name") 145 | self.shellScript = try fields.string("shellScript") 146 | self.alwaysOutOfDate = try fields.optionalBool("alwaysOutOfDate") 147 | self.inputFileListPaths = try fields.optionalStrings("inputFileListPaths") 148 | self.inputPaths = try fields.optionalStrings("inputPaths") 149 | self.outputFileListPaths = try fields.optionalStrings("outputFileListPaths") 150 | self.outputPaths = try fields.optionalStrings("outputPaths") 151 | 152 | try super.init(id: id, fields: fields, allObjects: allObjects) 153 | } 154 | } 155 | 156 | public class PBXSourcesBuildPhase : PBXBuildPhase { 157 | } 158 | 159 | public class PBXBuildRule: PBXProjectItem { 160 | } 161 | 162 | public class PBXBuildStyle : PBXProjectItem { 163 | } 164 | 165 | public class XCBuildConfiguration : PBXBuildStyle { 166 | public let name: String 167 | public let buildSettings: [String: Any] 168 | 169 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 170 | self.name = try fields.string("name") 171 | self.buildSettings = try fields.fields("buildSettings") 172 | 173 | try super.init(id: id, fields: fields, allObjects: allObjects) 174 | } 175 | } 176 | 177 | public /* abstract */ class PBXTarget : PBXProjectItem { 178 | 179 | public let buildConfigurationList: Reference 180 | public let name: String 181 | public let productName: String? 182 | private var _buildPhases: [Reference] 183 | public let dependencies: [Reference] 184 | public let fileSystemSynchronizedGroups: [Reference]? 185 | public let packageProductDependencies: [Reference]? 186 | 187 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 188 | self.buildConfigurationList = allObjects.createReference(id: try fields.id("buildConfigurationList")) 189 | self.name = try fields.string("name") 190 | self.productName = try fields.optionalString("productName") 191 | self._buildPhases = allObjects.createReferences(ids: try fields.ids("buildPhases")) 192 | self.dependencies = allObjects.createReferences(ids: try fields.ids("dependencies")) 193 | self.fileSystemSynchronizedGroups = allObjects.createOptionalReferences(ids: try fields.optionalIds("fileSystemSynchronizedGroups")) 194 | self.packageProductDependencies = allObjects.createOptionalReferences(ids: try fields.optionalIds("packageProductDependencies")) 195 | 196 | try super.init(id: id, fields: fields, allObjects: allObjects) 197 | } 198 | 199 | public var buildPhases: [Reference] { 200 | return _buildPhases 201 | } 202 | 203 | // Custom function for R.swift 204 | public func insertBuildPhase(_ reference: Reference, at index: Int) { 205 | if _buildPhases.contains(reference) { return } 206 | 207 | _buildPhases.insert(reference, at: index) 208 | fields["buildPhases"] = _buildPhases.map { $0.id.value } 209 | } 210 | } 211 | 212 | public class PBXAggregateTarget : PBXTarget { 213 | } 214 | 215 | public class PBXLegacyTarget : PBXTarget { 216 | } 217 | 218 | public class PBXNativeTarget : PBXTarget { 219 | public let buildRules: [Reference] 220 | 221 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 222 | self.buildRules = allObjects.createReferences(ids: try fields.ids("buildRules")) 223 | 224 | try super.init(id: id, fields: fields, allObjects: allObjects) 225 | } 226 | } 227 | 228 | public class PBXTargetDependency : PBXProjectItem { 229 | public let targetProxy: Reference? 230 | 231 | // Note: Not sure if productRefs should only reference XCSwiftPackageProductDependency 232 | // or if it should refer to an extra superclass 233 | public let productRef: Reference? 234 | 235 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 236 | self.targetProxy = allObjects.createOptionalReference(id: try fields.optionalId("targetProxy")) 237 | self.productRef = allObjects.createOptionalReference(id: try fields.optionalId("productRef")) 238 | 239 | try super.init(id: id, fields: fields, allObjects: allObjects) 240 | } 241 | } 242 | 243 | // Note: Not sure if ProjectItem is correct superclass 244 | public class XCSwiftPackageProductDependency : PBXProjectItem { 245 | 246 | public let productName: String? 247 | public private(set) var package: Reference? 248 | 249 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 250 | self.productName = try fields.optionalString("productName") 251 | self.package = allObjects.createOptionalReference(id: try fields.optionalId("package")) 252 | 253 | try super.init(id: id, fields: fields, allObjects: allObjects) 254 | } 255 | 256 | // Custom function for R.swift 257 | public func removePackage() { 258 | package = nil 259 | fields["package"] = nil 260 | } 261 | } 262 | 263 | // Note: Not sure if ProjectItem is correct superclass 264 | public /* abstract */ class XCSwiftPackageReference : PBXProjectItem { 265 | } 266 | 267 | public class XCRemoteSwiftPackageReference : XCSwiftPackageReference { 268 | public let repositoryURL: URL? 269 | 270 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 271 | self.repositoryURL = try fields.optionalURL("repositoryURL") 272 | 273 | try super.init(id: id, fields: fields, allObjects: allObjects) 274 | } 275 | } 276 | 277 | public class XCLocalSwiftPackageReference : XCSwiftPackageReference { 278 | public let relativePath: Path 279 | let pathString: String 280 | 281 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 282 | pathString = try fields.string("relativePath") 283 | self.relativePath = .relativeTo(.sourceRoot, pathString) 284 | 285 | try super.init(id: id, fields: fields, allObjects: allObjects) 286 | } 287 | } 288 | 289 | 290 | public class XCConfigurationList : PBXProjectItem { 291 | public let buildConfigurations: [Reference] 292 | public let defaultConfigurationName: String? 293 | 294 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 295 | self.buildConfigurations = allObjects.createReferences(ids: try fields.ids("buildConfigurations")) 296 | self.defaultConfigurationName = try fields.optionalString("defaultConfigurationName") 297 | 298 | try super.init(id: id, fields: fields, allObjects: allObjects) 299 | } 300 | 301 | public var defaultConfiguration: XCBuildConfiguration? { 302 | for configuration in buildConfigurations { 303 | if let configuration = configuration.value, configuration.name == defaultConfigurationName { 304 | return configuration 305 | } 306 | } 307 | 308 | return nil 309 | } 310 | } 311 | 312 | public class PBXReference : PBXContainerItem { 313 | public let name: String? 314 | public let path: String? 315 | public let sourceTree: SourceTree 316 | 317 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 318 | self.name = try fields.optionalString("name") 319 | self.path = try fields.optionalString("path") 320 | 321 | let sourceTreeString = try fields.string("sourceTree") 322 | guard let sourceTree = SourceTree(rawValue: sourceTreeString) else { 323 | throw AllObjectsError.wrongType(key: sourceTreeString) 324 | } 325 | self.sourceTree = sourceTree 326 | 327 | try super.init(id: id, fields: fields, allObjects: allObjects) 328 | } 329 | } 330 | 331 | public class PBXFileReference : PBXReference { 332 | public let lastKnownFileType: String? 333 | 334 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 335 | self.lastKnownFileType = try fields.optionalString("lastKnownFileType") 336 | 337 | try super.init(id: id, fields: fields, allObjects: allObjects) 338 | } 339 | 340 | // convenience accessor 341 | public var fullPath: Path? { 342 | return self.allObjects.fullFilePaths[self.id] 343 | } 344 | 345 | } 346 | 347 | public class PBXReferenceProxy : PBXReference { 348 | 349 | public let remoteRef: Reference 350 | 351 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 352 | self.remoteRef = allObjects.createReference(id: try fields.id("remoteRef")) 353 | 354 | try super.init(id: id, fields: fields, allObjects: allObjects) 355 | } 356 | } 357 | 358 | public class PBXGroup : PBXReference { 359 | private var _children: [Reference] 360 | 361 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 362 | self._children = allObjects.createReferences(ids: try fields.ids("children")) 363 | 364 | try super.init(id: id, fields: fields, allObjects: allObjects) 365 | } 366 | 367 | public var children: [Reference] { 368 | return _children 369 | } 370 | 371 | public var subGroups: [Reference] { 372 | return _children.compactMap { childRef in 373 | guard let _ = childRef.value as? PBXGroup else { return nil } 374 | return Reference(allObjects: childRef.allObjects, id: childRef.id) 375 | } 376 | } 377 | 378 | public var fileRefs: [Reference] { 379 | return _children.compactMap { childRef in 380 | guard let _ = childRef.value as? PBXFileReference else { return nil } 381 | return Reference(allObjects: childRef.allObjects, id: childRef.id) 382 | } 383 | } 384 | 385 | // Don't expose publicly, because this only exposes one level, not for all descentend sub groups. 386 | internal var syncRoots: [Reference] { 387 | return _children.compactMap { childRef in 388 | guard let _ = childRef.value as? PBXFileSystemSynchronizedRootGroup else { return nil } 389 | return Reference(allObjects: childRef.allObjects, id: childRef.id) 390 | } 391 | } 392 | 393 | // Custom function for R.swift 394 | public func insertFileReference(_ fileReference: Reference, at index: Int) { 395 | if fileRefs.contains(fileReference) { return } 396 | 397 | let reference = Reference(allObjects: fileReference.allObjects, id: fileReference.id) 398 | _children.insert(reference, at: index) 399 | fields["children"] = _children.map { $0.id.value } 400 | } 401 | } 402 | 403 | public class PBXVariantGroup : PBXGroup { 404 | } 405 | 406 | public class PBXFileSystemSynchronizedRootGroup : PBXReference { 407 | public let exceptions: [Reference]? 408 | 409 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 410 | self.exceptions = allObjects.createOptionalReferences(ids: try fields.optionalIds("exceptions")) 411 | 412 | try super.init(id: id, fields: fields, allObjects: allObjects) 413 | } 414 | 415 | // convenience accessor 416 | public var fullPath: Path? { 417 | return self.allObjects.fullFilePaths[self.id] 418 | } 419 | } 420 | 421 | public class PBXFileSystemSynchronizedBuildFileExceptionSet : PBXObject { 422 | public let membershipExceptions: [String]? 423 | public let target: Reference 424 | 425 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 426 | self.membershipExceptions = try fields.optionalStrings("membershipExceptions") 427 | self.target = allObjects.createReference(id: try fields.id("target")) 428 | 429 | try super.init(id: id, fields: fields, allObjects: allObjects) 430 | } 431 | } 432 | 433 | public class PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet : PBXObject { 434 | public let buildPhase: Reference? 435 | 436 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 437 | self.buildPhase = allObjects.createOptionalReference(id: try fields.id("buildPhase")) 438 | 439 | try super.init(id: id, fields: fields, allObjects: allObjects) 440 | } 441 | } 442 | 443 | public class XCVersionGroup : PBXReference { 444 | public let children: [Reference] 445 | 446 | public required init(id: Guid, fields: Fields, allObjects: AllObjects) throws { 447 | self.children = allObjects.createReferences(ids: try fields.ids("children")) 448 | 449 | try super.init(id: id, fields: fields, allObjects: allObjects) 450 | } 451 | } 452 | 453 | 454 | public enum SourceTree: RawRepresentable { 455 | case absolute 456 | case group 457 | case relativeTo(SourceTreeFolder) 458 | 459 | public init?(rawValue: String) { 460 | switch rawValue { 461 | case "": 462 | self = .absolute 463 | 464 | case "": 465 | self = .group 466 | 467 | default: 468 | guard let sourceTreeFolder = SourceTreeFolder(rawValue: rawValue) else { return nil } 469 | self = .relativeTo(sourceTreeFolder) 470 | } 471 | } 472 | 473 | public var rawValue: String { 474 | switch self { 475 | case .absolute: 476 | return "" 477 | case .group: 478 | return "" 479 | case .relativeTo(let folter): 480 | return folter.rawValue 481 | } 482 | } 483 | } 484 | 485 | public enum SourceTreeFolder: String, Equatable { 486 | case sourceRoot = "SOURCE_ROOT" 487 | case buildProductsDir = "BUILT_PRODUCTS_DIR" 488 | case developerDir = "DEVELOPER_DIR" 489 | case sdkRoot = "SDKROOT" 490 | case platformDir = "PLATFORM_DIR" 491 | 492 | public static func ==(lhs: SourceTreeFolder, rhs: SourceTreeFolder) -> Bool { 493 | return lhs.rawValue == rhs.rawValue 494 | } 495 | } 496 | 497 | public enum Path: Equatable { 498 | case absolute(String) 499 | case relativeTo(SourceTreeFolder, String) 500 | 501 | @available(OSX 10.11, *) 502 | public func url(with urlForSourceTreeFolder: (SourceTreeFolder) -> URL) -> URL { 503 | switch self { 504 | case let .absolute(absolutePath): 505 | return URL(fileURLWithPath: absolutePath).standardizedFileURL 506 | 507 | case let .relativeTo(sourceTreeFolder, relativePath): 508 | let sourceTreeURL = urlForSourceTreeFolder(sourceTreeFolder) 509 | return URL(fileURLWithPath: relativePath, relativeTo: sourceTreeURL).standardizedFileURL 510 | } 511 | } 512 | 513 | public static func ==(lhs: Path, rhs: Path) -> Bool { 514 | switch (lhs, rhs) { 515 | case let (.absolute(lpath), .absolute(rpath)): 516 | return lpath == rpath 517 | 518 | case let (.relativeTo(lfolder, lpath), .relativeTo(rfolder, rpath)): 519 | let lurl = URL(string: lfolder.rawValue)!.appendingPathComponent(lpath).standardized 520 | let rurl = URL(string: rfolder.rawValue)!.appendingPathComponent(rpath).standardized 521 | 522 | return lurl == rurl 523 | 524 | default: 525 | return false 526 | } 527 | } 528 | } 529 | -------------------------------------------------------------------------------- /Test_projects/ExternalBuildTool.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 01345A5E20D24BFF00BD812A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01345A5D20D24BFF00BD812A /* AppDelegate.swift */; }; 11 | 01345A6020D24BFF00BD812A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01345A5F20D24BFF00BD812A /* ViewController.swift */; }; 12 | 01345A6320D24BFF00BD812A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 01345A6120D24BFF00BD812A /* Main.storyboard */; }; 13 | 01345A6520D24C0100BD812A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 01345A6420D24C0100BD812A /* Assets.xcassets */; }; 14 | 01345A6820D24C0100BD812A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 01345A6620D24C0100BD812A /* LaunchScreen.storyboard */; }; 15 | 01345A7020D251EA00BD812A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 01345A6F20D251EA00BD812A /* Localizable.strings */; }; 16 | 01345A7320D25A1000BD812A /* R.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01345A7220D25A1000BD812A /* R.generated.swift */; }; 17 | 01345A7920D25C1A00BD812A /* ShellScript.sh in Resources */ = {isa = PBXBuildFile; fileRef = 01345A7820D25BE700BD812A /* ShellScript.sh */; }; 18 | 6BB0FF2C6876A52C91E46ABE /* Pods_R_swiftTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C643979AEA6A580883B90C59 /* Pods_R_swiftTest.framework */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXBuildRule section */ 22 | E2B829B523F5970500200547 /* PBXBuildRule */ = { 23 | isa = PBXBuildRule; 24 | compilerSpec = com.apple.compilers.proxy.script; 25 | filePatterns = "*.plist"; 26 | fileType = pattern.proxy; 27 | inputFiles = ( 28 | ); 29 | isEditable = 1; 30 | outputFiles = ( 31 | "$(DERIVED_FILE_DIR)/${INPUT_FILE_NAME}", 32 | ); 33 | script = "cat\n"; 34 | }; 35 | /* End PBXBuildRule section */ 36 | 37 | /* Begin PBXContainerItemProxy section */ 38 | 01345A7A20D25C7500BD812A /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = 01345A5220D24BFF00BD812A /* Project object */; 41 | proxyType = 1; 42 | remoteGlobalIDString = 01345A7420D25B4D00BD812A; 43 | remoteInfo = R.swiftTestPreBuild; 44 | }; 45 | /* End PBXContainerItemProxy section */ 46 | 47 | /* Begin PBXFileReference section */ 48 | 01345A5A20D24BFF00BD812A /* R.swiftTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = R.swiftTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 01345A5D20D24BFF00BD812A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 50 | 01345A5F20D24BFF00BD812A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 51 | 01345A6220D24BFF00BD812A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 52 | 01345A6420D24C0100BD812A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 53 | 01345A6720D24C0100BD812A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 54 | 01345A6920D24C0100BD812A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | 01345A6F20D251EA00BD812A /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; 56 | 01345A7220D25A1000BD812A /* R.generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = R.generated.swift; sourceTree = SOURCE_ROOT; }; 57 | 01345A7820D25BE700BD812A /* ShellScript.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ShellScript.sh; sourceTree = SOURCE_ROOT; }; 58 | 6A79C848CD423353AD8288A3 /* Pods-R.swiftTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTest.debug.xcconfig"; path = "Pods/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest.debug.xcconfig"; sourceTree = ""; }; 59 | B70EFD449B187C1D38C1F73C /* Pods-R.swiftTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTest.release.xcconfig"; path = "Pods/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest.release.xcconfig"; sourceTree = ""; }; 60 | C643979AEA6A580883B90C59 /* Pods_R_swiftTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_R_swiftTest.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | /* End PBXFileReference section */ 62 | 63 | /* Begin PBXFrameworksBuildPhase section */ 64 | 01345A5720D24BFF00BD812A /* Frameworks */ = { 65 | isa = PBXFrameworksBuildPhase; 66 | buildActionMask = 2147483647; 67 | files = ( 68 | 6BB0FF2C6876A52C91E46ABE /* Pods_R_swiftTest.framework in Frameworks */, 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | /* End PBXFrameworksBuildPhase section */ 73 | 74 | /* Begin PBXGroup section */ 75 | 01345A5120D24BFF00BD812A = { 76 | isa = PBXGroup; 77 | children = ( 78 | 01345A5C20D24BFF00BD812A /* R.swiftTest */, 79 | 01345A5B20D24BFF00BD812A /* Products */, 80 | A64B4C86A6159E18BA6389C5 /* Pods */, 81 | 34BC474A7FEC1B0A78C1FFDD /* Frameworks */, 82 | ); 83 | sourceTree = ""; 84 | }; 85 | 01345A5B20D24BFF00BD812A /* Products */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 01345A5A20D24BFF00BD812A /* R.swiftTest.app */, 89 | ); 90 | name = Products; 91 | sourceTree = ""; 92 | }; 93 | 01345A5C20D24BFF00BD812A /* R.swiftTest */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 01345A5D20D24BFF00BD812A /* AppDelegate.swift */, 97 | 01345A5F20D24BFF00BD812A /* ViewController.swift */, 98 | 01345A7220D25A1000BD812A /* R.generated.swift */, 99 | 01345A7820D25BE700BD812A /* ShellScript.sh */, 100 | 01345A6420D24C0100BD812A /* Assets.xcassets */, 101 | 01345A6920D24C0100BD812A /* Info.plist */, 102 | 01345A6F20D251EA00BD812A /* Localizable.strings */, 103 | 01345A6620D24C0100BD812A /* LaunchScreen.storyboard */, 104 | 01345A6120D24BFF00BD812A /* Main.storyboard */, 105 | ); 106 | path = R.swiftTest; 107 | sourceTree = ""; 108 | }; 109 | 34BC474A7FEC1B0A78C1FFDD /* Frameworks */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | C643979AEA6A580883B90C59 /* Pods_R_swiftTest.framework */, 113 | ); 114 | name = Frameworks; 115 | sourceTree = ""; 116 | }; 117 | A64B4C86A6159E18BA6389C5 /* Pods */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 6A79C848CD423353AD8288A3 /* Pods-R.swiftTest.debug.xcconfig */, 121 | B70EFD449B187C1D38C1F73C /* Pods-R.swiftTest.release.xcconfig */, 122 | ); 123 | name = Pods; 124 | sourceTree = ""; 125 | }; 126 | /* End PBXGroup section */ 127 | 128 | /* Begin PBXLegacyTarget section */ 129 | 01345A7420D25B4D00BD812A /* R.swiftTestPreBuild */ = { 130 | isa = PBXLegacyTarget; 131 | buildArgumentsString = $PROJECT_DIR/ShellScript.sh; 132 | buildConfigurationList = 01345A7520D25B4D00BD812A /* Build configuration list for PBXLegacyTarget "R.swiftTestPreBuild" */; 133 | buildPhases = ( 134 | ); 135 | buildToolPath = /bin/sh; 136 | buildWorkingDirectory = ""; 137 | dependencies = ( 138 | ); 139 | name = R.swiftTestPreBuild; 140 | passBuildSettingsInEnvironment = 1; 141 | productName = R.swiftTestPreBuild; 142 | }; 143 | /* End PBXLegacyTarget section */ 144 | 145 | /* Begin PBXNativeTarget section */ 146 | 01345A5920D24BFF00BD812A /* R.swiftTest */ = { 147 | isa = PBXNativeTarget; 148 | buildConfigurationList = 01345A6C20D24C0100BD812A /* Build configuration list for PBXNativeTarget "R.swiftTest" */; 149 | buildPhases = ( 150 | 179111CA9821F85C900D8102 /* [CP] Check Pods Manifest.lock */, 151 | 01345A7120D259EB00BD812A /* R.swift */, 152 | 01345A5620D24BFF00BD812A /* Sources */, 153 | 01345A5720D24BFF00BD812A /* Frameworks */, 154 | 01345A5820D24BFF00BD812A /* Resources */, 155 | 2A242B082559080243A00DB6 /* [CP] Embed Pods Frameworks */, 156 | ); 157 | buildRules = ( 158 | E2B829B523F5970500200547 /* PBXBuildRule */, 159 | ); 160 | dependencies = ( 161 | 01345A7B20D25C7500BD812A /* PBXTargetDependency */, 162 | ); 163 | name = R.swiftTest; 164 | productName = R.swiftTest; 165 | productReference = 01345A5A20D24BFF00BD812A /* R.swiftTest.app */; 166 | productType = "com.apple.product-type.application"; 167 | }; 168 | /* End PBXNativeTarget section */ 169 | 170 | /* Begin PBXProject section */ 171 | 01345A5220D24BFF00BD812A /* Project object */ = { 172 | isa = PBXProject; 173 | attributes = { 174 | LastSwiftUpdateCheck = 0940; 175 | LastUpgradeCheck = 0940; 176 | ORGANIZATIONNAME = Styleshoots; 177 | TargetAttributes = { 178 | 01345A5920D24BFF00BD812A = { 179 | CreatedOnToolsVersion = 9.4; 180 | }; 181 | 01345A7420D25B4D00BD812A = { 182 | CreatedOnToolsVersion = 9.4; 183 | }; 184 | }; 185 | }; 186 | buildConfigurationList = 01345A5520D24BFF00BD812A /* Build configuration list for PBXProject "ExternalBuildTool" */; 187 | compatibilityVersion = "Xcode 9.3"; 188 | developmentRegion = en; 189 | hasScannedForEncodings = 0; 190 | knownRegions = ( 191 | en, 192 | Base, 193 | ); 194 | mainGroup = 01345A5120D24BFF00BD812A; 195 | productRefGroup = 01345A5B20D24BFF00BD812A /* Products */; 196 | projectDirPath = ""; 197 | projectRoot = ""; 198 | targets = ( 199 | 01345A5920D24BFF00BD812A /* R.swiftTest */, 200 | 01345A7420D25B4D00BD812A /* R.swiftTestPreBuild */, 201 | ); 202 | }; 203 | /* End PBXProject section */ 204 | 205 | /* Begin PBXResourcesBuildPhase section */ 206 | 01345A5820D24BFF00BD812A /* Resources */ = { 207 | isa = PBXResourcesBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | 01345A7020D251EA00BD812A /* Localizable.strings in Resources */, 211 | 01345A6820D24C0100BD812A /* LaunchScreen.storyboard in Resources */, 212 | 01345A7920D25C1A00BD812A /* ShellScript.sh in Resources */, 213 | 01345A6520D24C0100BD812A /* Assets.xcassets in Resources */, 214 | 01345A6320D24BFF00BD812A /* Main.storyboard in Resources */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXResourcesBuildPhase section */ 219 | 220 | /* Begin PBXShellScriptBuildPhase section */ 221 | 01345A7120D259EB00BD812A /* R.swift */ = { 222 | isa = PBXShellScriptBuildPhase; 223 | buildActionMask = 2147483647; 224 | files = ( 225 | ); 226 | inputPaths = ( 227 | ); 228 | name = R.swift; 229 | outputPaths = ( 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | shellPath = /bin/sh; 233 | shellScript = "\"$PODS_ROOT/R.swift/rswift\" generate \"$SRCROOT\"\n"; 234 | }; 235 | 179111CA9821F85C900D8102 /* [CP] Check Pods Manifest.lock */ = { 236 | isa = PBXShellScriptBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | inputPaths = ( 241 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 242 | "${PODS_ROOT}/Manifest.lock", 243 | ); 244 | name = "[CP] Check Pods Manifest.lock"; 245 | outputPaths = ( 246 | "$(DERIVED_FILE_DIR)/Pods-R.swiftTest-checkManifestLockResult.txt", 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | shellPath = /bin/sh; 250 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 251 | showEnvVarsInLog = 0; 252 | }; 253 | 2A242B082559080243A00DB6 /* [CP] Embed Pods Frameworks */ = { 254 | isa = PBXShellScriptBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | ); 258 | inputPaths = ( 259 | "${SRCROOT}/Pods/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest-frameworks.sh", 260 | "${BUILT_PRODUCTS_DIR}/R.swift.Library/Rswift.framework", 261 | ); 262 | name = "[CP] Embed Pods Frameworks"; 263 | outputPaths = ( 264 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Rswift.framework", 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | shellPath = /bin/sh; 268 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest-frameworks.sh\"\n"; 269 | showEnvVarsInLog = 0; 270 | }; 271 | /* End PBXShellScriptBuildPhase section */ 272 | 273 | /* Begin PBXSourcesBuildPhase section */ 274 | 01345A5620D24BFF00BD812A /* Sources */ = { 275 | isa = PBXSourcesBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | 01345A6020D24BFF00BD812A /* ViewController.swift in Sources */, 279 | 01345A5E20D24BFF00BD812A /* AppDelegate.swift in Sources */, 280 | 01345A7320D25A1000BD812A /* R.generated.swift in Sources */, 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | }; 284 | /* End PBXSourcesBuildPhase section */ 285 | 286 | /* Begin PBXTargetDependency section */ 287 | 01345A7B20D25C7500BD812A /* PBXTargetDependency */ = { 288 | isa = PBXTargetDependency; 289 | target = 01345A7420D25B4D00BD812A /* R.swiftTestPreBuild */; 290 | targetProxy = 01345A7A20D25C7500BD812A /* PBXContainerItemProxy */; 291 | }; 292 | /* End PBXTargetDependency section */ 293 | 294 | /* Begin PBXVariantGroup section */ 295 | 01345A6120D24BFF00BD812A /* Main.storyboard */ = { 296 | isa = PBXVariantGroup; 297 | children = ( 298 | 01345A6220D24BFF00BD812A /* Base */, 299 | ); 300 | name = Main.storyboard; 301 | sourceTree = ""; 302 | }; 303 | 01345A6620D24C0100BD812A /* LaunchScreen.storyboard */ = { 304 | isa = PBXVariantGroup; 305 | children = ( 306 | 01345A6720D24C0100BD812A /* Base */, 307 | ); 308 | name = LaunchScreen.storyboard; 309 | sourceTree = ""; 310 | }; 311 | /* End PBXVariantGroup section */ 312 | 313 | /* Begin XCBuildConfiguration section */ 314 | 01345A6A20D24C0100BD812A /* Debug */ = { 315 | isa = XCBuildConfiguration; 316 | buildSettings = { 317 | ALWAYS_SEARCH_USER_PATHS = NO; 318 | CLANG_ANALYZER_NONNULL = YES; 319 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 320 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 321 | CLANG_CXX_LIBRARY = "libc++"; 322 | CLANG_ENABLE_MODULES = YES; 323 | CLANG_ENABLE_OBJC_ARC = YES; 324 | CLANG_ENABLE_OBJC_WEAK = YES; 325 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 326 | CLANG_WARN_BOOL_CONVERSION = YES; 327 | CLANG_WARN_COMMA = YES; 328 | CLANG_WARN_CONSTANT_CONVERSION = YES; 329 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 330 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 331 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 332 | CLANG_WARN_EMPTY_BODY = YES; 333 | CLANG_WARN_ENUM_CONVERSION = YES; 334 | CLANG_WARN_INFINITE_RECURSION = YES; 335 | CLANG_WARN_INT_CONVERSION = YES; 336 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 337 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 338 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 339 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 340 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 341 | CLANG_WARN_STRICT_PROTOTYPES = YES; 342 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 343 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 344 | CLANG_WARN_UNREACHABLE_CODE = YES; 345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 346 | CODE_SIGN_IDENTITY = "iPhone Developer"; 347 | COPY_PHASE_STRIP = NO; 348 | DEBUG_INFORMATION_FORMAT = dwarf; 349 | ENABLE_STRICT_OBJC_MSGSEND = YES; 350 | ENABLE_TESTABILITY = YES; 351 | GCC_C_LANGUAGE_STANDARD = gnu11; 352 | GCC_DYNAMIC_NO_PIC = NO; 353 | GCC_NO_COMMON_BLOCKS = YES; 354 | GCC_OPTIMIZATION_LEVEL = 0; 355 | GCC_PREPROCESSOR_DEFINITIONS = ( 356 | "DEBUG=1", 357 | "$(inherited)", 358 | ); 359 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 360 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 361 | GCC_WARN_UNDECLARED_SELECTOR = YES; 362 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 363 | GCC_WARN_UNUSED_FUNCTION = YES; 364 | GCC_WARN_UNUSED_VARIABLE = YES; 365 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 366 | MTL_ENABLE_DEBUG_INFO = YES; 367 | ONLY_ACTIVE_ARCH = YES; 368 | SDKROOT = iphoneos; 369 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 370 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 371 | }; 372 | name = Debug; 373 | }; 374 | 01345A6B20D24C0100BD812A /* Release */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ALWAYS_SEARCH_USER_PATHS = NO; 378 | CLANG_ANALYZER_NONNULL = YES; 379 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 380 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 381 | CLANG_CXX_LIBRARY = "libc++"; 382 | CLANG_ENABLE_MODULES = YES; 383 | CLANG_ENABLE_OBJC_ARC = YES; 384 | CLANG_ENABLE_OBJC_WEAK = YES; 385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 386 | CLANG_WARN_BOOL_CONVERSION = YES; 387 | CLANG_WARN_COMMA = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 392 | CLANG_WARN_EMPTY_BODY = YES; 393 | CLANG_WARN_ENUM_CONVERSION = YES; 394 | CLANG_WARN_INFINITE_RECURSION = YES; 395 | CLANG_WARN_INT_CONVERSION = YES; 396 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 397 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 398 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 399 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 400 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 401 | CLANG_WARN_STRICT_PROTOTYPES = YES; 402 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 403 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 404 | CLANG_WARN_UNREACHABLE_CODE = YES; 405 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 406 | CODE_SIGN_IDENTITY = "iPhone Developer"; 407 | COPY_PHASE_STRIP = NO; 408 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 409 | ENABLE_NS_ASSERTIONS = NO; 410 | ENABLE_STRICT_OBJC_MSGSEND = YES; 411 | GCC_C_LANGUAGE_STANDARD = gnu11; 412 | GCC_NO_COMMON_BLOCKS = YES; 413 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 414 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 415 | GCC_WARN_UNDECLARED_SELECTOR = YES; 416 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 417 | GCC_WARN_UNUSED_FUNCTION = YES; 418 | GCC_WARN_UNUSED_VARIABLE = YES; 419 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 420 | MTL_ENABLE_DEBUG_INFO = NO; 421 | SDKROOT = iphoneos; 422 | SWIFT_COMPILATION_MODE = wholemodule; 423 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 424 | VALIDATE_PRODUCT = YES; 425 | }; 426 | name = Release; 427 | }; 428 | 01345A6D20D24C0100BD812A /* Debug */ = { 429 | isa = XCBuildConfiguration; 430 | baseConfigurationReference = 6A79C848CD423353AD8288A3 /* Pods-R.swiftTest.debug.xcconfig */; 431 | buildSettings = { 432 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 433 | CODE_SIGN_IDENTITY = "iPhone Developer"; 434 | CODE_SIGN_STYLE = Manual; 435 | DEVELOPMENT_TEAM = ""; 436 | INFOPLIST_FILE = R.swiftTest/Info.plist; 437 | LD_RUNPATH_SEARCH_PATHS = ( 438 | "$(inherited)", 439 | "@executable_path/Frameworks", 440 | ); 441 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.styleshoots.R-swiftTest"; 442 | PRODUCT_NAME = "$(TARGET_NAME)"; 443 | PROVISIONING_PROFILE = ""; 444 | PROVISIONING_PROFILE_SPECIFIER = ""; 445 | SWIFT_VERSION = 4.0; 446 | TARGETED_DEVICE_FAMILY = "1,2"; 447 | }; 448 | name = Debug; 449 | }; 450 | 01345A6E20D24C0100BD812A /* Release */ = { 451 | isa = XCBuildConfiguration; 452 | baseConfigurationReference = B70EFD449B187C1D38C1F73C /* Pods-R.swiftTest.release.xcconfig */; 453 | buildSettings = { 454 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 455 | CODE_SIGN_IDENTITY = "iPhone Developer"; 456 | CODE_SIGN_STYLE = Manual; 457 | DEVELOPMENT_TEAM = ""; 458 | INFOPLIST_FILE = R.swiftTest/Info.plist; 459 | LD_RUNPATH_SEARCH_PATHS = ( 460 | "$(inherited)", 461 | "@executable_path/Frameworks", 462 | ); 463 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.styleshoots.R-swiftTest"; 464 | PRODUCT_NAME = "$(TARGET_NAME)"; 465 | PROVISIONING_PROFILE_SPECIFIER = ""; 466 | SWIFT_VERSION = 4.0; 467 | TARGETED_DEVICE_FAMILY = "1,2"; 468 | }; 469 | name = Release; 470 | }; 471 | 01345A7620D25B4D00BD812A /* Debug */ = { 472 | isa = XCBuildConfiguration; 473 | buildSettings = { 474 | CODE_SIGN_STYLE = Automatic; 475 | DEBUGGING_SYMBOLS = YES; 476 | DEBUG_INFORMATION_FORMAT = dwarf; 477 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES; 478 | GCC_OPTIMIZATION_LEVEL = 0; 479 | OTHER_CFLAGS = ""; 480 | OTHER_LDFLAGS = ""; 481 | PRODUCT_NAME = "$(TARGET_NAME)"; 482 | }; 483 | name = Debug; 484 | }; 485 | 01345A7720D25B4D00BD812A /* Release */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | CODE_SIGN_STYLE = Automatic; 489 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 490 | OTHER_CFLAGS = ""; 491 | OTHER_LDFLAGS = ""; 492 | PRODUCT_NAME = "$(TARGET_NAME)"; 493 | }; 494 | name = Release; 495 | }; 496 | /* End XCBuildConfiguration section */ 497 | 498 | /* Begin XCConfigurationList section */ 499 | 01345A5520D24BFF00BD812A /* Build configuration list for PBXProject "ExternalBuildTool" */ = { 500 | isa = XCConfigurationList; 501 | buildConfigurations = ( 502 | 01345A6A20D24C0100BD812A /* Debug */, 503 | 01345A6B20D24C0100BD812A /* Release */, 504 | ); 505 | defaultConfigurationIsVisible = 0; 506 | defaultConfigurationName = Release; 507 | }; 508 | 01345A6C20D24C0100BD812A /* Build configuration list for PBXNativeTarget "R.swiftTest" */ = { 509 | isa = XCConfigurationList; 510 | buildConfigurations = ( 511 | 01345A6D20D24C0100BD812A /* Debug */, 512 | 01345A6E20D24C0100BD812A /* Release */, 513 | ); 514 | defaultConfigurationIsVisible = 0; 515 | defaultConfigurationName = Release; 516 | }; 517 | 01345A7520D25B4D00BD812A /* Build configuration list for PBXLegacyTarget "R.swiftTestPreBuild" */ = { 518 | isa = XCConfigurationList; 519 | buildConfigurations = ( 520 | 01345A7620D25B4D00BD812A /* Debug */, 521 | 01345A7720D25B4D00BD812A /* Release */, 522 | ); 523 | defaultConfigurationIsVisible = 0; 524 | defaultConfigurationName = Release; 525 | }; 526 | /* End XCConfigurationList section */ 527 | }; 528 | rootObject = 01345A5220D24BFF00BD812A /* Project object */; 529 | } 530 | -------------------------------------------------------------------------------- /Test_projects/SpmDependency.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3DBC587B00CEE623DA7657A3 /* Pods_R_swiftTestTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 160EF67F277A54F3B350BE03 /* Pods_R_swiftTestTests.framework */; }; 11 | 556046845600D90D4AAF61D4 /* Pods_R_swiftTestUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CA791B5658E2ED5CD0A7A76 /* Pods_R_swiftTestUITests.framework */; }; 12 | 70E5FA1E81CE7FE28B47C349 /* Pods_R_swiftTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01BB0F7909F18B000A7D6984 /* Pods_R_swiftTest.framework */; }; 13 | D4D02DD322ED206E00F80FC8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D02DD222ED206E00F80FC8 /* AppDelegate.swift */; }; 14 | D4D02DD522ED206E00F80FC8 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D02DD422ED206E00F80FC8 /* SceneDelegate.swift */; }; 15 | D4D02DD722ED206E00F80FC8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D02DD622ED206E00F80FC8 /* ViewController.swift */; }; 16 | D4D02DDA22ED206E00F80FC8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D4D02DD822ED206E00F80FC8 /* Main.storyboard */; }; 17 | D4D02DDC22ED206F00F80FC8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D4D02DDB22ED206F00F80FC8 /* Assets.xcassets */; }; 18 | D4D02DDF22ED206F00F80FC8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D4D02DDD22ED206F00F80FC8 /* LaunchScreen.storyboard */; }; 19 | D4D02DEA22ED206F00F80FC8 /* R_swiftTestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D02DE922ED206F00F80FC8 /* R_swiftTestTests.swift */; }; 20 | D4D02DF522ED206F00F80FC8 /* R_swiftTestUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D02DF422ED206F00F80FC8 /* R_swiftTestUITests.swift */; }; 21 | D4D02E0422ED21BE00F80FC8 /* R.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4D02E0322ED21BE00F80FC8 /* R.generated.swift */; }; 22 | D4D02E0722ED224E00F80FC8 /* ExamplePackage in Frameworks */ = {isa = PBXBuildFile; productRef = D4D02E0622ED224E00F80FC8 /* ExamplePackage */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | D4D02DE622ED206F00F80FC8 /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = D4D02DC722ED206E00F80FC8 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = D4D02DCE22ED206E00F80FC8; 31 | remoteInfo = R.swiftTest; 32 | }; 33 | D4D02DF122ED206F00F80FC8 /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = D4D02DC722ED206E00F80FC8 /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = D4D02DCE22ED206E00F80FC8; 38 | remoteInfo = R.swiftTest; 39 | }; 40 | /* End PBXContainerItemProxy section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | 01BB0F7909F18B000A7D6984 /* Pods_R_swiftTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_R_swiftTest.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 160EF67F277A54F3B350BE03 /* Pods_R_swiftTestTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_R_swiftTestTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 4FF3A8268395A369DE34C7CB /* Pods-R.swiftTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTest.release.xcconfig"; path = "Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest.release.xcconfig"; sourceTree = ""; }; 46 | 59D32ED98D94201101EB7D35 /* Pods-R.swiftTestTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTestTests.release.xcconfig"; path = "Target Support Files/Pods-R.swiftTestTests/Pods-R.swiftTestTests.release.xcconfig"; sourceTree = ""; }; 47 | 5CA791B5658E2ED5CD0A7A76 /* Pods_R_swiftTestUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_R_swiftTestUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | 99CC39DF26BA3338CB28174D /* Pods-R.swiftTestTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTestTests.debug.xcconfig"; path = "Target Support Files/Pods-R.swiftTestTests/Pods-R.swiftTestTests.debug.xcconfig"; sourceTree = ""; }; 49 | C8F8DD8FA2D1F46247D076D1 /* Pods-R.swiftTest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTest.debug.xcconfig"; path = "Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest.debug.xcconfig"; sourceTree = ""; }; 50 | D4D02DCF22ED206E00F80FC8 /* R.swiftTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = R.swiftTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | D4D02DD222ED206E00F80FC8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 52 | D4D02DD422ED206E00F80FC8 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 53 | D4D02DD622ED206E00F80FC8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 54 | D4D02DD922ED206E00F80FC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 55 | D4D02DDB22ED206F00F80FC8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 56 | D4D02DDE22ED206F00F80FC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 57 | D4D02DE022ED206F00F80FC8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | D4D02DE522ED206F00F80FC8 /* R.swiftTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = R.swiftTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | D4D02DE922ED206F00F80FC8 /* R_swiftTestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = R_swiftTestTests.swift; sourceTree = ""; }; 60 | D4D02DEB22ED206F00F80FC8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 61 | D4D02DF022ED206F00F80FC8 /* R.swiftTestUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = R.swiftTestUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | D4D02DF422ED206F00F80FC8 /* R_swiftTestUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = R_swiftTestUITests.swift; sourceTree = ""; }; 63 | D4D02DF622ED206F00F80FC8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 64 | D4D02E0322ED21BE00F80FC8 /* R.generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = R.generated.swift; sourceTree = ""; }; 65 | D4D02E0522ED222100F80FC8 /* ExamplePackage */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ExamplePackage; sourceTree = ""; }; 66 | EC11D85B7E6C24C9BE76413E /* Pods-R.swiftTestUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTestUITests.debug.xcconfig"; path = "Target Support Files/Pods-R.swiftTestUITests/Pods-R.swiftTestUITests.debug.xcconfig"; sourceTree = ""; }; 67 | F731A190F106FF3E1ACC17D6 /* Pods-R.swiftTestUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-R.swiftTestUITests.release.xcconfig"; path = "Target Support Files/Pods-R.swiftTestUITests/Pods-R.swiftTestUITests.release.xcconfig"; sourceTree = ""; }; 68 | /* End PBXFileReference section */ 69 | 70 | /* Begin PBXFrameworksBuildPhase section */ 71 | D4D02DCC22ED206E00F80FC8 /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | D4D02E0722ED224E00F80FC8 /* ExamplePackage in Frameworks */, 76 | 70E5FA1E81CE7FE28B47C349 /* Pods_R_swiftTest.framework in Frameworks */, 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | D4D02DE222ED206F00F80FC8 /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | 3DBC587B00CEE623DA7657A3 /* Pods_R_swiftTestTests.framework in Frameworks */, 85 | ); 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | D4D02DED22ED206F00F80FC8 /* Frameworks */ = { 89 | isa = PBXFrameworksBuildPhase; 90 | buildActionMask = 2147483647; 91 | files = ( 92 | 556046845600D90D4AAF61D4 /* Pods_R_swiftTestUITests.framework in Frameworks */, 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | /* End PBXFrameworksBuildPhase section */ 97 | 98 | /* Begin PBXGroup section */ 99 | ABC3E90E7132666C0AB0B288 /* Pods */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | C8F8DD8FA2D1F46247D076D1 /* Pods-R.swiftTest.debug.xcconfig */, 103 | 4FF3A8268395A369DE34C7CB /* Pods-R.swiftTest.release.xcconfig */, 104 | 99CC39DF26BA3338CB28174D /* Pods-R.swiftTestTests.debug.xcconfig */, 105 | 59D32ED98D94201101EB7D35 /* Pods-R.swiftTestTests.release.xcconfig */, 106 | EC11D85B7E6C24C9BE76413E /* Pods-R.swiftTestUITests.debug.xcconfig */, 107 | F731A190F106FF3E1ACC17D6 /* Pods-R.swiftTestUITests.release.xcconfig */, 108 | ); 109 | path = Pods; 110 | sourceTree = ""; 111 | }; 112 | D4D02DC622ED206E00F80FC8 = { 113 | isa = PBXGroup; 114 | children = ( 115 | D4D02DD122ED206E00F80FC8 /* R.swiftTest */, 116 | D4D02DE822ED206F00F80FC8 /* R.swiftTestTests */, 117 | D4D02DF322ED206F00F80FC8 /* R.swiftTestUITests */, 118 | D4D02E0522ED222100F80FC8 /* ExamplePackage */, 119 | D4D02DD022ED206E00F80FC8 /* Products */, 120 | ABC3E90E7132666C0AB0B288 /* Pods */, 121 | FBA1B2EDF94ED16C3B3494C6 /* Frameworks */, 122 | ); 123 | sourceTree = ""; 124 | }; 125 | D4D02DD022ED206E00F80FC8 /* Products */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | D4D02DCF22ED206E00F80FC8 /* R.swiftTest.app */, 129 | D4D02DE522ED206F00F80FC8 /* R.swiftTestTests.xctest */, 130 | D4D02DF022ED206F00F80FC8 /* R.swiftTestUITests.xctest */, 131 | ); 132 | name = Products; 133 | sourceTree = ""; 134 | }; 135 | D4D02DD122ED206E00F80FC8 /* R.swiftTest */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | D4D02E0322ED21BE00F80FC8 /* R.generated.swift */, 139 | D4D02DD222ED206E00F80FC8 /* AppDelegate.swift */, 140 | D4D02DD422ED206E00F80FC8 /* SceneDelegate.swift */, 141 | D4D02DD622ED206E00F80FC8 /* ViewController.swift */, 142 | D4D02DD822ED206E00F80FC8 /* Main.storyboard */, 143 | D4D02DDB22ED206F00F80FC8 /* Assets.xcassets */, 144 | D4D02DDD22ED206F00F80FC8 /* LaunchScreen.storyboard */, 145 | D4D02DE022ED206F00F80FC8 /* Info.plist */, 146 | ); 147 | path = R.swiftTest; 148 | sourceTree = ""; 149 | }; 150 | D4D02DE822ED206F00F80FC8 /* R.swiftTestTests */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | D4D02DE922ED206F00F80FC8 /* R_swiftTestTests.swift */, 154 | D4D02DEB22ED206F00F80FC8 /* Info.plist */, 155 | ); 156 | path = R.swiftTestTests; 157 | sourceTree = ""; 158 | }; 159 | D4D02DF322ED206F00F80FC8 /* R.swiftTestUITests */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | D4D02DF422ED206F00F80FC8 /* R_swiftTestUITests.swift */, 163 | D4D02DF622ED206F00F80FC8 /* Info.plist */, 164 | ); 165 | path = R.swiftTestUITests; 166 | sourceTree = ""; 167 | }; 168 | FBA1B2EDF94ED16C3B3494C6 /* Frameworks */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 01BB0F7909F18B000A7D6984 /* Pods_R_swiftTest.framework */, 172 | 160EF67F277A54F3B350BE03 /* Pods_R_swiftTestTests.framework */, 173 | 5CA791B5658E2ED5CD0A7A76 /* Pods_R_swiftTestUITests.framework */, 174 | ); 175 | name = Frameworks; 176 | sourceTree = ""; 177 | }; 178 | /* End PBXGroup section */ 179 | 180 | /* Begin PBXNativeTarget section */ 181 | D4D02DCE22ED206E00F80FC8 /* R.swiftTest */ = { 182 | isa = PBXNativeTarget; 183 | buildConfigurationList = D4D02DF922ED206F00F80FC8 /* Build configuration list for PBXNativeTarget "R.swiftTest" */; 184 | buildPhases = ( 185 | FCCF86DB9505BAF46ED75ACE /* [CP] Check Pods Manifest.lock */, 186 | D4D02E0222ED214200F80FC8 /* ShellScript */, 187 | D4D02DCB22ED206E00F80FC8 /* Sources */, 188 | D4D02DCC22ED206E00F80FC8 /* Frameworks */, 189 | D4D02DCD22ED206E00F80FC8 /* Resources */, 190 | 4BC0747D83034CD2C7E513E9 /* [CP] Embed Pods Frameworks */, 191 | ); 192 | buildRules = ( 193 | ); 194 | dependencies = ( 195 | ); 196 | name = R.swiftTest; 197 | packageProductDependencies = ( 198 | D4D02E0622ED224E00F80FC8 /* ExamplePackage */, 199 | ); 200 | productName = R.swiftTest; 201 | productReference = D4D02DCF22ED206E00F80FC8 /* R.swiftTest.app */; 202 | productType = "com.apple.product-type.application"; 203 | }; 204 | D4D02DE422ED206F00F80FC8 /* R.swiftTestTests */ = { 205 | isa = PBXNativeTarget; 206 | buildConfigurationList = D4D02DFC22ED206F00F80FC8 /* Build configuration list for PBXNativeTarget "R.swiftTestTests" */; 207 | buildPhases = ( 208 | BBE5309ED958D7417ABA87C3 /* [CP] Check Pods Manifest.lock */, 209 | D4D02DE122ED206F00F80FC8 /* Sources */, 210 | D4D02DE222ED206F00F80FC8 /* Frameworks */, 211 | D4D02DE322ED206F00F80FC8 /* Resources */, 212 | ); 213 | buildRules = ( 214 | ); 215 | dependencies = ( 216 | D4D02DE722ED206F00F80FC8 /* PBXTargetDependency */, 217 | ); 218 | name = R.swiftTestTests; 219 | productName = R.swiftTestTests; 220 | productReference = D4D02DE522ED206F00F80FC8 /* R.swiftTestTests.xctest */; 221 | productType = "com.apple.product-type.bundle.unit-test"; 222 | }; 223 | D4D02DEF22ED206F00F80FC8 /* R.swiftTestUITests */ = { 224 | isa = PBXNativeTarget; 225 | buildConfigurationList = D4D02DFF22ED206F00F80FC8 /* Build configuration list for PBXNativeTarget "R.swiftTestUITests" */; 226 | buildPhases = ( 227 | 4768299E1F366AFCA659A80D /* [CP] Check Pods Manifest.lock */, 228 | D4D02DEC22ED206F00F80FC8 /* Sources */, 229 | D4D02DED22ED206F00F80FC8 /* Frameworks */, 230 | D4D02DEE22ED206F00F80FC8 /* Resources */, 231 | ); 232 | buildRules = ( 233 | ); 234 | dependencies = ( 235 | D4D02DF222ED206F00F80FC8 /* PBXTargetDependency */, 236 | ); 237 | name = R.swiftTestUITests; 238 | productName = R.swiftTestUITests; 239 | productReference = D4D02DF022ED206F00F80FC8 /* R.swiftTestUITests.xctest */; 240 | productType = "com.apple.product-type.bundle.ui-testing"; 241 | }; 242 | /* End PBXNativeTarget section */ 243 | 244 | /* Begin PBXProject section */ 245 | D4D02DC722ED206E00F80FC8 /* Project object */ = { 246 | isa = PBXProject; 247 | attributes = { 248 | LastSwiftUpdateCheck = 1100; 249 | LastUpgradeCheck = 1100; 250 | ORGANIZATIONNAME = Sample; 251 | TargetAttributes = { 252 | D4D02DCE22ED206E00F80FC8 = { 253 | CreatedOnToolsVersion = 11.0; 254 | }; 255 | D4D02DE422ED206F00F80FC8 = { 256 | CreatedOnToolsVersion = 11.0; 257 | TestTargetID = D4D02DCE22ED206E00F80FC8; 258 | }; 259 | D4D02DEF22ED206F00F80FC8 = { 260 | CreatedOnToolsVersion = 11.0; 261 | TestTargetID = D4D02DCE22ED206E00F80FC8; 262 | }; 263 | }; 264 | }; 265 | buildConfigurationList = D4D02DCA22ED206E00F80FC8 /* Build configuration list for PBXProject "SpmDependency" */; 266 | compatibilityVersion = "Xcode 9.3"; 267 | developmentRegion = en; 268 | hasScannedForEncodings = 0; 269 | knownRegions = ( 270 | en, 271 | Base, 272 | ); 273 | mainGroup = D4D02DC622ED206E00F80FC8; 274 | productRefGroup = D4D02DD022ED206E00F80FC8 /* Products */; 275 | projectDirPath = ""; 276 | projectRoot = ""; 277 | targets = ( 278 | D4D02DCE22ED206E00F80FC8 /* R.swiftTest */, 279 | D4D02DE422ED206F00F80FC8 /* R.swiftTestTests */, 280 | D4D02DEF22ED206F00F80FC8 /* R.swiftTestUITests */, 281 | ); 282 | }; 283 | /* End PBXProject section */ 284 | 285 | /* Begin PBXResourcesBuildPhase section */ 286 | D4D02DCD22ED206E00F80FC8 /* Resources */ = { 287 | isa = PBXResourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | D4D02DDF22ED206F00F80FC8 /* LaunchScreen.storyboard in Resources */, 291 | D4D02DDC22ED206F00F80FC8 /* Assets.xcassets in Resources */, 292 | D4D02DDA22ED206E00F80FC8 /* Main.storyboard in Resources */, 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | D4D02DE322ED206F00F80FC8 /* Resources */ = { 297 | isa = PBXResourcesBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | D4D02DEE22ED206F00F80FC8 /* Resources */ = { 304 | isa = PBXResourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | /* End PBXResourcesBuildPhase section */ 311 | 312 | /* Begin PBXShellScriptBuildPhase section */ 313 | 4768299E1F366AFCA659A80D /* [CP] Check Pods Manifest.lock */ = { 314 | isa = PBXShellScriptBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | ); 318 | inputFileListPaths = ( 319 | ); 320 | inputPaths = ( 321 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 322 | "${PODS_ROOT}/Manifest.lock", 323 | ); 324 | name = "[CP] Check Pods Manifest.lock"; 325 | outputFileListPaths = ( 326 | ); 327 | outputPaths = ( 328 | "$(DERIVED_FILE_DIR)/Pods-R.swiftTestUITests-checkManifestLockResult.txt", 329 | ); 330 | runOnlyForDeploymentPostprocessing = 0; 331 | shellPath = /bin/sh; 332 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 333 | showEnvVarsInLog = 0; 334 | }; 335 | 4BC0747D83034CD2C7E513E9 /* [CP] Embed Pods Frameworks */ = { 336 | isa = PBXShellScriptBuildPhase; 337 | buildActionMask = 2147483647; 338 | files = ( 339 | ); 340 | inputFileListPaths = ( 341 | "${PODS_ROOT}/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest-frameworks-${CONFIGURATION}-input-files.xcfilelist", 342 | ); 343 | name = "[CP] Embed Pods Frameworks"; 344 | outputFileListPaths = ( 345 | "${PODS_ROOT}/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest-frameworks-${CONFIGURATION}-output-files.xcfilelist", 346 | ); 347 | runOnlyForDeploymentPostprocessing = 0; 348 | shellPath = /bin/sh; 349 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-R.swiftTest/Pods-R.swiftTest-frameworks.sh\"\n"; 350 | showEnvVarsInLog = 0; 351 | }; 352 | BBE5309ED958D7417ABA87C3 /* [CP] Check Pods Manifest.lock */ = { 353 | isa = PBXShellScriptBuildPhase; 354 | buildActionMask = 2147483647; 355 | files = ( 356 | ); 357 | inputFileListPaths = ( 358 | ); 359 | inputPaths = ( 360 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 361 | "${PODS_ROOT}/Manifest.lock", 362 | ); 363 | name = "[CP] Check Pods Manifest.lock"; 364 | outputFileListPaths = ( 365 | ); 366 | outputPaths = ( 367 | "$(DERIVED_FILE_DIR)/Pods-R.swiftTestTests-checkManifestLockResult.txt", 368 | ); 369 | runOnlyForDeploymentPostprocessing = 0; 370 | shellPath = /bin/sh; 371 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 372 | showEnvVarsInLog = 0; 373 | }; 374 | D4D02E0222ED214200F80FC8 /* ShellScript */ = { 375 | isa = PBXShellScriptBuildPhase; 376 | buildActionMask = 2147483647; 377 | files = ( 378 | ); 379 | inputFileListPaths = ( 380 | ); 381 | inputPaths = ( 382 | "$TEMP_DIR/rswift-lastrun", 383 | ); 384 | outputFileListPaths = ( 385 | ); 386 | outputPaths = ( 387 | $SRCROOT/R.swiftTest/R.generated.swift, 388 | ); 389 | runOnlyForDeploymentPostprocessing = 0; 390 | shellPath = /bin/sh; 391 | shellScript = "\"$PODS_ROOT/R.swift/rswift\" generate \"$SRCROOT/R.swiftTest/R.generated.swift\"\n"; 392 | }; 393 | FCCF86DB9505BAF46ED75ACE /* [CP] Check Pods Manifest.lock */ = { 394 | isa = PBXShellScriptBuildPhase; 395 | buildActionMask = 2147483647; 396 | files = ( 397 | ); 398 | inputFileListPaths = ( 399 | ); 400 | inputPaths = ( 401 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 402 | "${PODS_ROOT}/Manifest.lock", 403 | ); 404 | name = "[CP] Check Pods Manifest.lock"; 405 | outputFileListPaths = ( 406 | ); 407 | outputPaths = ( 408 | "$(DERIVED_FILE_DIR)/Pods-R.swiftTest-checkManifestLockResult.txt", 409 | ); 410 | runOnlyForDeploymentPostprocessing = 0; 411 | shellPath = /bin/sh; 412 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 413 | showEnvVarsInLog = 0; 414 | }; 415 | /* End PBXShellScriptBuildPhase section */ 416 | 417 | /* Begin PBXSourcesBuildPhase section */ 418 | D4D02DCB22ED206E00F80FC8 /* Sources */ = { 419 | isa = PBXSourcesBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | D4D02DD722ED206E00F80FC8 /* ViewController.swift in Sources */, 423 | D4D02DD322ED206E00F80FC8 /* AppDelegate.swift in Sources */, 424 | D4D02DD522ED206E00F80FC8 /* SceneDelegate.swift in Sources */, 425 | D4D02E0422ED21BE00F80FC8 /* R.generated.swift in Sources */, 426 | ); 427 | runOnlyForDeploymentPostprocessing = 0; 428 | }; 429 | D4D02DE122ED206F00F80FC8 /* Sources */ = { 430 | isa = PBXSourcesBuildPhase; 431 | buildActionMask = 2147483647; 432 | files = ( 433 | D4D02DEA22ED206F00F80FC8 /* R_swiftTestTests.swift in Sources */, 434 | ); 435 | runOnlyForDeploymentPostprocessing = 0; 436 | }; 437 | D4D02DEC22ED206F00F80FC8 /* Sources */ = { 438 | isa = PBXSourcesBuildPhase; 439 | buildActionMask = 2147483647; 440 | files = ( 441 | D4D02DF522ED206F00F80FC8 /* R_swiftTestUITests.swift in Sources */, 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | /* End PBXSourcesBuildPhase section */ 446 | 447 | /* Begin PBXTargetDependency section */ 448 | D4D02DE722ED206F00F80FC8 /* PBXTargetDependency */ = { 449 | isa = PBXTargetDependency; 450 | target = D4D02DCE22ED206E00F80FC8 /* R.swiftTest */; 451 | targetProxy = D4D02DE622ED206F00F80FC8 /* PBXContainerItemProxy */; 452 | }; 453 | D4D02DF222ED206F00F80FC8 /* PBXTargetDependency */ = { 454 | isa = PBXTargetDependency; 455 | target = D4D02DCE22ED206E00F80FC8 /* R.swiftTest */; 456 | targetProxy = D4D02DF122ED206F00F80FC8 /* PBXContainerItemProxy */; 457 | }; 458 | /* End PBXTargetDependency section */ 459 | 460 | /* Begin PBXVariantGroup section */ 461 | D4D02DD822ED206E00F80FC8 /* Main.storyboard */ = { 462 | isa = PBXVariantGroup; 463 | children = ( 464 | D4D02DD922ED206E00F80FC8 /* Base */, 465 | ); 466 | name = Main.storyboard; 467 | sourceTree = ""; 468 | }; 469 | D4D02DDD22ED206F00F80FC8 /* LaunchScreen.storyboard */ = { 470 | isa = PBXVariantGroup; 471 | children = ( 472 | D4D02DDE22ED206F00F80FC8 /* Base */, 473 | ); 474 | name = LaunchScreen.storyboard; 475 | sourceTree = ""; 476 | }; 477 | /* End PBXVariantGroup section */ 478 | 479 | /* Begin XCBuildConfiguration section */ 480 | D4D02DF722ED206F00F80FC8 /* Debug */ = { 481 | isa = XCBuildConfiguration; 482 | buildSettings = { 483 | ALWAYS_SEARCH_USER_PATHS = NO; 484 | CLANG_ANALYZER_NONNULL = YES; 485 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 486 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 487 | CLANG_CXX_LIBRARY = "libc++"; 488 | CLANG_ENABLE_MODULES = YES; 489 | CLANG_ENABLE_OBJC_ARC = YES; 490 | CLANG_ENABLE_OBJC_WEAK = YES; 491 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 492 | CLANG_WARN_BOOL_CONVERSION = YES; 493 | CLANG_WARN_COMMA = YES; 494 | CLANG_WARN_CONSTANT_CONVERSION = YES; 495 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 496 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 497 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 498 | CLANG_WARN_EMPTY_BODY = YES; 499 | CLANG_WARN_ENUM_CONVERSION = YES; 500 | CLANG_WARN_INFINITE_RECURSION = YES; 501 | CLANG_WARN_INT_CONVERSION = YES; 502 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 503 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 504 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 505 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 506 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 507 | CLANG_WARN_STRICT_PROTOTYPES = YES; 508 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 509 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 510 | CLANG_WARN_UNREACHABLE_CODE = YES; 511 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 512 | COPY_PHASE_STRIP = NO; 513 | DEBUG_INFORMATION_FORMAT = dwarf; 514 | ENABLE_STRICT_OBJC_MSGSEND = YES; 515 | ENABLE_TESTABILITY = YES; 516 | GCC_C_LANGUAGE_STANDARD = gnu11; 517 | GCC_DYNAMIC_NO_PIC = NO; 518 | GCC_NO_COMMON_BLOCKS = YES; 519 | GCC_OPTIMIZATION_LEVEL = 0; 520 | GCC_PREPROCESSOR_DEFINITIONS = ( 521 | "DEBUG=1", 522 | "$(inherited)", 523 | ); 524 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 525 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 526 | GCC_WARN_UNDECLARED_SELECTOR = YES; 527 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 528 | GCC_WARN_UNUSED_FUNCTION = YES; 529 | GCC_WARN_UNUSED_VARIABLE = YES; 530 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 531 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 532 | MTL_FAST_MATH = YES; 533 | ONLY_ACTIVE_ARCH = YES; 534 | SDKROOT = iphoneos; 535 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 536 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 537 | }; 538 | name = Debug; 539 | }; 540 | D4D02DF822ED206F00F80FC8 /* Release */ = { 541 | isa = XCBuildConfiguration; 542 | buildSettings = { 543 | ALWAYS_SEARCH_USER_PATHS = NO; 544 | CLANG_ANALYZER_NONNULL = YES; 545 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 546 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 547 | CLANG_CXX_LIBRARY = "libc++"; 548 | CLANG_ENABLE_MODULES = YES; 549 | CLANG_ENABLE_OBJC_ARC = YES; 550 | CLANG_ENABLE_OBJC_WEAK = YES; 551 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 552 | CLANG_WARN_BOOL_CONVERSION = YES; 553 | CLANG_WARN_COMMA = YES; 554 | CLANG_WARN_CONSTANT_CONVERSION = YES; 555 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 556 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 557 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 558 | CLANG_WARN_EMPTY_BODY = YES; 559 | CLANG_WARN_ENUM_CONVERSION = YES; 560 | CLANG_WARN_INFINITE_RECURSION = YES; 561 | CLANG_WARN_INT_CONVERSION = YES; 562 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 563 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 564 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 565 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 566 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 567 | CLANG_WARN_STRICT_PROTOTYPES = YES; 568 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 569 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 570 | CLANG_WARN_UNREACHABLE_CODE = YES; 571 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 572 | COPY_PHASE_STRIP = NO; 573 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 574 | ENABLE_NS_ASSERTIONS = NO; 575 | ENABLE_STRICT_OBJC_MSGSEND = YES; 576 | GCC_C_LANGUAGE_STANDARD = gnu11; 577 | GCC_NO_COMMON_BLOCKS = YES; 578 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 579 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 580 | GCC_WARN_UNDECLARED_SELECTOR = YES; 581 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 582 | GCC_WARN_UNUSED_FUNCTION = YES; 583 | GCC_WARN_UNUSED_VARIABLE = YES; 584 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 585 | MTL_ENABLE_DEBUG_INFO = NO; 586 | MTL_FAST_MATH = YES; 587 | SDKROOT = iphoneos; 588 | SWIFT_COMPILATION_MODE = wholemodule; 589 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 590 | VALIDATE_PRODUCT = YES; 591 | }; 592 | name = Release; 593 | }; 594 | D4D02DFA22ED206F00F80FC8 /* Debug */ = { 595 | isa = XCBuildConfiguration; 596 | baseConfigurationReference = C8F8DD8FA2D1F46247D076D1 /* Pods-R.swiftTest.debug.xcconfig */; 597 | buildSettings = { 598 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 599 | CODE_SIGN_STYLE = Automatic; 600 | INFOPLIST_FILE = R.swiftTest/Info.plist; 601 | LD_RUNPATH_SEARCH_PATHS = ( 602 | "$(inherited)", 603 | "@executable_path/Frameworks", 604 | ); 605 | PRODUCT_BUNDLE_IDENTIFIER = "com.sample.R-swiftTest"; 606 | PRODUCT_NAME = "$(TARGET_NAME)"; 607 | SWIFT_VERSION = 5.0; 608 | TARGETED_DEVICE_FAMILY = "1,2"; 609 | }; 610 | name = Debug; 611 | }; 612 | D4D02DFB22ED206F00F80FC8 /* Release */ = { 613 | isa = XCBuildConfiguration; 614 | baseConfigurationReference = 4FF3A8268395A369DE34C7CB /* Pods-R.swiftTest.release.xcconfig */; 615 | buildSettings = { 616 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 617 | CODE_SIGN_STYLE = Automatic; 618 | INFOPLIST_FILE = R.swiftTest/Info.plist; 619 | LD_RUNPATH_SEARCH_PATHS = ( 620 | "$(inherited)", 621 | "@executable_path/Frameworks", 622 | ); 623 | PRODUCT_BUNDLE_IDENTIFIER = "com.sample.R-swiftTest"; 624 | PRODUCT_NAME = "$(TARGET_NAME)"; 625 | SWIFT_VERSION = 5.0; 626 | TARGETED_DEVICE_FAMILY = "1,2"; 627 | }; 628 | name = Release; 629 | }; 630 | D4D02DFD22ED206F00F80FC8 /* Debug */ = { 631 | isa = XCBuildConfiguration; 632 | baseConfigurationReference = 99CC39DF26BA3338CB28174D /* Pods-R.swiftTestTests.debug.xcconfig */; 633 | buildSettings = { 634 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 635 | BUNDLE_LOADER = "$(TEST_HOST)"; 636 | CODE_SIGN_STYLE = Automatic; 637 | INFOPLIST_FILE = R.swiftTestTests/Info.plist; 638 | LD_RUNPATH_SEARCH_PATHS = ( 639 | "$(inherited)", 640 | "@executable_path/Frameworks", 641 | "@loader_path/Frameworks", 642 | ); 643 | PRODUCT_BUNDLE_IDENTIFIER = "com.sample.R-swiftTestTests"; 644 | PRODUCT_NAME = "$(TARGET_NAME)"; 645 | SWIFT_VERSION = 5.0; 646 | TARGETED_DEVICE_FAMILY = "1,2"; 647 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/R.swiftTest.app/R.swiftTest"; 648 | }; 649 | name = Debug; 650 | }; 651 | D4D02DFE22ED206F00F80FC8 /* Release */ = { 652 | isa = XCBuildConfiguration; 653 | baseConfigurationReference = 59D32ED98D94201101EB7D35 /* Pods-R.swiftTestTests.release.xcconfig */; 654 | buildSettings = { 655 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 656 | BUNDLE_LOADER = "$(TEST_HOST)"; 657 | CODE_SIGN_STYLE = Automatic; 658 | INFOPLIST_FILE = R.swiftTestTests/Info.plist; 659 | LD_RUNPATH_SEARCH_PATHS = ( 660 | "$(inherited)", 661 | "@executable_path/Frameworks", 662 | "@loader_path/Frameworks", 663 | ); 664 | PRODUCT_BUNDLE_IDENTIFIER = "com.sample.R-swiftTestTests"; 665 | PRODUCT_NAME = "$(TARGET_NAME)"; 666 | SWIFT_VERSION = 5.0; 667 | TARGETED_DEVICE_FAMILY = "1,2"; 668 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/R.swiftTest.app/R.swiftTest"; 669 | }; 670 | name = Release; 671 | }; 672 | D4D02E0022ED206F00F80FC8 /* Debug */ = { 673 | isa = XCBuildConfiguration; 674 | baseConfigurationReference = EC11D85B7E6C24C9BE76413E /* Pods-R.swiftTestUITests.debug.xcconfig */; 675 | buildSettings = { 676 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 677 | CODE_SIGN_STYLE = Automatic; 678 | INFOPLIST_FILE = R.swiftTestUITests/Info.plist; 679 | LD_RUNPATH_SEARCH_PATHS = ( 680 | "$(inherited)", 681 | "@executable_path/Frameworks", 682 | "@loader_path/Frameworks", 683 | ); 684 | PRODUCT_BUNDLE_IDENTIFIER = "com.sample.R-swiftTestUITests"; 685 | PRODUCT_NAME = "$(TARGET_NAME)"; 686 | SWIFT_VERSION = 5.0; 687 | TARGETED_DEVICE_FAMILY = "1,2"; 688 | TEST_TARGET_NAME = R.swiftTest; 689 | }; 690 | name = Debug; 691 | }; 692 | D4D02E0122ED206F00F80FC8 /* Release */ = { 693 | isa = XCBuildConfiguration; 694 | baseConfigurationReference = F731A190F106FF3E1ACC17D6 /* Pods-R.swiftTestUITests.release.xcconfig */; 695 | buildSettings = { 696 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 697 | CODE_SIGN_STYLE = Automatic; 698 | INFOPLIST_FILE = R.swiftTestUITests/Info.plist; 699 | LD_RUNPATH_SEARCH_PATHS = ( 700 | "$(inherited)", 701 | "@executable_path/Frameworks", 702 | "@loader_path/Frameworks", 703 | ); 704 | PRODUCT_BUNDLE_IDENTIFIER = "com.sample.R-swiftTestUITests"; 705 | PRODUCT_NAME = "$(TARGET_NAME)"; 706 | SWIFT_VERSION = 5.0; 707 | TARGETED_DEVICE_FAMILY = "1,2"; 708 | TEST_TARGET_NAME = R.swiftTest; 709 | }; 710 | name = Release; 711 | }; 712 | /* End XCBuildConfiguration section */ 713 | 714 | /* Begin XCConfigurationList section */ 715 | D4D02DCA22ED206E00F80FC8 /* Build configuration list for PBXProject "SpmDependency" */ = { 716 | isa = XCConfigurationList; 717 | buildConfigurations = ( 718 | D4D02DF722ED206F00F80FC8 /* Debug */, 719 | D4D02DF822ED206F00F80FC8 /* Release */, 720 | ); 721 | defaultConfigurationIsVisible = 0; 722 | defaultConfigurationName = Release; 723 | }; 724 | D4D02DF922ED206F00F80FC8 /* Build configuration list for PBXNativeTarget "R.swiftTest" */ = { 725 | isa = XCConfigurationList; 726 | buildConfigurations = ( 727 | D4D02DFA22ED206F00F80FC8 /* Debug */, 728 | D4D02DFB22ED206F00F80FC8 /* Release */, 729 | ); 730 | defaultConfigurationIsVisible = 0; 731 | defaultConfigurationName = Release; 732 | }; 733 | D4D02DFC22ED206F00F80FC8 /* Build configuration list for PBXNativeTarget "R.swiftTestTests" */ = { 734 | isa = XCConfigurationList; 735 | buildConfigurations = ( 736 | D4D02DFD22ED206F00F80FC8 /* Debug */, 737 | D4D02DFE22ED206F00F80FC8 /* Release */, 738 | ); 739 | defaultConfigurationIsVisible = 0; 740 | defaultConfigurationName = Release; 741 | }; 742 | D4D02DFF22ED206F00F80FC8 /* Build configuration list for PBXNativeTarget "R.swiftTestUITests" */ = { 743 | isa = XCConfigurationList; 744 | buildConfigurations = ( 745 | D4D02E0022ED206F00F80FC8 /* Debug */, 746 | D4D02E0122ED206F00F80FC8 /* Release */, 747 | ); 748 | defaultConfigurationIsVisible = 0; 749 | defaultConfigurationName = Release; 750 | }; 751 | /* End XCConfigurationList section */ 752 | 753 | /* Begin XCSwiftPackageProductDependency section */ 754 | D4D02E0622ED224E00F80FC8 /* ExamplePackage */ = { 755 | isa = XCSwiftPackageProductDependency; 756 | productName = ExamplePackage; 757 | }; 758 | /* End XCSwiftPackageProductDependency section */ 759 | }; 760 | rootObject = D4D02DC722ED206E00F80FC8 /* Project object */; 761 | } 762 | -------------------------------------------------------------------------------- /Test_projects/HelloCpp.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1AC6FB21180E996B004C840B /* libcocos2d Mac.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AC6FAF9180E9839004C840B /* libcocos2d Mac.a */; }; 11 | 1AC6FB30180E99EB004C840B /* libcocos2d iOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AC6FB07180E9839004C840B /* libcocos2d iOS.a */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 15 | 3EACC98F19EE6D4300EB3C5E /* res in Resources */ = {isa = PBXBuildFile; fileRef = 3EACC98E19EE6D4300EB3C5E /* res */; }; 16 | 3EACC99019EE6D4300EB3C5E /* res in Resources */ = {isa = PBXBuildFile; fileRef = 3EACC98E19EE6D4300EB3C5E /* res */; }; 17 | 46880B7B19C43A67006E1F66 /* CloseNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = 46880B7619C43A67006E1F66 /* CloseNormal.png */; }; 18 | 46880B7C19C43A67006E1F66 /* CloseNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = 46880B7619C43A67006E1F66 /* CloseNormal.png */; }; 19 | 46880B7D19C43A67006E1F66 /* CloseSelected.png in Resources */ = {isa = PBXBuildFile; fileRef = 46880B7719C43A67006E1F66 /* CloseSelected.png */; }; 20 | 46880B7E19C43A67006E1F66 /* CloseSelected.png in Resources */ = {isa = PBXBuildFile; fileRef = 46880B7719C43A67006E1F66 /* CloseSelected.png */; }; 21 | 46880B8119C43A67006E1F66 /* HelloWorld.png in Resources */ = {isa = PBXBuildFile; fileRef = 46880B7A19C43A67006E1F66 /* HelloWorld.png */; }; 22 | 46880B8219C43A67006E1F66 /* HelloWorld.png in Resources */ = {isa = PBXBuildFile; fileRef = 46880B7A19C43A67006E1F66 /* HelloWorld.png */; }; 23 | 46880B8819C43A87006E1F66 /* AppDelegate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46880B8419C43A87006E1F66 /* AppDelegate.cpp */; }; 24 | 46880B8919C43A87006E1F66 /* AppDelegate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46880B8419C43A87006E1F66 /* AppDelegate.cpp */; }; 25 | 46880B8A19C43A87006E1F66 /* HelloWorldScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46880B8619C43A87006E1F66 /* HelloWorldScene.cpp */; }; 26 | 46880B8B19C43A87006E1F66 /* HelloWorldScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46880B8619C43A87006E1F66 /* HelloWorldScene.cpp */; }; 27 | 503AE0F817EB97AB00D1A890 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 503AE0F617EB97AB00D1A890 /* Icon.icns */; }; 28 | 503AE10017EB989F00D1A890 /* AppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 503AE0FB17EB989F00D1A890 /* AppController.mm */; }; 29 | 503AE10117EB989F00D1A890 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 503AE0FC17EB989F00D1A890 /* main.m */; }; 30 | 503AE10217EB989F00D1A890 /* RootViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 503AE0FF17EB989F00D1A890 /* RootViewController.mm */; }; 31 | 503AE10517EB98FF00D1A890 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 503AE10317EB98FF00D1A890 /* main.cpp */; }; 32 | 503AE11B17EB9C5A00D1A890 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 503AE11A17EB9C5A00D1A890 /* IOKit.framework */; }; 33 | 5087E76317EB910900C73F5D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 34 | 5087E76717EB910900C73F5D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = BF170DB412928DE900B8313A /* libz.dylib */; }; 35 | 5087E76817EB910900C73F5D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF1C47EA1293683800B63C5D /* QuartzCore.framework */; }; 36 | 5087E76917EB910900C73F5D /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D44C620B132DFF330009C878 /* OpenAL.framework */; }; 37 | 5087E76A17EB910900C73F5D /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D44C620D132DFF430009C878 /* AVFoundation.framework */; }; 38 | 5087E76B17EB910900C73F5D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D44C620F132DFF4E0009C878 /* AudioToolbox.framework */; }; 39 | 5087E77D17EB970100C73F5D /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77217EB970100C73F5D /* Default-568h@2x.png */; }; 40 | 5087E77E17EB970100C73F5D /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77317EB970100C73F5D /* Default.png */; }; 41 | 5087E77F17EB970100C73F5D /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77417EB970100C73F5D /* Default@2x.png */; }; 42 | 5087E78017EB970100C73F5D /* Icon-114.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77517EB970100C73F5D /* Icon-114.png */; }; 43 | 5087E78117EB970100C73F5D /* Icon-120.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77617EB970100C73F5D /* Icon-120.png */; }; 44 | 5087E78217EB970100C73F5D /* Icon-144.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77717EB970100C73F5D /* Icon-144.png */; }; 45 | 5087E78317EB970100C73F5D /* Icon-152.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77817EB970100C73F5D /* Icon-152.png */; }; 46 | 5087E78417EB970100C73F5D /* Icon-57.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77917EB970100C73F5D /* Icon-57.png */; }; 47 | 5087E78517EB970100C73F5D /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77A17EB970100C73F5D /* Icon-72.png */; }; 48 | 5087E78617EB970100C73F5D /* Icon-76.png in Resources */ = {isa = PBXBuildFile; fileRef = 5087E77B17EB970100C73F5D /* Icon-76.png */; }; 49 | 5087E78917EB974C00C73F5D /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5087E78817EB974C00C73F5D /* AppKit.framework */; }; 50 | 5087E78B17EB975400C73F5D /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5087E78A17EB975400C73F5D /* OpenGL.framework */; }; 51 | 50EF629617ECD46A001EB2F8 /* Icon-40.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629217ECD46A001EB2F8 /* Icon-40.png */; }; 52 | 50EF629717ECD46A001EB2F8 /* Icon-58.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629317ECD46A001EB2F8 /* Icon-58.png */; }; 53 | 50EF629817ECD46A001EB2F8 /* Icon-80.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629417ECD46A001EB2F8 /* Icon-80.png */; }; 54 | 50EF629917ECD46A001EB2F8 /* Icon-100.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF629517ECD46A001EB2F8 /* Icon-100.png */; }; 55 | 50EF62A217ECD613001EB2F8 /* Icon-29.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF62A017ECD613001EB2F8 /* Icon-29.png */; }; 56 | 50EF62A317ECD613001EB2F8 /* Icon-50.png in Resources */ = {isa = PBXBuildFile; fileRef = 50EF62A117ECD613001EB2F8 /* Icon-50.png */; }; 57 | 521A8E6419F0C34300D177D7 /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 521A8E6219F0C34300D177D7 /* Default-667h@2x.png */; }; 58 | 521A8E6519F0C34300D177D7 /* Default-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 521A8E6319F0C34300D177D7 /* Default-736h@3x.png */; }; 59 | 521A8EA919F11F5000D177D7 /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = 521A8EA819F11F5000D177D7 /* fonts */; }; 60 | 521A8EAA19F11F5000D177D7 /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = 521A8EA819F11F5000D177D7 /* fonts */; }; 61 | 52B47A471A53D09C004E4C60 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52B47A461A53D09B004E4C60 /* Security.framework */; }; 62 | 8262943E1AAF051F00CB7CF7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8262943D1AAF051F00CB7CF7 /* Security.framework */; }; 63 | BF171245129291EC00B8313A /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF170DB012928DE900B8313A /* OpenGLES.framework */; }; 64 | BF1712471292920000B8313A /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = BF170DB412928DE900B8313A /* libz.dylib */; }; 65 | BF1C47F01293687400B63C5D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF1C47EA1293683800B63C5D /* QuartzCore.framework */; }; 66 | D44C620C132DFF330009C878 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D44C620B132DFF330009C878 /* OpenAL.framework */; }; 67 | D44C620E132DFF430009C878 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D44C620D132DFF430009C878 /* AVFoundation.framework */; }; 68 | D44C6210132DFF4E0009C878 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D44C620F132DFF4E0009C878 /* AudioToolbox.framework */; }; 69 | D6B0611B1803AB670077942B /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6B0611A1803AB670077942B /* CoreMotion.framework */; }; 70 | ED545A7C1B68A1F400C3958E /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = ED545A7B1B68A1F400C3958E /* libiconv.dylib */; }; 71 | ED545A7E1B68A1FA00C3958E /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = ED545A7D1B68A1FA00C3958E /* libiconv.dylib */; }; 72 | /* End PBXBuildFile section */ 73 | 74 | /* Begin PBXContainerItemProxy section */ 75 | 1AC6FAF8180E9839004C840B /* PBXContainerItemProxy */ = { 76 | isa = PBXContainerItemProxy; 77 | containerPortal = 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */; 78 | proxyType = 2; 79 | remoteGlobalIDString = 1551A33F158F2AB200E66CFE; 80 | remoteInfo = "cocos2dx Mac"; 81 | }; 82 | 1AC6FB06180E9839004C840B /* PBXContainerItemProxy */ = { 83 | isa = PBXContainerItemProxy; 84 | containerPortal = 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */; 85 | proxyType = 2; 86 | remoteGlobalIDString = A07A4D641783777C0073F6A7; 87 | remoteInfo = "cocos2dx iOS"; 88 | }; 89 | 1AC6FB15180E9959004C840B /* PBXContainerItemProxy */ = { 90 | isa = PBXContainerItemProxy; 91 | containerPortal = 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */; 92 | proxyType = 1; 93 | remoteGlobalIDString = 1551A33E158F2AB200E66CFE; 94 | remoteInfo = "cocos2dx Mac"; 95 | }; 96 | 1AC6FB24180E99E1004C840B /* PBXContainerItemProxy */ = { 97 | isa = PBXContainerItemProxy; 98 | containerPortal = 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */; 99 | proxyType = 1; 100 | remoteGlobalIDString = A07A4C241783777C0073F6A7; 101 | remoteInfo = "cocos2dx iOS"; 102 | }; 103 | /* End PBXContainerItemProxy section */ 104 | 105 | /* Begin PBXFileReference section */ 106 | 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = cocos2d_libs.xcodeproj; path = ../cocos2d/build/cocos2d_libs.xcodeproj; sourceTree = ""; }; 107 | 1ACB3243164770DE00914215 /* libcurl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcurl.a; path = ../../cocos2dx/platform/third_party/ios/libraries/libcurl.a; sourceTree = ""; }; 108 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 109 | 1D6058910D05DD3D006BFB54 /* HelloCpp-mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "HelloCpp-mobile.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 110 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 111 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 112 | 3EACC98E19EE6D4300EB3C5E /* res */ = {isa = PBXFileReference; lastKnownFileType = folder; path = res; sourceTree = ""; }; 113 | 46880B7619C43A67006E1F66 /* CloseNormal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CloseNormal.png; sourceTree = ""; }; 114 | 46880B7719C43A67006E1F66 /* CloseSelected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CloseSelected.png; sourceTree = ""; }; 115 | 46880B7A19C43A67006E1F66 /* HelloWorld.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = HelloWorld.png; sourceTree = ""; }; 116 | 46880B8419C43A87006E1F66 /* AppDelegate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AppDelegate.cpp; sourceTree = ""; }; 117 | 46880B8519C43A87006E1F66 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 118 | 46880B8619C43A87006E1F66 /* HelloWorldScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HelloWorldScene.cpp; sourceTree = ""; }; 119 | 46880B8719C43A87006E1F66 /* HelloWorldScene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelloWorldScene.h; sourceTree = ""; }; 120 | 503AE0F617EB97AB00D1A890 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; }; 121 | 503AE0F717EB97AB00D1A890 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 122 | 503AE0FA17EB989F00D1A890 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppController.h; path = ios/AppController.h; sourceTree = SOURCE_ROOT; }; 123 | 503AE0FB17EB989F00D1A890 /* AppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppController.mm; path = ios/AppController.mm; sourceTree = SOURCE_ROOT; }; 124 | 503AE0FC17EB989F00D1A890 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ios/main.m; sourceTree = SOURCE_ROOT; }; 125 | 503AE0FD17EB989F00D1A890 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Prefix.pch; path = ios/Prefix.pch; sourceTree = SOURCE_ROOT; }; 126 | 503AE0FE17EB989F00D1A890 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RootViewController.h; path = ios/RootViewController.h; sourceTree = SOURCE_ROOT; }; 127 | 503AE0FF17EB989F00D1A890 /* RootViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RootViewController.mm; path = ios/RootViewController.mm; sourceTree = SOURCE_ROOT; }; 128 | 503AE10317EB98FF00D1A890 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = mac/main.cpp; sourceTree = ""; }; 129 | 503AE10417EB98FF00D1A890 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Prefix.pch; path = mac/Prefix.pch; sourceTree = ""; }; 130 | 503AE11117EB99EE00D1A890 /* libcurl.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurl.dylib; path = usr/lib/libcurl.dylib; sourceTree = SDKROOT; }; 131 | 503AE11A17EB9C5A00D1A890 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 132 | 5087E76F17EB910900C73F5D /* HelloCpp-desktop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "HelloCpp-desktop.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 133 | 5087E77217EB970100C73F5D /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 134 | 5087E77317EB970100C73F5D /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 135 | 5087E77417EB970100C73F5D /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 136 | 5087E77517EB970100C73F5D /* Icon-114.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-114.png"; sourceTree = ""; }; 137 | 5087E77617EB970100C73F5D /* Icon-120.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-120.png"; sourceTree = ""; }; 138 | 5087E77717EB970100C73F5D /* Icon-144.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-144.png"; sourceTree = ""; }; 139 | 5087E77817EB970100C73F5D /* Icon-152.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-152.png"; sourceTree = ""; }; 140 | 5087E77917EB970100C73F5D /* Icon-57.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-57.png"; sourceTree = ""; }; 141 | 5087E77A17EB970100C73F5D /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = ""; }; 142 | 5087E77B17EB970100C73F5D /* Icon-76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-76.png"; sourceTree = ""; }; 143 | 5087E77C17EB970100C73F5D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 144 | 5087E78817EB974C00C73F5D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 145 | 5087E78A17EB975400C73F5D /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; 146 | 50EF629217ECD46A001EB2F8 /* Icon-40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-40.png"; sourceTree = ""; }; 147 | 50EF629317ECD46A001EB2F8 /* Icon-58.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-58.png"; sourceTree = ""; }; 148 | 50EF629417ECD46A001EB2F8 /* Icon-80.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-80.png"; sourceTree = ""; }; 149 | 50EF629517ECD46A001EB2F8 /* Icon-100.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-100.png"; sourceTree = ""; }; 150 | 50EF62A017ECD613001EB2F8 /* Icon-29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-29.png"; sourceTree = ""; }; 151 | 50EF62A117ECD613001EB2F8 /* Icon-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-50.png"; sourceTree = ""; }; 152 | 521A8E6219F0C34300D177D7 /* Default-667h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-667h@2x.png"; sourceTree = ""; }; 153 | 521A8E6319F0C34300D177D7 /* Default-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-736h@3x.png"; sourceTree = ""; }; 154 | 521A8EA819F11F5000D177D7 /* fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = fonts; sourceTree = ""; }; 155 | 52B47A461A53D09B004E4C60 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 156 | 8262943D1AAF051F00CB7CF7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 157 | BF170DB012928DE900B8313A /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 158 | BF170DB412928DE900B8313A /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 159 | BF1C47EA1293683800B63C5D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 160 | D44C620B132DFF330009C878 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; 161 | D44C620D132DFF430009C878 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 162 | D44C620F132DFF4E0009C878 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 163 | D6B0611A1803AB670077942B /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/CoreMotion.framework; sourceTree = DEVELOPER_DIR; }; 164 | ED545A7B1B68A1F400C3958E /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/usr/lib/libiconv.dylib; sourceTree = DEVELOPER_DIR; }; 165 | ED545A7D1B68A1FA00C3958E /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; 166 | /* End PBXFileReference section */ 167 | 168 | /* Begin PBXFrameworksBuildPhase section */ 169 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 170 | isa = PBXFrameworksBuildPhase; 171 | buildActionMask = 2147483647; 172 | files = ( 173 | ED545A7C1B68A1F400C3958E /* libiconv.dylib in Frameworks */, 174 | 52B47A471A53D09C004E4C60 /* Security.framework in Frameworks */, 175 | 1AC6FB30180E99EB004C840B /* libcocos2d iOS.a in Frameworks */, 176 | D6B0611B1803AB670077942B /* CoreMotion.framework in Frameworks */, 177 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 178 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 179 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, 180 | BF171245129291EC00B8313A /* OpenGLES.framework in Frameworks */, 181 | BF1712471292920000B8313A /* libz.dylib in Frameworks */, 182 | BF1C47F01293687400B63C5D /* QuartzCore.framework in Frameworks */, 183 | D44C620C132DFF330009C878 /* OpenAL.framework in Frameworks */, 184 | D44C620E132DFF430009C878 /* AVFoundation.framework in Frameworks */, 185 | D44C6210132DFF4E0009C878 /* AudioToolbox.framework in Frameworks */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | 5087E75C17EB910900C73F5D /* Frameworks */ = { 190 | isa = PBXFrameworksBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | ED545A7E1B68A1FA00C3958E /* libiconv.dylib in Frameworks */, 194 | 1AC6FB21180E996B004C840B /* libcocos2d Mac.a in Frameworks */, 195 | 5087E76717EB910900C73F5D /* libz.dylib in Frameworks */, 196 | 8262943E1AAF051F00CB7CF7 /* Security.framework in Frameworks */, 197 | 503AE11B17EB9C5A00D1A890 /* IOKit.framework in Frameworks */, 198 | 5087E78B17EB975400C73F5D /* OpenGL.framework in Frameworks */, 199 | 5087E78917EB974C00C73F5D /* AppKit.framework in Frameworks */, 200 | 5087E76317EB910900C73F5D /* Foundation.framework in Frameworks */, 201 | 5087E76817EB910900C73F5D /* QuartzCore.framework in Frameworks */, 202 | 5087E76917EB910900C73F5D /* OpenAL.framework in Frameworks */, 203 | 5087E76A17EB910900C73F5D /* AVFoundation.framework in Frameworks */, 204 | 5087E76B17EB910900C73F5D /* AudioToolbox.framework in Frameworks */, 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | }; 208 | /* End PBXFrameworksBuildPhase section */ 209 | 210 | /* Begin PBXGroup section */ 211 | 080E96DDFE201D6D7F000001 /* ios */ = { 212 | isa = PBXGroup; 213 | children = ( 214 | 5087E77117EB970100C73F5D /* Icons */, 215 | 503AE0FA17EB989F00D1A890 /* AppController.h */, 216 | 503AE0FB17EB989F00D1A890 /* AppController.mm */, 217 | 503AE0FC17EB989F00D1A890 /* main.m */, 218 | 503AE0FD17EB989F00D1A890 /* Prefix.pch */, 219 | 503AE0FE17EB989F00D1A890 /* RootViewController.h */, 220 | 503AE0FF17EB989F00D1A890 /* RootViewController.mm */, 221 | ); 222 | name = ios; 223 | path = Classes; 224 | sourceTree = ""; 225 | }; 226 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 227 | isa = PBXGroup; 228 | children = ( 229 | 1D6058910D05DD3D006BFB54 /* HelloCpp-mobile.app */, 230 | 5087E76F17EB910900C73F5D /* HelloCpp-desktop.app */, 231 | ); 232 | name = Products; 233 | sourceTree = ""; 234 | }; 235 | 1AC6FAE6180E9839004C840B /* Products */ = { 236 | isa = PBXGroup; 237 | children = ( 238 | 1AC6FAF9180E9839004C840B /* libcocos2d Mac.a */, 239 | 1AC6FB07180E9839004C840B /* libcocos2d iOS.a */, 240 | ); 241 | name = Products; 242 | sourceTree = ""; 243 | }; 244 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 245 | isa = PBXGroup; 246 | children = ( 247 | 46880B8319C43A87006E1F66 /* Classes */, 248 | 46880B7519C43A67006E1F66 /* Resources */, 249 | 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */, 250 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 251 | 080E96DDFE201D6D7F000001 /* ios */, 252 | 503AE10617EB990700D1A890 /* mac */, 253 | 19C28FACFE9D520D11CA2CBB /* Products */, 254 | ); 255 | name = CustomTemplate; 256 | sourceTree = ""; 257 | }; 258 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 259 | isa = PBXGroup; 260 | children = ( 261 | ED545A7D1B68A1FA00C3958E /* libiconv.dylib */, 262 | ED545A7B1B68A1F400C3958E /* libiconv.dylib */, 263 | 8262943D1AAF051F00CB7CF7 /* Security.framework */, 264 | 52B47A461A53D09B004E4C60 /* Security.framework */, 265 | D6B0611A1803AB670077942B /* CoreMotion.framework */, 266 | 503AE11A17EB9C5A00D1A890 /* IOKit.framework */, 267 | 503AE11117EB99EE00D1A890 /* libcurl.dylib */, 268 | 5087E78A17EB975400C73F5D /* OpenGL.framework */, 269 | 5087E78817EB974C00C73F5D /* AppKit.framework */, 270 | 1ACB3243164770DE00914215 /* libcurl.a */, 271 | BF170DB412928DE900B8313A /* libz.dylib */, 272 | D44C620F132DFF4E0009C878 /* AudioToolbox.framework */, 273 | D44C620D132DFF430009C878 /* AVFoundation.framework */, 274 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */, 275 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 276 | D44C620B132DFF330009C878 /* OpenAL.framework */, 277 | BF170DB012928DE900B8313A /* OpenGLES.framework */, 278 | BF1C47EA1293683800B63C5D /* QuartzCore.framework */, 279 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 280 | ); 281 | name = Frameworks; 282 | sourceTree = ""; 283 | }; 284 | 46880B7519C43A67006E1F66 /* Resources */ = { 285 | isa = PBXGroup; 286 | children = ( 287 | 521A8EA819F11F5000D177D7 /* fonts */, 288 | 3EACC98E19EE6D4300EB3C5E /* res */, 289 | 46880B7619C43A67006E1F66 /* CloseNormal.png */, 290 | 46880B7719C43A67006E1F66 /* CloseSelected.png */, 291 | 46880B7A19C43A67006E1F66 /* HelloWorld.png */, 292 | ); 293 | name = Resources; 294 | path = ../Resources; 295 | sourceTree = ""; 296 | }; 297 | 46880B8319C43A87006E1F66 /* Classes */ = { 298 | isa = PBXGroup; 299 | children = ( 300 | 46880B8419C43A87006E1F66 /* AppDelegate.cpp */, 301 | 46880B8519C43A87006E1F66 /* AppDelegate.h */, 302 | 46880B8619C43A87006E1F66 /* HelloWorldScene.cpp */, 303 | 46880B8719C43A87006E1F66 /* HelloWorldScene.h */, 304 | ); 305 | name = Classes; 306 | path = ../Classes; 307 | sourceTree = ""; 308 | }; 309 | 503AE0F517EB97AB00D1A890 /* Icons */ = { 310 | isa = PBXGroup; 311 | children = ( 312 | 503AE0F617EB97AB00D1A890 /* Icon.icns */, 313 | 503AE0F717EB97AB00D1A890 /* Info.plist */, 314 | ); 315 | name = Icons; 316 | path = mac; 317 | sourceTree = SOURCE_ROOT; 318 | }; 319 | 503AE10617EB990700D1A890 /* mac */ = { 320 | isa = PBXGroup; 321 | children = ( 322 | 503AE0F517EB97AB00D1A890 /* Icons */, 323 | 503AE10317EB98FF00D1A890 /* main.cpp */, 324 | 503AE10417EB98FF00D1A890 /* Prefix.pch */, 325 | ); 326 | name = mac; 327 | sourceTree = ""; 328 | }; 329 | 5087E77117EB970100C73F5D /* Icons */ = { 330 | isa = PBXGroup; 331 | children = ( 332 | 521A8E6219F0C34300D177D7 /* Default-667h@2x.png */, 333 | 521A8E6319F0C34300D177D7 /* Default-736h@3x.png */, 334 | 5087E77217EB970100C73F5D /* Default-568h@2x.png */, 335 | 5087E77317EB970100C73F5D /* Default.png */, 336 | 5087E77417EB970100C73F5D /* Default@2x.png */, 337 | 50EF62A017ECD613001EB2F8 /* Icon-29.png */, 338 | 50EF62A117ECD613001EB2F8 /* Icon-50.png */, 339 | 50EF629217ECD46A001EB2F8 /* Icon-40.png */, 340 | 50EF629317ECD46A001EB2F8 /* Icon-58.png */, 341 | 50EF629417ECD46A001EB2F8 /* Icon-80.png */, 342 | 50EF629517ECD46A001EB2F8 /* Icon-100.png */, 343 | 5087E77517EB970100C73F5D /* Icon-114.png */, 344 | 5087E77617EB970100C73F5D /* Icon-120.png */, 345 | 5087E77717EB970100C73F5D /* Icon-144.png */, 346 | 5087E77817EB970100C73F5D /* Icon-152.png */, 347 | 5087E77917EB970100C73F5D /* Icon-57.png */, 348 | 5087E77A17EB970100C73F5D /* Icon-72.png */, 349 | 5087E77B17EB970100C73F5D /* Icon-76.png */, 350 | 5087E77C17EB970100C73F5D /* Info.plist */, 351 | ); 352 | name = Icons; 353 | path = ios; 354 | sourceTree = SOURCE_ROOT; 355 | }; 356 | /* End PBXGroup section */ 357 | 358 | /* Begin PBXNativeTarget section */ 359 | 1D6058900D05DD3D006BFB54 /* HelloCpp-mobile */ = { 360 | isa = PBXNativeTarget; 361 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "HelloCpp-mobile" */; 362 | buildPhases = ( 363 | 1D60588D0D05DD3D006BFB54 /* Resources */, 364 | 1D60588E0D05DD3D006BFB54 /* Sources */, 365 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 366 | ); 367 | buildRules = ( 368 | ); 369 | dependencies = ( 370 | 1AC6FB25180E99E1004C840B /* PBXTargetDependency */, 371 | ); 372 | name = "HelloCpp-mobile"; 373 | productName = iphone; 374 | productReference = 1D6058910D05DD3D006BFB54 /* HelloCpp-mobile.app */; 375 | productType = "com.apple.product-type.application"; 376 | }; 377 | 5087E73D17EB910900C73F5D /* HelloCpp-desktop */ = { 378 | isa = PBXNativeTarget; 379 | buildConfigurationList = 5087E76C17EB910900C73F5D /* Build configuration list for PBXNativeTarget "HelloCpp-desktop" */; 380 | buildPhases = ( 381 | 5087E74817EB910900C73F5D /* Resources */, 382 | 5087E75617EB910900C73F5D /* Sources */, 383 | 5087E75C17EB910900C73F5D /* Frameworks */, 384 | ); 385 | buildRules = ( 386 | ); 387 | dependencies = ( 388 | 1AC6FB16180E9959004C840B /* PBXTargetDependency */, 389 | ); 390 | name = "HelloCpp-desktop"; 391 | productName = iphone; 392 | productReference = 5087E76F17EB910900C73F5D /* HelloCpp-desktop.app */; 393 | productType = "com.apple.product-type.application"; 394 | }; 395 | /* End PBXNativeTarget section */ 396 | 397 | /* Begin PBXProject section */ 398 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 399 | isa = PBXProject; 400 | attributes = { 401 | LastUpgradeCheck = 0500; 402 | }; 403 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "HelloCpp" */; 404 | compatibilityVersion = "Xcode 3.2"; 405 | developmentRegion = English; 406 | hasScannedForEncodings = 1; 407 | knownRegions = ( 408 | English, 409 | Japanese, 410 | French, 411 | German, 412 | ); 413 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 414 | projectDirPath = ""; 415 | projectReferences = ( 416 | { 417 | ProductGroup = 1AC6FAE6180E9839004C840B /* Products */; 418 | ProjectRef = 1AC6FAE5180E9839004C840B /* cocos2d_libs.xcodeproj */; 419 | }, 420 | ); 421 | projectRoot = ""; 422 | targets = ( 423 | 1D6058900D05DD3D006BFB54 /* HelloCpp-mobile */, 424 | 5087E73D17EB910900C73F5D /* HelloCpp-desktop */, 425 | ); 426 | }; 427 | /* End PBXProject section */ 428 | 429 | /* Begin PBXReferenceProxy section */ 430 | 1AC6FAF9180E9839004C840B /* libcocos2d Mac.a */ = { 431 | isa = PBXReferenceProxy; 432 | fileType = archive.ar; 433 | path = "libcocos2d Mac.a"; 434 | remoteRef = 1AC6FAF8180E9839004C840B /* PBXContainerItemProxy */; 435 | sourceTree = BUILT_PRODUCTS_DIR; 436 | }; 437 | 1AC6FB07180E9839004C840B /* libcocos2d iOS.a */ = { 438 | isa = PBXReferenceProxy; 439 | fileType = archive.ar; 440 | path = "libcocos2d iOS.a"; 441 | remoteRef = 1AC6FB06180E9839004C840B /* PBXContainerItemProxy */; 442 | sourceTree = BUILT_PRODUCTS_DIR; 443 | }; 444 | /* End PBXReferenceProxy section */ 445 | 446 | /* Begin PBXResourcesBuildPhase section */ 447 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 448 | isa = PBXResourcesBuildPhase; 449 | buildActionMask = 2147483647; 450 | files = ( 451 | 5087E78117EB970100C73F5D /* Icon-120.png in Resources */, 452 | 5087E78617EB970100C73F5D /* Icon-76.png in Resources */, 453 | 5087E77F17EB970100C73F5D /* Default@2x.png in Resources */, 454 | 50EF629917ECD46A001EB2F8 /* Icon-100.png in Resources */, 455 | 5087E78317EB970100C73F5D /* Icon-152.png in Resources */, 456 | 46880B8119C43A67006E1F66 /* HelloWorld.png in Resources */, 457 | 46880B7D19C43A67006E1F66 /* CloseSelected.png in Resources */, 458 | 5087E77D17EB970100C73F5D /* Default-568h@2x.png in Resources */, 459 | 5087E78517EB970100C73F5D /* Icon-72.png in Resources */, 460 | 521A8E6519F0C34300D177D7 /* Default-736h@3x.png in Resources */, 461 | 521A8EA919F11F5000D177D7 /* fonts in Resources */, 462 | 50EF62A317ECD613001EB2F8 /* Icon-50.png in Resources */, 463 | 5087E78017EB970100C73F5D /* Icon-114.png in Resources */, 464 | 50EF62A217ECD613001EB2F8 /* Icon-29.png in Resources */, 465 | 50EF629617ECD46A001EB2F8 /* Icon-40.png in Resources */, 466 | 5087E78217EB970100C73F5D /* Icon-144.png in Resources */, 467 | 3EACC98F19EE6D4300EB3C5E /* res in Resources */, 468 | 50EF629817ECD46A001EB2F8 /* Icon-80.png in Resources */, 469 | 5087E78417EB970100C73F5D /* Icon-57.png in Resources */, 470 | 5087E77E17EB970100C73F5D /* Default.png in Resources */, 471 | 521A8E6419F0C34300D177D7 /* Default-667h@2x.png in Resources */, 472 | 46880B7B19C43A67006E1F66 /* CloseNormal.png in Resources */, 473 | 50EF629717ECD46A001EB2F8 /* Icon-58.png in Resources */, 474 | ); 475 | runOnlyForDeploymentPostprocessing = 0; 476 | }; 477 | 5087E74817EB910900C73F5D /* Resources */ = { 478 | isa = PBXResourcesBuildPhase; 479 | buildActionMask = 2147483647; 480 | files = ( 481 | 46880B8219C43A67006E1F66 /* HelloWorld.png in Resources */, 482 | 503AE0F817EB97AB00D1A890 /* Icon.icns in Resources */, 483 | 3EACC99019EE6D4300EB3C5E /* res in Resources */, 484 | 521A8EAA19F11F5000D177D7 /* fonts in Resources */, 485 | 46880B7C19C43A67006E1F66 /* CloseNormal.png in Resources */, 486 | 46880B7E19C43A67006E1F66 /* CloseSelected.png in Resources */, 487 | ); 488 | runOnlyForDeploymentPostprocessing = 0; 489 | }; 490 | /* End PBXResourcesBuildPhase section */ 491 | 492 | /* Begin PBXSourcesBuildPhase section */ 493 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 494 | isa = PBXSourcesBuildPhase; 495 | buildActionMask = 2147483647; 496 | files = ( 497 | 46880B8819C43A87006E1F66 /* AppDelegate.cpp in Sources */, 498 | 46880B8A19C43A87006E1F66 /* HelloWorldScene.cpp in Sources */, 499 | 503AE10017EB989F00D1A890 /* AppController.mm in Sources */, 500 | 503AE10217EB989F00D1A890 /* RootViewController.mm in Sources */, 501 | 503AE10117EB989F00D1A890 /* main.m in Sources */, 502 | ); 503 | runOnlyForDeploymentPostprocessing = 0; 504 | }; 505 | 5087E75617EB910900C73F5D /* Sources */ = { 506 | isa = PBXSourcesBuildPhase; 507 | buildActionMask = 2147483647; 508 | files = ( 509 | 46880B8919C43A87006E1F66 /* AppDelegate.cpp in Sources */, 510 | 503AE10517EB98FF00D1A890 /* main.cpp in Sources */, 511 | 46880B8B19C43A87006E1F66 /* HelloWorldScene.cpp in Sources */, 512 | ); 513 | runOnlyForDeploymentPostprocessing = 0; 514 | }; 515 | /* End PBXSourcesBuildPhase section */ 516 | 517 | /* Begin PBXTargetDependency section */ 518 | 1AC6FB16180E9959004C840B /* PBXTargetDependency */ = { 519 | isa = PBXTargetDependency; 520 | name = "cocos2dx Mac"; 521 | targetProxy = 1AC6FB15180E9959004C840B /* PBXContainerItemProxy */; 522 | }; 523 | 1AC6FB25180E99E1004C840B /* PBXTargetDependency */ = { 524 | isa = PBXTargetDependency; 525 | name = "cocos2dx iOS"; 526 | targetProxy = 1AC6FB24180E99E1004C840B /* PBXContainerItemProxy */; 527 | }; 528 | /* End PBXTargetDependency section */ 529 | 530 | /* Begin XCBuildConfiguration section */ 531 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 532 | isa = XCBuildConfiguration; 533 | buildSettings = { 534 | ALWAYS_SEARCH_USER_PATHS = YES; 535 | CODE_SIGN_IDENTITY = "iPhone Developer"; 536 | COMPRESS_PNG_FILES = NO; 537 | ENABLE_BITCODE = NO; 538 | GCC_DYNAMIC_NO_PIC = NO; 539 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 540 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 541 | GCC_PREFIX_HEADER = ios/Prefix.pch; 542 | GCC_PREPROCESSOR_DEFINITIONS = ( 543 | USE_FILE32API, 544 | CC_TARGET_OS_IPHONE, 545 | "COCOS2D_DEBUG=1", 546 | "CC_ENABLE_CHIPMUNK_INTEGRATION=1", 547 | ); 548 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 549 | HEADER_SEARCH_PATHS = ( 550 | "$(inherited)", 551 | "$(SRCROOT)/../cocos2d/cocos/platform/ios", 552 | "$(SRCROOT)/../cocos2d/cocos/platform/ios/Simulation", 553 | ); 554 | INFOPLIST_FILE = ios/Info.plist; 555 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 556 | LIBRARY_SEARCH_PATHS = ""; 557 | OTHER_LDFLAGS = ( 558 | "$(_COCOS_LIB_IOS_BEGIN)", 559 | "$(_COCOS_LIB_IOS_END)", 560 | ); 561 | SDKROOT = iphoneos; 562 | TARGETED_DEVICE_FAMILY = "1,2"; 563 | USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; 564 | VALID_ARCHS = "arm64 armv7"; 565 | }; 566 | name = Debug; 567 | }; 568 | 1D6058950D05DD3E006BFB54 /* Release */ = { 569 | isa = XCBuildConfiguration; 570 | buildSettings = { 571 | ALWAYS_SEARCH_USER_PATHS = YES; 572 | CODE_SIGN_IDENTITY = "iPhone Developer"; 573 | COMPRESS_PNG_FILES = NO; 574 | ENABLE_BITCODE = NO; 575 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 576 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 577 | GCC_PREFIX_HEADER = ios/Prefix.pch; 578 | GCC_PREPROCESSOR_DEFINITIONS = ( 579 | USE_FILE32API, 580 | CC_TARGET_OS_IPHONE, 581 | "CC_ENABLE_CHIPMUNK_INTEGRATION=1", 582 | ); 583 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 584 | HEADER_SEARCH_PATHS = ( 585 | "$(inherited)", 586 | "$(SRCROOT)/../cocos2d/cocos/platform/ios", 587 | "$(SRCROOT)/../cocos2d/cocos/platform/ios/Simulation", 588 | ); 589 | INFOPLIST_FILE = ios/Info.plist; 590 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 591 | LIBRARY_SEARCH_PATHS = ""; 592 | OTHER_LDFLAGS = ( 593 | "$(_COCOS_LIB_IOS_BEGIN)", 594 | "$(_COCOS_LIB_IOS_END)", 595 | ); 596 | SDKROOT = iphoneos; 597 | TARGETED_DEVICE_FAMILY = "1,2"; 598 | USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; 599 | VALID_ARCHS = "arm64 armv7"; 600 | }; 601 | name = Release; 602 | }; 603 | 5087E76D17EB910900C73F5D /* Debug */ = { 604 | isa = XCBuildConfiguration; 605 | buildSettings = { 606 | ALWAYS_SEARCH_USER_PATHS = YES; 607 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 608 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 609 | CLANG_CXX_LIBRARY = "libc++"; 610 | GCC_DYNAMIC_NO_PIC = NO; 611 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 612 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 613 | GCC_PREFIX_HEADER = mac/Prefix.pch; 614 | GCC_PREPROCESSOR_DEFINITIONS = ( 615 | USE_FILE32API, 616 | CC_TARGET_OS_MAC, 617 | "COCOS2D_DEBUG=1", 618 | "CC_ENABLE_CHIPMUNK_INTEGRATION=1", 619 | ); 620 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 621 | HEADER_SEARCH_PATHS = ( 622 | "$(inherited)", 623 | "$(SRCROOT)/../cocos2d/cocos/platform/mac", 624 | "$(SRCROOT)/../cocos2d/external/glfw3/include/mac", 625 | ); 626 | INFOPLIST_FILE = mac/Info.plist; 627 | LIBRARY_SEARCH_PATHS = ""; 628 | OTHER_LDFLAGS = ( 629 | "$(_COCOS_LIB_MAC_BEGIN)", 630 | "$(_COCOS_LIB_MAC_END)", 631 | ); 632 | USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; 633 | }; 634 | name = Debug; 635 | }; 636 | 5087E76E17EB910900C73F5D /* Release */ = { 637 | isa = XCBuildConfiguration; 638 | buildSettings = { 639 | ALWAYS_SEARCH_USER_PATHS = YES; 640 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 641 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 642 | CLANG_CXX_LIBRARY = "libc++"; 643 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 644 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 645 | GCC_PREFIX_HEADER = mac/Prefix.pch; 646 | GCC_PREPROCESSOR_DEFINITIONS = ( 647 | USE_FILE32API, 648 | CC_TARGET_OS_MAC, 649 | "CC_ENABLE_CHIPMUNK_INTEGRATION=1", 650 | ); 651 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 652 | HEADER_SEARCH_PATHS = ( 653 | "$(inherited)", 654 | "$(SRCROOT)/../cocos2d/cocos/platform/mac", 655 | "$(SRCROOT)/../cocos2d/external/glfw3/include/mac", 656 | ); 657 | INFOPLIST_FILE = mac/Info.plist; 658 | LIBRARY_SEARCH_PATHS = ""; 659 | OTHER_LDFLAGS = ( 660 | "$(_COCOS_LIB_MAC_BEGIN)", 661 | "$(_COCOS_LIB_MAC_END)", 662 | ); 663 | USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; 664 | }; 665 | name = Release; 666 | }; 667 | C01FCF4F08A954540054247B /* Debug */ = { 668 | isa = XCBuildConfiguration; 669 | buildSettings = { 670 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 671 | CLANG_CXX_LIBRARY = "libc++"; 672 | COPY_PHASE_STRIP = NO; 673 | GCC_OPTIMIZATION_LEVEL = 0; 674 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 675 | GCC_WARN_UNUSED_VARIABLE = YES; 676 | HEADER_SEARCH_PATHS = ( 677 | "$(SRCROOT)/../cocos2d", 678 | "$(SRCROOT)/../cocos2d/cocos", 679 | "$(SRCROOT)/../cocos2d/cocos/base", 680 | "$(SRCROOT)/../cocos2d/cocos/physics", 681 | "$(SRCROOT)/../cocos2d/cocos/math", 682 | "$(SRCROOT)/../cocos2d/cocos/2d", 683 | "$(SRCROOT)/../cocos2d/cocos/ui", 684 | "$(SRCROOT)/../cocos2d/cocos/network", 685 | "$(SRCROOT)/../cocos2d/cocos/audio/include", 686 | "$(SRCROOT)/../cocos2d/cocos/editor-support", 687 | "$(SRCROOT)/../cocos2d/extensions", 688 | "$(SRCROOT)/../cocos2d/external", 689 | "$(SRCROOT)/../cocos2d/external/chipmunk/include/chipmunk", 690 | ); 691 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 692 | MACOSX_DEPLOYMENT_TARGET = 10.7; 693 | ONLY_ACTIVE_ARCH = YES; 694 | PRODUCT_NAME = "$(TARGET_NAME)"; 695 | SDKROOT = macosx; 696 | }; 697 | name = Debug; 698 | }; 699 | C01FCF5008A954540054247B /* Release */ = { 700 | isa = XCBuildConfiguration; 701 | buildSettings = { 702 | CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; 703 | CLANG_CXX_LIBRARY = "libc++"; 704 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 705 | GCC_WARN_UNUSED_VARIABLE = YES; 706 | HEADER_SEARCH_PATHS = ( 707 | "$(SRCROOT)/../cocos2d", 708 | "$(SRCROOT)/../cocos2d/cocos", 709 | "$(SRCROOT)/../cocos2d/cocos/base", 710 | "$(SRCROOT)/../cocos2d/cocos/physics", 711 | "$(SRCROOT)/../cocos2d/cocos/math", 712 | "$(SRCROOT)/../cocos2d/cocos/2d", 713 | "$(SRCROOT)/../cocos2d/cocos/ui", 714 | "$(SRCROOT)/../cocos2d/cocos/network", 715 | "$(SRCROOT)/../cocos2d/cocos/audio/include", 716 | "$(SRCROOT)/../cocos2d/cocos/editor-support", 717 | "$(SRCROOT)/../cocos2d/extensions", 718 | "$(SRCROOT)/../cocos2d/external", 719 | "$(SRCROOT)/../cocos2d/external/chipmunk/include/chipmunk", 720 | ); 721 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 722 | MACOSX_DEPLOYMENT_TARGET = 10.7; 723 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 724 | PRODUCT_NAME = "$(TARGET_NAME)"; 725 | SDKROOT = macosx; 726 | VALIDATE_PRODUCT = YES; 727 | }; 728 | name = Release; 729 | }; 730 | /* End XCBuildConfiguration section */ 731 | 732 | /* Begin XCConfigurationList section */ 733 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "HelloCpp-mobile" */ = { 734 | isa = XCConfigurationList; 735 | buildConfigurations = ( 736 | 1D6058940D05DD3E006BFB54 /* Debug */, 737 | 1D6058950D05DD3E006BFB54 /* Release */, 738 | ); 739 | defaultConfigurationIsVisible = 0; 740 | defaultConfigurationName = Debug; 741 | }; 742 | 5087E76C17EB910900C73F5D /* Build configuration list for PBXNativeTarget "HelloCpp-desktop" */ = { 743 | isa = XCConfigurationList; 744 | buildConfigurations = ( 745 | 5087E76D17EB910900C73F5D /* Debug */, 746 | 5087E76E17EB910900C73F5D /* Release */, 747 | ); 748 | defaultConfigurationIsVisible = 0; 749 | defaultConfigurationName = Debug; 750 | }; 751 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "HelloCpp" */ = { 752 | isa = XCConfigurationList; 753 | buildConfigurations = ( 754 | C01FCF4F08A954540054247B /* Debug */, 755 | C01FCF5008A954540054247B /* Release */, 756 | ); 757 | defaultConfigurationIsVisible = 0; 758 | defaultConfigurationName = Debug; 759 | }; 760 | /* End XCConfigurationList section */ 761 | }; 762 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 763 | } 764 | --------------------------------------------------------------------------------