├── 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 |
--------------------------------------------------------------------------------