diff --git a/.circleci/config.yml b/.circleci/config.yml index ec28cdfb..f1edcc7f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,23 +1,27 @@ version: 2 jobs: - macOS_swift_4.1: - macos: - xcode: "9.3.0" - steps: - - checkout - - run: swift build - - run: swift test - - run: make build macOS_swift_4.2: macos: xcode: "10.0.0" steps: - checkout - - run: swift build - - run: make build + - run: + name: Build + command: swift build + - run: + name: Test + command: swift test 2>&1 | xcpretty + - run: + name: Check Project Diff + command: ./diff-fixtures.sh + - run: + name: Build Test Project + command: ./build-fixtures.sh + - run: + name: Build release + command: make build workflows: version: 2 workflow: jobs: - - macOS_swift_4.1 - macOS_swift_4.2 diff --git a/.gitignore b/.gitignore index 89dd5826..01d32c76 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ xcuserdata *.xccheckout *.xcuserstate XcodeGen.xcodeproj +xcodegen.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 02553140..d7ed8d48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,23 +6,50 @@ - Allow more granular phase ordering for Copy File and Run Script phases. [402](https://github.com/yonaskolb/XcodeGen/pull/402) @brentleyjones #### Fixed +- Fixed XPC Service package type [#435](https://github.com/yonaskolb/XcodeGen/pull/435) @alvarhansen - Fixed phase ordering for modulemap and static libary header Copy File phases. [402](https://github.com/yonaskolb/XcodeGen/pull/402) @brentleyjones #### Changed - Changed spelling of build phases to **preBuildPhase** and **postBuildPhase**. [402](https://github.com/yonaskolb/XcodeGen/pull/402) @brentleyjones +## 2.0.0 + +#### Added +- Added `weak` linking setting for dependencies [#411](https://github.com/yonaskolb/XcodeGen/pull/411) @alvarhansen +- Added `info` to targets for generating an `Info.plist` [#415](https://github.com/yonaskolb/XcodeGen/pull/415) @yonaskolb +- Added `entitlements` to targets for generating an `.entitlement` file [#415](https://github.com/yonaskolb/XcodeGen/pull/415) @yonaskolb +- Added `sdk` dependency type for linking system frameworks and libs [#430](https://github.com/yonaskolb/XcodeGen/pull/430) @yonaskolb +- Added `parallelizable` and `randomExecutionOrder` to `Scheme` test targets in an expanded form [#434](https://github.com/yonaskolb/XcodeGen/pull/434) @yonaskolb +- Validate incorrect config setting definitions [#431](https://github.com/yonaskolb/XcodeGen/pull/431) @yonaskolb +- Automatically set project `SDKROOT` if there is only a single platform within the project [#433](https://github.com/yonaskolb/XcodeGen/pull/433) @yonaskolb + +#### Changed +- Performance improvements for large projects [#388](https://github.com/yonaskolb/XcodeGen/pull/388) [#417](https://github.com/yonaskolb/XcodeGen/pull/417) [#416](https://github.com/yonaskolb/XcodeGen/pull/416) @yonaskolb @kastiglione +- Upgraded to xcodeproj 6 [#388](https://github.com/yonaskolb/XcodeGen/pull/388) @yonaskolb +- Upgraded to Swift 4.2 [#388](https://github.com/yonaskolb/XcodeGen/pull/388) @yonaskolb +- Remove iOS codesigning sdk restriction in setting preset [#414](https://github.com/yonaskolb/XcodeGen/pull/414) @yonaskolb +- Changed default project version to Xcode 10.0 and default Swift version to 4.2 [#423](https://github.com/yonaskolb/XcodeGen/pull/423) @yonaskolb +- Added ability to not link Carthage frameworks [#432](https://github.com/yonaskolb/XcodeGen/pull/432) @yonaskolb + +#### Fixed +- Fixed code signing issues [#414](https://github.com/yonaskolb/XcodeGen/pull/414) @yonaskolb +- Fixed `TargetSource.headerVisibility` not being set in initializer [#419](https://github.com/yonaskolb/XcodeGen/pull/419) @jerrymarino +- Fixed crash when using Xcode Legacy targets as dependencies [#427](https://github.com/yonaskolb/XcodeGen/pull/427) @dflems + +[Commits](https://github.com/yonaskolb/XcodeGen/compare/1.11.2...2.0.0) + ## 1.11.2 If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project will not be deterministic. This will be fixed in an upcoming release with an update to xcodeproj 6.0 #### Fixed -- Fixed release builds in Swift 4.2 [404](https://github.com/yonaskolb/XcodeGen/pull/404) @pepibumur -- Fixed default settings for macOS unit-tests [387](https://github.com/yonaskolb/XcodeGen/pull/387) @frankdilo -- Fixed Copy Headers phase ordering for Xcode 10 [401](https://github.com/yonaskolb/XcodeGen/pull/401) @brentleyjones -- Fixed generated schemes on aggregate targets [394](https://github.com/yonaskolb/XcodeGen/pull/394) @vgorloff +- Fixed release builds in Swift 4.2 [#404](https://github.com/yonaskolb/XcodeGen/pull/404) @pepibumur +- Fixed default settings for macOS unit-tests [#387](https://github.com/yonaskolb/XcodeGen/pull/387) @frankdilo +- Fixed Copy Headers phase ordering for Xcode 10 [#401](https://github.com/yonaskolb/XcodeGen/pull/401) @brentleyjones +- Fixed generated schemes on aggregate targets [#394](https://github.com/yonaskolb/XcodeGen/pull/394) @vgorloff #### Changed -- Added `en` as default value for knownRegions [390](https://github.com/yonaskolb/XcodeGen/pull/390) @Saik0s +- Added `en` as default value for knownRegions [#390](https://github.com/yonaskolb/XcodeGen/pull/390) @Saik0s - Update `PathKit`, `Spectre`, `Yams` and `xcodeproj` dependencies [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.11.1...1.11.2) @@ -30,43 +57,43 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 1.11.1 #### Fixed -- Fixed `FRAMEWORK_SEARCH_PATHS` for `framework` dependency paths with spaces [382](https://github.com/yonaskolb/XcodeGen/pull/382) @brentleyjones -- Fixed aggregate targets not being found with `transitivelyLinkDependencies` [383](https://github.com/yonaskolb/XcodeGen/pull/383) @brentleyjones +- Fixed `FRAMEWORK_SEARCH_PATHS` for `framework` dependency paths with spaces [#382](https://github.com/yonaskolb/XcodeGen/pull/382) @brentleyjones +- Fixed aggregate targets not being found with `transitivelyLinkDependencies` [#383](https://github.com/yonaskolb/XcodeGen/pull/383) @brentleyjones [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.11.0...1.11.1) ## 1.11.0 #### Added -- Added `showEnvVars` to build scripts to disable printing the environment [351](https://github.com/yonaskolb/XcodeGen/pull/351) @keith -- Added `requiresObjCLinking` to `target` [354](https://github.com/yonaskolb/XcodeGen/pull/354) @brentleyjones -- Added `targetTemplates` [355](https://github.com/yonaskolb/XcodeGen/pull/355) @yonaskolb -- Added `aggregateTargets` [353](https://github.com/yonaskolb/XcodeGen/pull/353) [381](https://github.com/yonaskolb/XcodeGen/pull/381) @yonaskolb -- Added `options.groupSortPosition` [356](https://github.com/yonaskolb/XcodeGen/pull/356) @yonaskolb -- Added ability to specify `copyFiles` build phase for sources [345](https://github.com/yonaskolb/XcodeGen/pull/345) @brentleyjones -- Added ability to specify a `minimumXcodeGenVersion` [349](https://github.com/yonaskolb/XcodeGen/pull/349) @brentleyjones -- Added `customArchiveName` and `revealArchiveInOrganizer` to `archive` [367](https://github.com/yonaskolb/XcodeGen/pull/367) @sxua +- Added `showEnvVars` to build scripts to disable printing the environment [#351](https://github.com/yonaskolb/XcodeGen/pull/351) @keith +- Added `requiresObjCLinking` to `target` [#354](https://github.com/yonaskolb/XcodeGen/pull/354) @brentleyjones +- Added `targetTemplates` [#355](https://github.com/yonaskolb/XcodeGen/pull/355) @yonaskolb +- Added `aggregateTargets` [#353](https://github.com/yonaskolb/XcodeGen/pull/353) [#381](https://github.com/yonaskolb/XcodeGen/pull/381) @yonaskolb +- Added `options.groupSortPosition` [#356](https://github.com/yonaskolb/XcodeGen/pull/356) @yonaskolb +- Added ability to specify `copyFiles` build phase for sources [#345](https://github.com/yonaskolb/XcodeGen/pull/345) @brentleyjones +- Added ability to specify a `minimumXcodeGenVersion` [#349](https://github.com/yonaskolb/XcodeGen/pull/349) @brentleyjones +- Added `customArchiveName` and `revealArchiveInOrganizer` to `archive` [#367](https://github.com/yonaskolb/XcodeGen/pull/367) @sxua #### Fixed -- Sort files using localizedStandardCompare [341](https://github.com/yonaskolb/XcodeGen/pull/341) @rohitpal440 -- Use the latest `xcdatamodel` when sorted by version [341](https://github.com/yonaskolb/XcodeGen/pull/341) @rohitpal440 -- Fixed compiler flags being set on non source files in mixed build phase target sources [347](https://github.com/yonaskolb/XcodeGen/pull/347) @brentleyjones -- Fixed `options.xcodeVersion` not being parsed [348](https://github.com/yonaskolb/XcodeGen/pull/348) @brentleyjones -- Fixed non-application targets using `carthage copy-frameworks` [361](https://github.com/yonaskolb/XcodeGen/pull/361) @brentleyjones -- Set `xcdatamodel` based on `xccurrentversion` if available [364](https://github.com/yonaskolb/XcodeGen/pull/364) @rpassis -- XPC Services are now correctly copied [368](https://github.com/yonaskolb/XcodeGen/pull/368) @brentley -- Fixed `.metal` files being added to resources [380](https://github.com/yonaskolb/XcodeGen/pull/380) @vgorloff +- Sort files using localizedStandardCompare [#341](https://github.com/yonaskolb/XcodeGen/pull/341) @rohitpal440 +- Use the latest `xcdatamodel` when sorted by version [#341](https://github.com/yonaskolb/XcodeGen/pull/341) @rohitpal440 +- Fixed compiler flags being set on non source files in mixed build phase target sources [#347](https://github.com/yonaskolb/XcodeGen/pull/347) @brentleyjones +- Fixed `options.xcodeVersion` not being parsed [#348](https://github.com/yonaskolb/XcodeGen/pull/348) @brentleyjones +- Fixed non-application targets using `carthage copy-frameworks` [#361](https://github.com/yonaskolb/XcodeGen/pull/361) @brentleyjones +- Set `xcdatamodel` based on `xccurrentversion` if available [#364](https://github.com/yonaskolb/XcodeGen/pull/364) @rpassis +- XPC Services are now correctly copied [#368](https://github.com/yonaskolb/XcodeGen/pull/368) @brentley +- Fixed `.metal` files being added to resources [#380](https://github.com/yonaskolb/XcodeGen/pull/380) @vgorloff #### Changed -- Improved linking for `static.library` targets [352](https://github.com/yonaskolb/XcodeGen/pull/352) @brentleyjones -- Changed default group sorting to be after files [356](https://github.com/yonaskolb/XcodeGen/pull/356) @yonaskolb -- Moved `Frameworks` and `Products` top level groups to bottom [356](https://github.com/yonaskolb/XcodeGen/pull/356) @yonaskolb -- `modulemap` files are automatically copied to the products directory for static library targets [346](https://github.com/yonaskolb/XcodeGen/pull/346) @brentleyjones -- Public header files are automatically copied to the products directory for static library targets [365](https://github.com/yonaskolb/XcodeGen/pull/365) @brentleyjones -- Swift Objective-C Interface Header files are automatically copied to the products directory for static library targets [366](https://github.com/yonaskolb/XcodeGen/pull/366) @brentleyjones -- `FRAMEWORK_SEARCH_PATHS` are adjusted for `framework` dependencies [373](https://github.com/yonaskolb/XcodeGen/pull/373) @brentley -- `library.static` targets have `SKIP_INSTALL` set to `YES` [358](https://github.com/yonaskolb/XcodeGen/pull/358) @brentley -- Copy files phases have descriptive names [360](https://github.com/yonaskolb/XcodeGen/pull/360) @brentley +- Improved linking for `static.library` targets [#352](https://github.com/yonaskolb/XcodeGen/pull/352) @brentleyjones +- Changed default group sorting to be after files [#356](https://github.com/yonaskolb/XcodeGen/pull/356) @yonaskolb +- Moved `Frameworks` and `Products` top level groups to bottom [#356](https://github.com/yonaskolb/XcodeGen/pull/356) @yonaskolb +- `modulemap` files are automatically copied to the products directory for static library targets [#346](https://github.com/yonaskolb/XcodeGen/pull/346) @brentleyjones +- Public header files are automatically copied to the products directory for static library targets [#365](https://github.com/yonaskolb/XcodeGen/pull/365) @brentleyjones +- Swift Objective-C Interface Header files are automatically copied to the products directory for static library targets [#366](https://github.com/yonaskolb/XcodeGen/pull/366) @brentleyjones +- `FRAMEWORK_SEARCH_PATHS` are adjusted for `framework` dependencies [#373](https://github.com/yonaskolb/XcodeGen/pull/373) @brentley +- `library.static` targets have `SKIP_INSTALL` set to `YES` [#358](https://github.com/yonaskolb/XcodeGen/pull/358) @brentley +- Copy files phases have descriptive names [#360](https://github.com/yonaskolb/XcodeGen/pull/360) @brentley #### Internal - Moved brew formula to homebrew core @@ -77,7 +104,7 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 1.10.3 #### Fixed -- Fixed Mint installations finding `SettingPresets` [338](https://github.com/yonaskolb/XcodeGen/pull/338) @yonaskolb +- Fixed Mint installations finding `SettingPresets` [#338](https://github.com/yonaskolb/XcodeGen/pull/338) @yonaskolb [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.10.2...1.10.3) @@ -91,72 +118,72 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 1.10.1 #### Fixed -- Fixed `transitivelyLinkDependencies` typo [332](https://github.com/yonaskolb/XcodeGen/pull/332) @brentleyjones -- Fixed framework target dependencies not being code signed by default [332](https://github.com/yonaskolb/XcodeGen/pull/332) @yonaskolb +- Fixed `transitivelyLinkDependencies` typo [#332](https://github.com/yonaskolb/XcodeGen/pull/332) @brentleyjones +- Fixed framework target dependencies not being code signed by default [#332](https://github.com/yonaskolb/XcodeGen/pull/332) @yonaskolb #### Changed -- Code sign all dependencies by default except target executables [332](https://github.com/yonaskolb/XcodeGen/pull/332) @yonaskolb +- Code sign all dependencies by default except target executables [#332](https://github.com/yonaskolb/XcodeGen/pull/332) @yonaskolb [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.10.0...1.10.1) ## 1.10.0 #### Added -- Added build rule support [306](https://github.com/yonaskolb/XcodeGen/pull/306) @yonaskolb -- Added support for frameworks in sources [308](https://github.com/yonaskolb/XcodeGen/pull/308) @keith -- Added ability to automatically embed transient dependencies. Controlled with `transitivelyLinkDependencies` [327](https://github.com/yonaskolb/XcodeGen/pull/327) @brentleyjones +- Added build rule support [#306](https://github.com/yonaskolb/XcodeGen/pull/306) @yonaskolb +- Added support for frameworks in sources [#308](https://github.com/yonaskolb/XcodeGen/pull/308) @keith +- Added ability to automatically embed transient dependencies. Controlled with `transitivelyLinkDependencies` [#327](https://github.com/yonaskolb/XcodeGen/pull/327) @brentleyjones #### Changed - Upgraded to Swift 4.1 -- Improved Carthage dependency lookup performance with many targets [298](https://github.com/yonaskolb/XcodeGen/pull/298) @keith -- By default don't CodeSignOnCopy `target` dependencies. This can still be controlled with `Dependency.codeSign` [324](https://github.com/yonaskolb/XcodeGen/pull/324) @yonaskolb +- Improved Carthage dependency lookup performance with many targets [#298](https://github.com/yonaskolb/XcodeGen/pull/298) @keith +- By default don't CodeSignOnCopy `target` dependencies. This can still be controlled with `Dependency.codeSign` [#324](https://github.com/yonaskolb/XcodeGen/pull/324) @yonaskolb #### Fixed -- Fixed PBXBuildFile and PBXFileReference being incorrectly generated for Legacy targets [296](https://github.com/yonaskolb/XcodeGen/pull/296) @sascha -- Fixed required sources build phase not being generated if there are no sources [307](https://github.com/yonaskolb/XcodeGen/pull/307) @yonaskolb -- Fixed install script in binary release [303](https://github.com/yonaskolb/XcodeGen/pull/303) @alvarhansen -- Removed `ENABLE_TESTABILITY` from framework setting presets [299](https://github.com/yonaskolb/XcodeGen/pull/299) @allu22 -- Fixed homebrew installation [297](https://github.com/yonaskolb/XcodeGen/pull/297) @vhbit -- `cc` files are now automatically recognized as source files [317](https://github.com/yonaskolb/XcodeGen/pull/317) @maicki -- Fixed `commandLineArguments` not parsing when they had dots in them [323](https://github.com/yonaskolb/XcodeGen/pull/323) @yonaskolb -- Fixed excluding directories that only have sub directories [326](https://github.com/yonaskolb/XcodeGen/pull/326) @brentleyjones +- Fixed PBXBuildFile and PBXFileReference being incorrectly generated for Legacy targets [#296](https://github.com/yonaskolb/XcodeGen/pull/296) @sascha +- Fixed required sources build phase not being generated if there are no sources [#307](https://github.com/yonaskolb/XcodeGen/pull/307) @yonaskolb +- Fixed install script in binary release [#303](https://github.com/yonaskolb/XcodeGen/pull/303) @alvarhansen +- Removed `ENABLE_TESTABILITY` from framework setting presets [#299](https://github.com/yonaskolb/XcodeGen/pull/299) @allu22 +- Fixed homebrew installation [#297](https://github.com/yonaskolb/XcodeGen/pull/297) @vhbit +- `cc` files are now automatically recognized as source files [#317](https://github.com/yonaskolb/XcodeGen/pull/317) @maicki +- Fixed `commandLineArguments` not parsing when they had dots in them [#323](https://github.com/yonaskolb/XcodeGen/pull/323) @yonaskolb +- Fixed excluding directories that only have sub directories [#326](https://github.com/yonaskolb/XcodeGen/pull/326) @brentleyjones - Made `PBXContainerItemProxy` ID more deterministic -- Fixed generated framework schemes from being executable [328](https://github.com/yonaskolb/XcodeGen/pull/328) @brentleyjones +- Fixed generated framework schemes from being executable [#328](https://github.com/yonaskolb/XcodeGen/pull/328) @brentleyjones [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.9.0...1.10.0) ## 1.9.0 #### Added -- Scheme pre and post actions can now be added to `target.scheme` [280](https://github.com/yonaskolb/XcodeGen/pull/280) @yonaskolb -- Individual files can now be added to `fileGroups` [293](https://github.com/yonaskolb/XcodeGen/pull/293) @yonaskolb +- Scheme pre and post actions can now be added to `target.scheme` [#280](https://github.com/yonaskolb/XcodeGen/pull/280) @yonaskolb +- Individual files can now be added to `fileGroups` [#293](https://github.com/yonaskolb/XcodeGen/pull/293) @yonaskolb #### Changed - Updated to `xcproj` 4.3.0 for Xcode 9.3 updates -- Update default Xcode version to 9.3 including new settings [284](https://github.com/yonaskolb/XcodeGen/pull/284) @LinusU -- **Breaking for ProjectSpec library users** Changed `ProjectSpec` to `Project` and `ProjectSpec.Options` to `SpecOptions` [281](https://github.com/yonaskolb/XcodeGen/pull/281) @jerrymarino +- Update default Xcode version to 9.3 including new settings [#284](https://github.com/yonaskolb/XcodeGen/pull/284) @LinusU +- **Breaking for ProjectSpec library users** Changed `ProjectSpec` to `Project` and `ProjectSpec.Options` to `SpecOptions` [#281](https://github.com/yonaskolb/XcodeGen/pull/281) @jerrymarino #### Fixed -- Fixed manual build phase of `none` not being applied to folders [288](https://github.com/yonaskolb/XcodeGen/pull/288) @yonaskolb -- Quoted values now correctly get parsed as strings [282](https://github.com/yonaskolb/XcodeGen/pull/282) @yonaskolb -- Fixed adding a root source folder when `createIntermediateGroups` is on [291](https://github.com/yonaskolb/XcodeGen/pull/291) @yonaskolb -- Fixed Homebrew installations issues on some machines [289](https://github.com/yonaskolb/XcodeGen/pull/289) @vhbit -- Fixed files that are added as root sources from having invalid parent groups outside the project directory [293](https://github.com/yonaskolb/XcodeGen/pull/293) @yonaskolb +- Fixed manual build phase of `none` not being applied to folders [#288](https://github.com/yonaskolb/XcodeGen/pull/288) @yonaskolb +- Quoted values now correctly get parsed as strings [#282](https://github.com/yonaskolb/XcodeGen/pull/282) @yonaskolb +- Fixed adding a root source folder when `createIntermediateGroups` is on [#291](https://github.com/yonaskolb/XcodeGen/pull/291) @yonaskolb +- Fixed Homebrew installations issues on some machines [#289](https://github.com/yonaskolb/XcodeGen/pull/289) @vhbit +- Fixed files that are added as root sources from having invalid parent groups outside the project directory [#293](https://github.com/yonaskolb/XcodeGen/pull/293) @yonaskolb [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.8.0...1.9.0) ## 1.8.0 #### Added -- Added Project `defaultConfig` [269](https://github.com/yonaskolb/XcodeGen/pull/269) @keith -- Added Target `attributes` [276](https://github.com/yonaskolb/XcodeGen/pull/276) @yonaskolb -- Automatically set `DevelopmentTeam` and `ProvisioningStyle` within `TargetAttributes` if relevant build settings are defined [277](https://github.com/yonaskolb/XcodeGen/pull/277) @yonaskolb +- Added Project `defaultConfig` [#269](https://github.com/yonaskolb/XcodeGen/pull/269) @keith +- Added Target `attributes` [#276](https://github.com/yonaskolb/XcodeGen/pull/276) @yonaskolb +- Automatically set `DevelopmentTeam` and `ProvisioningStyle` within `TargetAttributes` if relevant build settings are defined [#277](https://github.com/yonaskolb/XcodeGen/pull/277) @yonaskolb #### Fixed -- Fixed default `LD_RUNPATH_SEARCH_PATHS` for app extensions [272](https://github.com/yonaskolb/XcodeGen/pull/272) @LinusU +- Fixed default `LD_RUNPATH_SEARCH_PATHS` for app extensions [#272](https://github.com/yonaskolb/XcodeGen/pull/272) @LinusU #### Internal -- Make `LegacyTarget` init public [264](https://github.com/yonaskolb/XcodeGen/pull/264) @jerrymarino +- Make `LegacyTarget` init public [#264](https://github.com/yonaskolb/XcodeGen/pull/264) @jerrymarino - Upgrade to *xcproj* to 4.2.0, *Yams* to 0.6.0 and *PathKit* to 0.9.1 @yonaskolb [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.7.0...1.8.0) @@ -165,113 +192,113 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil #### Added -- Added support for scheme environment variables [239](https://github.com/yonaskolb/XcodeGen/pull/239) [254](https://github.com/yonaskolb/XcodeGen/pull/254) [259](https://github.com/yonaskolb/XcodeGen/pull/259) @turekj @toshi0383 -- Added `carthageExecutablePath` option [244](https://github.com/yonaskolb/XcodeGen/pull/244) @akkyie -- Added `parallelizeBuild` and `buildImplicitDependencies` to Schemes [241](https://github.com/yonaskolb/XcodeGen/pull/241) @rahul-malik +- Added support for scheme environment variables [#239](https://github.com/yonaskolb/XcodeGen/pull/239) [#254](https://github.com/yonaskolb/XcodeGen/pull/254) [#259](https://github.com/yonaskolb/XcodeGen/pull/259) @turekj @toshi0383 +- Added `carthageExecutablePath` option [#244](https://github.com/yonaskolb/XcodeGen/pull/244) @akkyie +- Added `parallelizeBuild` and `buildImplicitDependencies` to Schemes [#241](https://github.com/yonaskolb/XcodeGen/pull/241) @rahul-malik @yonaskolb -- Added support for Core Data `xcdatamodeld` files [249](https://github.com/yonaskolb/XcodeGen/pull/249) @yonaskolb -- Projects are now generated atomically by writing to a temporary directory first [250](https://github.com/yonaskolb/XcodeGen/pull/250) @yonaskolb -- Added script for adding precompiled binary to releases [246](https://github.com/yonaskolb/XcodeGen/pull/246) @toshi0383 -- Added optional `headerVisibilty` to target source. This still defaults to public [252](https://github.com/yonaskolb/XcodeGen/pull/252) @yonaskolb +- Added support for Core Data `xcdatamodeld` files [#249](https://github.com/yonaskolb/XcodeGen/pull/249) @yonaskolb +- Projects are now generated atomically by writing to a temporary directory first [#250](https://github.com/yonaskolb/XcodeGen/pull/250) @yonaskolb +- Added script for adding precompiled binary to releases [#246](https://github.com/yonaskolb/XcodeGen/pull/246) @toshi0383 +- Added optional `headerVisibilty` to target source. This still defaults to public [#252](https://github.com/yonaskolb/XcodeGen/pull/252) @yonaskolb - Releases now include a pre-compiled binary and setting presets, including an install script #### Fixed -- Fixed Mint installation from reading setting presets [248](https://github.com/yonaskolb/XcodeGen/pull/248) @yonaskolb -- Fixed setting `buildPhase` on a `folder` source. This allows for a folder of header files [254](https://github.com/yonaskolb/XcodeGen/pull/254) @toshi0383 -- Carthage dependencies are not automatically embedded into test targets [256](https://github.com/yonaskolb/XcodeGen/pull/256) @yonaskolb -- Carthage dependencies now respect the `embed` property [256](https://github.com/yonaskolb/XcodeGen/pull/256) @yonaskolb -- iMessage extensions now have proper setting presets in regards to app icon and runtime search paths [255](https://github.com/yonaskolb/XcodeGen/pull/255) @yonaskolb -- Excluded files are not added within .lproj directories [238](https://github.com/yonaskolb/XcodeGen/pull/238) @toshi0383 +- Fixed Mint installation from reading setting presets [#248](https://github.com/yonaskolb/XcodeGen/pull/248) @yonaskolb +- Fixed setting `buildPhase` on a `folder` source. This allows for a folder of header files [#254](https://github.com/yonaskolb/XcodeGen/pull/254) @toshi0383 +- Carthage dependencies are not automatically embedded into test targets [#256](https://github.com/yonaskolb/XcodeGen/pull/256) @yonaskolb +- Carthage dependencies now respect the `embed` property [#256](https://github.com/yonaskolb/XcodeGen/pull/256) @yonaskolb +- iMessage extensions now have proper setting presets in regards to app icon and runtime search paths [#255](https://github.com/yonaskolb/XcodeGen/pull/255) @yonaskolb +- Excluded files are not added within .lproj directories [#238](https://github.com/yonaskolb/XcodeGen/pull/238) @toshi0383 [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.6.0...1.7.0) ## 1.6.0 #### Added -- Added scheme pre-actions and post-actions [231](https://github.com/yonaskolb/XcodeGen/pull/231) @kastiglione -- Added `options.disabledValidations` including `missingConfigs` to disable project validation errors [220](https://github.com/yonaskolb/XcodeGen/pull/220) @keith -- Generate UI Test Target Attributes [221](https://github.com/yonaskolb/XcodeGen/pull/221) @anreitersimon +- Added scheme pre-actions and post-actions [#231](https://github.com/yonaskolb/XcodeGen/pull/231) @kastiglione +- Added `options.disabledValidations` including `missingConfigs` to disable project validation errors [#220](https://github.com/yonaskolb/XcodeGen/pull/220) @keith +- Generate UI Test Target Attributes [#221](https://github.com/yonaskolb/XcodeGen/pull/221) @anreitersimon #### Fixed -- Filter out duplicate source files [217](https://github.com/yonaskolb/XcodeGen/pull/217) @allu22 -- Fixed how `lastKnownFileType` and `explicitFileType` were generated across platforms [115](https://github.com/yonaskolb/XcodeGen/pull/115) @toshi0383 +- Filter out duplicate source files [#217](https://github.com/yonaskolb/XcodeGen/pull/217) @allu22 +- Fixed how `lastKnownFileType` and `explicitFileType` were generated across platforms [#115](https://github.com/yonaskolb/XcodeGen/pull/115) @toshi0383 - Removed a few cases of project diffs when opening the project in Xcode @yonaskolb - Fixed Swift not being embedded by default in watch apps @yonaskolb #### Changed -- Change arrays to strings in setting presets [218](https://github.com/yonaskolb/XcodeGen/pull/218) @allu22 -- Updated to xcproj 4.0 [227](https://github.com/yonaskolb/XcodeGen/pull/227) +- Change arrays to strings in setting presets [#218](https://github.com/yonaskolb/XcodeGen/pull/218) @allu22 +- Updated to xcproj 4.0 [#227](https://github.com/yonaskolb/XcodeGen/pull/227) [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.5.0...1.6.0) ## 1.5.0 #### Added -- added support for `gatherCoverageData` flag in target schemes [170](https://github.com/yonaskolb/XcodeGen/pull/170) @alexruperez -- added support for `commandLineOptions` in target schemes [172](https://github.com/yonaskolb/XcodeGen/pull/172) @rahul-malik -- added Project spec as a SwiftPM library for reuse in other projects [164](https://github.com/yonaskolb/XcodeGen/pull/164) @soffes -- added `implicit` option for framework dependencies [166](https://github.com/yonaskolb/XcodeGen/pull/166) @sbarow -- added `--quite` option to CLI [167](https://github.com/yonaskolb/XcodeGen/pull/167) @soffes -- can now print version with `-v` in addition to `--version` [174](https://github.com/yonaskolb/XcodeGen/pull/174) @kastiglione -- added support for legacy targets [175](https://github.com/yonaskolb/XcodeGen/pull/175) @bkase -- added support for indentation options [190](https://github.com/yonaskolb/XcodeGen/pull/190) @bkase -- added source excludes [135](https://github.com/yonaskolb/XcodeGen/pull/135) [161](https://github.com/yonaskolb/XcodeGen/pull/161) [190](https://github.com/yonaskolb/XcodeGen/pull/190) @peymankh @ -- added `options.xcodeVersion` [197](https://github.com/yonaskolb/XcodeGen/pull/197) @yonaskolb @peymankh -- add test targets to Scheme [195](https://github.com/yonaskolb/XcodeGen/pull/195) @vhbit -- add option to make a source file optional incase it will be generated later [200](https://github.com/yonaskolb/XcodeGen/pull/200) @vhbit -- finalize Scheme spec [201](https://github.com/yonaskolb/XcodeGen/pull/201) @yonaskolb -- added `buildPhase` setting to target source for overriding the guessed build phase of files [206](https://github.com/yonaskolb/XcodeGen/pull/206) @yonaskolb -- added `deploymentTarget` setting to project and target [205](https://github.com/yonaskolb/XcodeGen/pull/205) @yonaskolb +- added support for `gatherCoverageData` flag in target schemes [#170](https://github.com/yonaskolb/XcodeGen/pull/170) @alexruperez +- added support for `commandLineOptions` in target schemes [#172](https://github.com/yonaskolb/XcodeGen/pull/172) @rahul-malik +- added Project spec as a SwiftPM library for reuse in other projects [#164](https://github.com/yonaskolb/XcodeGen/pull/164) @soffes +- added `implicit` option for framework dependencies [#166](https://github.com/yonaskolb/XcodeGen/pull/166) @sbarow +- added `--quite` option to CLI [#167](https://github.com/yonaskolb/XcodeGen/pull/167) @soffes +- can now print version with `-v` in addition to `--version` [#174](https://github.com/yonaskolb/XcodeGen/pull/174) @kastiglione +- added support for legacy targets [#175](https://github.com/yonaskolb/XcodeGen/pull/175) @bkase +- added support for indentation options [#190](https://github.com/yonaskolb/XcodeGen/pull/190) @bkase +- added source excludes [#135](https://github.com/yonaskolb/XcodeGen/pull/135) [#161](https://github.com/yonaskolb/XcodeGen/pull/161) [#190](https://github.com/yonaskolb/XcodeGen/pull/190) @peymankh @ +- added `options.xcodeVersion` [#197](https://github.com/yonaskolb/XcodeGen/pull/197) @yonaskolb @peymankh +- add test targets to Scheme [#195](https://github.com/yonaskolb/XcodeGen/pull/195) @vhbit +- add option to make a source file optional incase it will be generated later [#200](https://github.com/yonaskolb/XcodeGen/pull/200) @vhbit +- finalize Scheme spec [#201](https://github.com/yonaskolb/XcodeGen/pull/201) @yonaskolb +- added `buildPhase` setting to target source for overriding the guessed build phase of files [#206](https://github.com/yonaskolb/XcodeGen/pull/206) @yonaskolb +- added `deploymentTarget` setting to project and target [#205](https://github.com/yonaskolb/XcodeGen/pull/205) @yonaskolb #### Changed - huge performance improvements when writing the project file due to changes in xcproj - updated dependencies - minor logging changes - updated Project Spec documentation -- scan for `Info.plist` lazely [194](https://github.com/yonaskolb/XcodeGen/pull/194) @kastiglione -- change setting presets so that icon settings only get applied to application targets [204](https://github.com/yonaskolb/XcodeGen/pull/204) @yonaskolb -- changed scheme build targets format [203](https://github.com/yonaskolb/XcodeGen/pull/203) @yonaskolb -- when specifying a `--spec` argument, the default for the `--project` path is now the directory containing the spec [211](https://github.com/yonaskolb/XcodeGen/pull/211) @yonaskolb +- scan for `Info.plist` lazely [#194](https://github.com/yonaskolb/XcodeGen/pull/194) @kastiglione +- change setting presets so that icon settings only get applied to application targets [#204](https://github.com/yonaskolb/XcodeGen/pull/204) @yonaskolb +- changed scheme build targets format [#203](https://github.com/yonaskolb/XcodeGen/pull/203) @yonaskolb +- when specifying a `--spec` argument, the default for the `--project` path is now the directory containing the spec [#211](https://github.com/yonaskolb/XcodeGen/pull/211) @yonaskolb #### Fixed -- fixed shell scripts escaping quotes twice [186](https://github.com/yonaskolb/XcodeGen/pull/186) @allu22 -- fixed `createIntermediateGroups` when using a relative spec path [184](https://github.com/yonaskolb/XcodeGen/pull/184) @kastiglione -- fixed command line arguments for test and profile from being overridden [199](https://github.com/yonaskolb/XcodeGen/pull/199) @vhbit +- fixed shell scripts escaping quotes twice [#186](https://github.com/yonaskolb/XcodeGen/pull/186) @allu22 +- fixed `createIntermediateGroups` when using a relative spec path [#184](https://github.com/yonaskolb/XcodeGen/pull/184) @kastiglione +- fixed command line arguments for test and profile from being overridden [#199](https://github.com/yonaskolb/XcodeGen/pull/199) @vhbit - fixed files deep within a hierarchy having the path for a name -- fixed source files from being duplicated if referenced with different casing [212](https://github.com/yonaskolb/XcodeGen/pull/212) @yonaskolb -- fixed target product name not being written. Fixes integration with R.swift [213](https://github.com/yonaskolb/XcodeGen/pull/213) @yonaskolb +- fixed source files from being duplicated if referenced with different casing [#212](https://github.com/yonaskolb/XcodeGen/pull/212) @yonaskolb +- fixed target product name not being written. Fixes integration with R.swift [#213](https://github.com/yonaskolb/XcodeGen/pull/213) @yonaskolb [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.4.0...1.5.0) ## 1.4.0 #### Added -- added `--version` flag [112](https://github.com/yonaskolb/XcodeGen/pull/112) @mironal -- added support for adding individual file sources [106](https://github.com/yonaskolb/XcodeGen/pull/106) [133](https://github.com/yonaskolb/XcodeGen/pull/133) [142](https://github.com/yonaskolb/XcodeGen/pull/142) [139](https://github.com/yonaskolb/XcodeGen/pull/139) @bkase -- added source compiler flag support [121](https://github.com/yonaskolb/XcodeGen/pull/121) @bkase -- added `ProjectSpec.options.createIntermediateGroups` [108](https://github.com/yonaskolb/XcodeGen/pull/108) @bkase -- added better json loading support [127](https://github.com/yonaskolb/XcodeGen/pull/127) @rahul-malik -- added source `name` for customizing names of source directories and file [146](https://github.com/yonaskolb/XcodeGen/pull/146) @yonaskolb -- added folder reference source support via a new `type` property [151](https://github.com/yonaskolb/XcodeGen/pull/151) @yonaskolb -- added `ProjectSpec.options.developmentLanguage` [155](https://github.com/yonaskolb/XcodeGen/pull/155) @yonaskolb +- added `--version` flag [#112](https://github.com/yonaskolb/XcodeGen/pull/112) @mironal +- added support for adding individual file sources [#106](https://github.com/yonaskolb/XcodeGen/pull/106) [#133](https://github.com/yonaskolb/XcodeGen/pull/133) [#142](https://github.com/yonaskolb/XcodeGen/pull/142) [#139](https://github.com/yonaskolb/XcodeGen/pull/139) @bkase +- added source compiler flag support [#121](https://github.com/yonaskolb/XcodeGen/pull/121) @bkase +- added `ProjectSpec.options.createIntermediateGroups` [#108](https://github.com/yonaskolb/XcodeGen/pull/108) @bkase +- added better json loading support [#127](https://github.com/yonaskolb/XcodeGen/pull/127) @rahul-malik +- added source `name` for customizing names of source directories and file [#146](https://github.com/yonaskolb/XcodeGen/pull/146) @yonaskolb +- added folder reference source support via a new `type` property [#151](https://github.com/yonaskolb/XcodeGen/pull/151) @yonaskolb +- added `ProjectSpec.options.developmentLanguage` [#155](https://github.com/yonaskolb/XcodeGen/pull/155) @yonaskolb #### Changed -- updated to xcproj 1.2.0 [113](https://github.com/yonaskolb/XcodeGen/pull/113) @yonaskolb -- build settings from presets will be removed if they are provided in `xcconfig` files [77](https://github.com/yonaskolb/XcodeGen/pull/77) @toshi0383 -- all files and groups are sorted by type and then alphabetically [144](https://github.com/yonaskolb/XcodeGen/pull/144) @yonaskolb -- target sources can now have an expanded form [119](https://github.com/yonaskolb/XcodeGen/pull/119) @yonaskolb -- empty build phases are now not generated [149](https://github.com/yonaskolb/XcodeGen/pull/149) @yonaskolb -- make UUIDs more deterministic [154](https://github.com/yonaskolb/XcodeGen/pull/154) @yonaskolb +- updated to xcproj 1.2.0 [#113](https://github.com/yonaskolb/XcodeGen/pull/113) @yonaskolb +- build settings from presets will be removed if they are provided in `xcconfig` files [#77](https://github.com/yonaskolb/XcodeGen/pull/77) @toshi0383 +- all files and groups are sorted by type and then alphabetically [#144](https://github.com/yonaskolb/XcodeGen/pull/144) @yonaskolb +- target sources can now have an expanded form [#119](https://github.com/yonaskolb/XcodeGen/pull/119) @yonaskolb +- empty build phases are now not generated [#149](https://github.com/yonaskolb/XcodeGen/pull/149) @yonaskolb +- make UUIDs more deterministic [#154](https://github.com/yonaskolb/XcodeGen/pull/154) @yonaskolb #### Fixed -- only add headers to frameworks and libraries [118](https://github.com/yonaskolb/XcodeGen/pull/118) @ryohey -- fixed localized files with the same name [126](https://github.com/yonaskolb/XcodeGen/pull/126) @ryohey -- fix intermediate sources [144](https://github.com/yonaskolb/XcodeGen/pull/144) @yonaskolb -- fix cyclical target dependencies not working [147](https://github.com/yonaskolb/XcodeGen/pull/147) @yonaskolb -- fix directory bundles not being added properly when referenced directly [148](https://github.com/yonaskolb/XcodeGen/pull/1478) @yonaskolb -- made `mm`, `c` and `S` file be parsed as source files [120](https://github.com/yonaskolb/XcodeGen/pull/120) [125](https://github.com/yonaskolb/XcodeGen/pull/125) [138](https://github.com/yonaskolb/XcodeGen/pull/138) @bkase @enmiller -- fix the generation of localized variant groups if there is no `Base.lproj` [157](https://github.com/yonaskolb/XcodeGen/pull/157) @ryohey -- all localizations found are added to a projects known regions [157](https://github.com/yonaskolb/XcodeGen/pull/157) @ryohey +- only add headers to frameworks and libraries [#118](https://github.com/yonaskolb/XcodeGen/pull/118) @ryohey +- fixed localized files with the same name [#126](https://github.com/yonaskolb/XcodeGen/pull/126) @ryohey +- fix intermediate sources [#144](https://github.com/yonaskolb/XcodeGen/pull/144) @yonaskolb +- fix cyclical target dependencies not working [#147](https://github.com/yonaskolb/XcodeGen/pull/147) @yonaskolb +- fix directory bundles not being added properly when referenced directly [#148](https://github.com/yonaskolb/XcodeGen/pull/1478) @yonaskolb +- made `mm`, `c` and `S` file be parsed as source files [#120](https://github.com/yonaskolb/XcodeGen/pull/120) [#125](https://github.com/yonaskolb/XcodeGen/pull/125) [#138](https://github.com/yonaskolb/XcodeGen/pull/138) @bkase @enmiller +- fix the generation of localized variant groups if there is no `Base.lproj` [#157](https://github.com/yonaskolb/XcodeGen/pull/157) @ryohey +- all localizations found are added to a projects known regions [#157](https://github.com/yonaskolb/XcodeGen/pull/157) @ryohey #### Internal - refactoring @@ -283,26 +310,26 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 1.3.0 #### Added -- generate output files for Carthage copy-frameworks script [84](https://github.com/yonaskolb/XcodeGen/pull/84) @mironal -- added options.settingPreset to choose which setting presets get applied [100](https://github.com/yonaskolb/XcodeGen/pull/101) @yonaskolb -- added `link` option for target dependencies [109](https://github.com/yonaskolb/XcodeGen/pull/109) @keith +- generate output files for Carthage copy-frameworks script [#84](https://github.com/yonaskolb/XcodeGen/pull/84) @mironal +- added options.settingPreset to choose which setting presets get applied [#100](https://github.com/yonaskolb/XcodeGen/pull/101) @yonaskolb +- added `link` option for target dependencies [#109](https://github.com/yonaskolb/XcodeGen/pull/109) @keith #### Changed -- updated to xcproj 0.4.1 [85](https://github.com/yonaskolb/XcodeGen/pull/85) @enmiller -- don't copy base settings if config type has been left out [100](https://github.com/yonaskolb/XcodeGen/pull/100) @yonaskolb -- generate localised files under a single variant group [70](https://github.com/yonaskolb/XcodeGen/pull/70) @ryohey -- don't apply common project settings to configs with no type [100](https://github.com/yonaskolb/XcodeGen/pull/100) @yonaskolb -- config references in settings can now be partially matched and are case insensitive [111](https://github.com/yonaskolb/XcodeGen/pull/111) @yonaskolb +- updated to xcproj 0.4.1 [#85](https://github.com/yonaskolb/XcodeGen/pull/85) @enmiller +- don't copy base settings if config type has been left out [#100](https://github.com/yonaskolb/XcodeGen/pull/100) @yonaskolb +- generate localised files under a single variant group [#70](https://github.com/yonaskolb/XcodeGen/pull/70) @ryohey +- don't apply common project settings to configs with no type [#100](https://github.com/yonaskolb/XcodeGen/pull/100) @yonaskolb +- config references in settings can now be partially matched and are case insensitive [#111](https://github.com/yonaskolb/XcodeGen/pull/111) @yonaskolb - other small internal changes @yonaskolb #### Fixed -- embed Carthage frameworks for macOS [82](https://github.com/yonaskolb/XcodeGen/pull/82) @toshi0383 -- fixed copying of watchOS app resources [96](https://github.com/yonaskolb/XcodeGen/pull/96) @keith -- automatically ignore more file types for a target's sources (entitlements, gpx, apns) [94](https://github.com/yonaskolb/XcodeGen/pull/94) @keith -- change make build to a PHONY task [98](https://github.com/yonaskolb/XcodeGen/pull/98) @keith -- allow copying of resource files from dependant targets [95](https://github.com/yonaskolb/XcodeGen/pull/95) @keith -- fixed library linking [93](https://github.com/yonaskolb/XcodeGen/pull/93) @keith -- fixed duplicate carthage file references [107](https://github.com/yonaskolb/XcodeGen/pull/107) @yonaskolb +- embed Carthage frameworks for macOS [#82](https://github.com/yonaskolb/XcodeGen/pull/82) @toshi0383 +- fixed copying of watchOS app resources [#96](https://github.com/yonaskolb/XcodeGen/pull/96) @keith +- automatically ignore more file types for a target's sources (entitlements, gpx, apns) [#94](https://github.com/yonaskolb/XcodeGen/pull/94) @keith +- change make build to a PHONY task [#98](https://github.com/yonaskolb/XcodeGen/pull/98) @keith +- allow copying of resource files from dependant targets [#95](https://github.com/yonaskolb/XcodeGen/pull/95) @keith +- fixed library linking [#93](https://github.com/yonaskolb/XcodeGen/pull/93) @keith +- fixed duplicate carthage file references [#107](https://github.com/yonaskolb/XcodeGen/pull/107) @yonaskolb - an error is now shown if you try and generate a target scheme and don't have debug and release builds @yonaskolb [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.2.4...1.3.0) @@ -322,8 +349,8 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 1.2.3 #### Fixed -- Fixed wrong carthage directory name reference for macOS [74](https://github.com/yonaskolb/XcodeGen/pull/74) @toshi0383 -- Removed unnecessary `carthage copy-frameworks` for macOS app target [76](https://github.com/yonaskolb/XcodeGen/pull/76) @toshi0383 +- Fixed wrong carthage directory name reference for macOS [#74](https://github.com/yonaskolb/XcodeGen/pull/74) @toshi0383 +- Removed unnecessary `carthage copy-frameworks` for macOS app target [#76](https://github.com/yonaskolb/XcodeGen/pull/76) @toshi0383 - Added some missing default settings for framework targets. `SKIP_INSTALL: YES` fixes archiving - Filter out nulls from setting presets if specifying an empty string @@ -345,17 +372,17 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil #### Added - `include` now supports a single string as well as a list -- add support setting xcconfig files on a project with `configFiles` [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) -- add `fileGroups` to project spec for adding groups of files that aren't target source files [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) +- add support setting xcconfig files on a project with `configFiles` [#64](https://github.com/yonaskolb/XcodeGen/pull/64) +- add `fileGroups` to project spec for adding groups of files that aren't target source files [#64](https://github.com/yonaskolb/XcodeGen/pull/64) - better output (more info, emoji, colors) -- add `options.bundleIdPrefix` for autogenerating `PRODUCT_BUNDLE_IDENTIFIER` [PR#67](https://github.com/yonaskolb/XcodeGen/pull/67) -- add `:REPLACE` syntax when merging `include` [PR#68](https://github.com/yonaskolb/XcodeGen/pull/68) +- add `options.bundleIdPrefix` for autogenerating `PRODUCT_BUNDLE_IDENTIFIER` [#67](https://github.com/yonaskolb/XcodeGen/pull/67) +- add `:REPLACE` syntax when merging `include` [#68](https://github.com/yonaskolb/XcodeGen/pull/68) - add `mint` installation support #### Fixed - fixed homebrew installation -- fixed target xcconfig files not working via `configFiles` [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) -- look for `INFOPLIST_FILE` setting in project and xcconfig files before adding it automatically. It was just looking in target settings before [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) +- fixed target xcconfig files not working via `configFiles` [#64](https://github.com/yonaskolb/XcodeGen/pull/64) +- look for `INFOPLIST_FILE` setting in project and xcconfig files before adding it automatically. It was just looking in target settings before [#64](https://github.com/yonaskolb/XcodeGen/pull/64) - exit with error on failure [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.1.0...1.2.0) @@ -379,16 +406,16 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 1.0.0 #### Added -- Swift 4 support [PR#52](https://github.com/yonaskolb/XcodeGen/pull/52) -- Support for C and C++ files [PR#48](https://github.com/yonaskolb/XcodeGen/pull/48) by @antoniocasero +- Swift 4 support [#52](https://github.com/yonaskolb/XcodeGen/pull/52) +- Support for C and C++ files [#48](https://github.com/yonaskolb/XcodeGen/pull/48) by @antoniocasero - Xcode 9 default settings #### Fixed -- fixed empty string in YAML not being parsed properly [PR#50](https://github.com/yonaskolb/XcodeGen/pull/50) by @antoniocasero +- fixed empty string in YAML not being parsed properly [#50](https://github.com/yonaskolb/XcodeGen/pull/50) by @antoniocasero #### Changed -- updated to xcodeproj 0.1.2 [PR#56](https://github.com/yonaskolb/XcodeGen/pull/56) -- **BREAKING**: changed target definitions from list to map [PR#54](https://github.com/yonaskolb/XcodeGen/pull/54) See [Project Spec](docs/ProjectSpec.md) +- updated to xcodeproj 0.1.2 [#56](https://github.com/yonaskolb/XcodeGen/pull/56) +- **BREAKING**: changed target definitions from list to map [#54](https://github.com/yonaskolb/XcodeGen/pull/54) See [Project Spec](docs/ProjectSpec.md) [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.6.1...1.0.0) @@ -396,18 +423,18 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 0.6.1 #### Added -- Ability to set PBXProject attributes [PR#45](https://github.com/yonaskolb/XcodeGen/pull/45) +- Ability to set PBXProject attributes [#45](https://github.com/yonaskolb/XcodeGen/pull/45) #### Changed - Don't bother linking target frameworks for target dependencies. -- Move code signing default settings from all iOS targets to iOS application targets, via Product + Platform setting preset files [PR#46](https://github.com/yonaskolb/XcodeGen/pull/46) +- Move code signing default settings from all iOS targets to iOS application targets, via Product + Platform setting preset files [#46](https://github.com/yonaskolb/XcodeGen/pull/46) [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.6.0...0.6.1) ## 0.6.0 #### Added -- Allow a project spec to include other project specs [PR#44](https://github.com/yonaskolb/XcodeGen/pull/44) +- Allow a project spec to include other project specs [#44](https://github.com/yonaskolb/XcodeGen/pull/44) #### Changed - Changed default spec path to `project.yml` @@ -420,16 +447,16 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil #### Fixed - Fix embedded framework dependencies - Add `CODE_SIGN_IDENTITY[sdk=iphoneos*]` back to iOS targets -- Fix build scripts with "" generating invalid projects [PR#43](https://github.com/yonaskolb/XcodeGen/pull/43) +- Fix build scripts with "" generating invalid projects [#43](https://github.com/yonaskolb/XcodeGen/pull/43) [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.5.0...0.5.1) ## 0.5.0 #### Added -- Added multi platform targets [PR#35](https://github.com/yonaskolb/XcodeGen/pull/35) -- Automatically generate platform specific `FRAMEWORK_SEARCH_PATHS` for Carthage dependencies [PR#38](https://github.com/yonaskolb/XcodeGen/pull/38) -- Automatically find Info.plist and set `INFOPLIST_FILE` build setting if it doesn't exist on a target [PR#40](https://github.com/yonaskolb/XcodeGen/pull/40) -- Add options for controlling embedding of dependencies [PR#37](https://github.com/yonaskolb/XcodeGen/pull/37) +- Added multi platform targets [#35](https://github.com/yonaskolb/XcodeGen/pull/35) +- Automatically generate platform specific `FRAMEWORK_SEARCH_PATHS` for Carthage dependencies [#38](https://github.com/yonaskolb/XcodeGen/pull/38) +- Automatically find Info.plist and set `INFOPLIST_FILE` build setting if it doesn't exist on a target [#40](https://github.com/yonaskolb/XcodeGen/pull/40) +- Add options for controlling embedding of dependencies [#37](https://github.com/yonaskolb/XcodeGen/pull/37) #### Fixed - Fixed localized files not being added to a target's resources @@ -443,23 +470,23 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 0.4.0 ##### Added -- Homebrew support [PR#16](https://github.com/yonaskolb/XcodeGen/pull/16) by @pepibumur -- Added `runOnlyWhenInstalling` to build scripts [PR#32](https://github.com/yonaskolb/XcodeGen/pull/32) -- Added `carthageBuildPath` option [PR#34](https://github.com/yonaskolb/XcodeGen/pull/34) +- Homebrew support [#16](https://github.com/yonaskolb/XcodeGen/pull/16) by @pepibumur +- Added `runOnlyWhenInstalling` to build scripts [#32](https://github.com/yonaskolb/XcodeGen/pull/32) +- Added `carthageBuildPath` option [#34](https://github.com/yonaskolb/XcodeGen/pull/34) #### Fixed - Fixed installations of XcodeGen not applying build setting presets for configs, products, and platforms, due to missing resources #### Changed -- Upgraded to https://github.com/swift-xcode/xcodeproj 0.1.1 [PR#33](https://github.com/yonaskolb/XcodeGen/pull/33) +- Upgraded to https://github.com/swift-xcode/xcodeproj 0.1.1 [#33](https://github.com/yonaskolb/XcodeGen/pull/33) [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.3.0...0.4.0) ## 0.3.0 - Extensions and Scheme Tests #### Added -- Support for app extension dependencies, using the same `target: MyExtension` syntax [PR#19](https://github.com/yonaskolb/XcodeGen/pull/19) -- Added test targets to generated target schemes via `Target.scheme.testTargets` [PR#21](https://github.com/yonaskolb/XcodeGen/pull/21) +- Support for app extension dependencies, using the same `target: MyExtension` syntax [#19](https://github.com/yonaskolb/XcodeGen/pull/19) +- Added test targets to generated target schemes via `Target.scheme.testTargets` [#21](https://github.com/yonaskolb/XcodeGen/pull/21) #### Changed - Updated xcodeproj to 0.0.9 @@ -475,7 +502,7 @@ If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project wil ## 0.2.0 - Build scripts #### Added -- Added Target build scripts with `Target.prebuildScripts` and `Target.postbuildScripts` [PR#17](https://github.com/yonaskolb/XcodeGen/pull/17) +- Added Target build scripts with `Target.prebuildScripts` and `Target.postbuildScripts` [#17](https://github.com/yonaskolb/XcodeGen/pull/17) - Support for absolute paths in target sources, run script files, and config files - Add validation for incorrect `Target.configFiles` diff --git a/Docs/ProjectSpec.md b/Docs/ProjectSpec.md index 12291f30..8ce6e59c 100644 --- a/Docs/ProjectSpec.md +++ b/Docs/ProjectSpec.md @@ -171,6 +171,16 @@ Settings are merged in the following order: groups, base, configs. - `FRAMEWORK_SEARCH_PATHS`: If carthage dependencies are used, the platform build path will be added to this setting - `OTHER_LDFLAGS`: See `requiresObjCLinking` below - [ ] **dependencies**: **[[Dependency](#dependency)]** - Dependencies for the target +- [ ] **info**: **[Plist](#plist)** - If defined, this will generate and write an `Info.plist` to the specified path and use it by setting the `INFOPLIST_FILE` build setting for every configuration. The following properties are generated automatically, the rest will have to be provided. + - `CFBundleIdentifier` + - `CFBundleInfoDictionaryVersion` + - `CFBundleExecutable` + - `CFBundleName` + - `CFBundleDevelopmentRegion` + - `CFBundleShortVersionString` + - `CFBundleVersion` + - `CFBundlePackageType` +- [ ] **entitlements**: **[Plist](#plist)** - If defined this will generate and write a `.entitlements` file, and use it by setting `CODE_SIGN_ENTITLEMENTS` build setting for every configuration. All properties must be provided - [ ] **templates**: **[String]** - A list of target templates that will be merged in order - [ ] **transitivelyLinkDependencies**: **Bool** - If this is not specified the value from the project set in [Options](#options)`.transitivelyLinkDependencies` will be used. - [ ] **directlyEmbedCarthageDependencies**: **Bool** - If this is `true` Carthage dependencies will be embedded using an `Embed Frameworks` build phase instead of the `copy-frameworks` script. Defaults to `true` for all targets except iOS/tvOS/watchOS Applications. @@ -323,15 +333,15 @@ A dependency can be one of a 3 types: - `target: name` - links to another target - `framework: path` - links to a framework - `carthage: name` - helper for linking to a Carthage framework +- `sdk: name` - links to a dependency with the SDK. This can either be a relative path within the sdk root or a single filename that references a framework (.framework) or lib (.tbd) -**Embed options**: - -These only applied to `target` and `framework` dependencies. +**Linking options**: - [ ] **embed**: **Bool** - Whether to embed the dependency. Defaults to true for application target and false for non application targets. - [ ] **link**: **Bool** - Whether to link the dependency. Defaults to `true` depending on the type of the dependency and the type of the target (e.g. static libraries will only link to executables by default). - [ ] **codeSign**: **Bool** - Whether the `codeSignOnCopy` setting is applied when embedding framework. Defaults to true - [ ] **removeHeaders**: **Bool** - Whether the `removeHeadersOnCopy` setting is applied when embedding the framework. Defaults to true +- [ ] **weak**: **Bool** - Whether the `Weak` setting is applied when linking the framework. Defaults to false **Implicit Framework options**: @@ -356,6 +366,8 @@ targets: - target: MyFramework - framework: path/to/framework.framework - carthage: Result + - sdk: Contacts.framework + - sdk: libc++.tbd MyFramework: type: framework ``` @@ -374,6 +386,25 @@ targets: Debug: App/debug.xcconfig Release: App/release.xcconfig ``` +### Plist +Plists are created on disk on every generation of the project. They can be used as a way to define `Info.plist` or `.entitlement` files. Some `Info.plist` properties are generated automatically. + +- [x] **path**: **String** - This is the path where the plist will be written to +- [x] **properties**: **[String: Any]** - This is a map of all the plist keys and values + +```yml +targets: + App: + info: + path: App/Info.plist + properties: + UISupportedInterfaceOrientations: [UIInterfaceOrientationPortrait] + UILaunchStoryboardName: LaunchScreen + entitlements: + path: App/App.entitlements + properties: + com.apple.security.application-groups: group.com.app +``` ### Build Script @@ -437,7 +468,7 @@ targets: This is a convenience used to automatically generate schemes for a target based on different configs or included tests. If you want more control check out the top level [Scheme](#scheme). - [x] **configVariants**: **[String]** - This generates a scheme for each entry, using configs that contain the name with debug and release variants. This is useful for having different environment schemes. -- [ ] **testTargets**: **[String]** - a list of test targets that should be included in the scheme. These will be added to the build targets and the test entries +- [ ] **testTargets**: **[[Test Target](#test-target)]** - a list of test targets that should be included in the scheme. These will be added to the build targets and the test entries. Each entry can either be a simple string, or a [Test Target](#test-target) - [ ] **gatherCoverageData**: **Bool** - a boolean that indicates if this scheme should gather coverage data. This defaults to false - [ ] **commandLineArguments**: **[String:Bool]** - a dictionary from the argument name (`String`) to if it is enabled (`Bool`). These arguments will be added to the Test, Profile and Run scheme actions - [ ] **environmentVariables**: **[[Environment Variable](#environment-variable)]** or **[String:String]** - environment variables for Run, Test and Profile scheme actions. When passing a dictionary, every key-value entry maps to a corresponding variable that is enabled. @@ -561,7 +592,12 @@ A multiline script can be written using the various YAML multiline methods, for ### Test Action - [ ] **gatherCoverageData**: **Bool** - a boolean that indicates if this scheme should gather coverage data. This defaults to false -- [ ] **targets**: **[String]** - a list of targets to test +- [ ] **targets**: **[[Test Target](#test-target)]** - a list of targets to test. Each entry can either be a simple string, or a [Test Target](#test-target) + +#### Test Target +- [x] **name**: **String** - The name of the target +- [ ] **parallelizable**: **Bool** - Whether to run tests in parallel. Defaults to false +- [ ] **randomExecutionOrder**: **Bool** - Whether to run tests in a random order. Defaults to false ### Archive Action diff --git a/Docs/Usage.md b/Docs/Usage.md index d87630bb..e2089c03 100644 --- a/Docs/Usage.md +++ b/Docs/Usage.md @@ -7,6 +7,7 @@ - [Use dependencies](#use-dependencies) - [Cocoapods](#cocoapods) - [Carthage](#carthage) + - [SDK](#sdk) # Configuring build settings There are various ways of configuring build settings @@ -92,7 +93,7 @@ DEVELOPMENT_TEAM=XXXXXXXXX xcodebuild ... # Use dependencies -Each target can declare one or more dependencies. See [Dependency](#dependency) for more info +Each target can declare one or more dependencies. See [Dependency](ProjectSpec.md#dependency) in the ProjectSpec for more info about all the properties ### Cocoapods Use your `podfile` as normal. The pods themselves don't need to be referenced in the project spec. After you generate your project simply run `pod install` which will integrate with your project and create a workspace. @@ -100,7 +101,7 @@ Use your `podfile` as normal. The pods themselves don't need to be referenced in ### Carthage XcodeGen makes integrating Carthage dependencies super easy! -You simply reference them in each target that requires them and XcodeGen does the rest by automatically linking and embedding the carthage frameworks where neccessary. +You simply reference them in each target that requires them and XcodeGen does the rest by automatically linking and embedding the carthage frameworks where necessary. ```yaml targets: @@ -111,4 +112,29 @@ targets: Framework: dependencies: - carthage: Alamofire -``` \ No newline at end of file +``` + +XcodeGen automatically creates the build phase that Carthage requires which lists all the files and runs `carthage copy-frameworks`. You can change the invocation of carthage to something different, for example if you are running it with [Mint](https://github.com/yonaskolb/mint). This is then prepended to ` copy frameworks` + +```yaml +options: + carthageExecutablePath: mint run Carthage/Carthage carthage +``` + +By default XcodeGen looks for carthage frameworks in `Carthage/Build`. You can change this with the `carthageBuildPath` option + +```yaml +options: + carthageBuildPath: ../../Carthage/Build +``` + +### SDK +System frameworks and libs can be linked by using the `sdk` dependency type. You can either specify frameworks or libs by using a `.framework` or `.tbd` filename, respectively + +```yaml +targets: + App: + dependencies: + - sdk: Contacts.framework + - sdk: libc++.tbd +``` diff --git a/Makefile b/Makefile index 931c6b90..f98091cf 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ TOOL_NAME = XcodeGen export EXECUTABLE_NAME = xcodegen -VERSION = 1.11.2 +VERSION = 2.0.0 PREFIX = /usr/local INSTALL_PATH = $(PREFIX)/bin/$(EXECUTABLE_NAME) diff --git a/Package.resolved b/Package.resolved index a82af1f5..8a451073 100644 --- a/Package.resolved +++ b/Package.resolved @@ -3,11 +3,11 @@ "pins": [ { "package": "AEXML", - "repositoryURL": "https://github.com/tadija/AEXML.git", + "repositoryURL": "https://github.com/tadija/AEXML", "state": { "branch": null, - "revision": "6eea665515d079c338690147082a8084a36484b0", - "version": "4.3.0" + "revision": "54bb8ea6fb693dd3f92a89e5fcc19e199fdeedd0", + "version": "4.3.3" } }, { @@ -24,8 +24,8 @@ "repositoryURL": "https://github.com/yonaskolb/JSONUtilities.git", "state": { "branch": null, - "revision": "d9f957b1b2a078c93f96c723040d4cbffcb7d3f9", - "version": "4.0.2" + "revision": "db238f4858ac2ac3fff228b5b71ce90488a6a9b3", + "version": "4.1.0" } }, { @@ -46,15 +46,6 @@ "version": "3.1.4" } }, - { - "package": "ShellOut", - "repositoryURL": "https://github.com/JohnSundell/ShellOut.git", - "state": { - "branch": null, - "revision": "f1c253a34a40df4bfd268b09fdb101b059f6d52d", - "version": "2.1.0" - } - }, { "package": "Spectre", "repositoryURL": "https://github.com/kylef/Spectre.git", @@ -65,12 +56,21 @@ } }, { - "package": "xcproj", + "package": "SwiftShell", + "repositoryURL": "https://github.com/kareman/SwiftShell", + "state": { + "branch": null, + "revision": "beebe43c986d89ea5359ac3adcb42dac94e5e08a", + "version": "4.1.2" + } + }, + { + "package": "xcodeproj", "repositoryURL": "https://github.com/tuist/xcodeproj.git", "state": { "branch": null, - "revision": "5253c22f208558264e3a64a3a29f11537ca1b41a", - "version": "4.3.1" + "revision": "23da51abd3de3bedaad59a0afbb150b48504b5b0", + "version": "6.3.0" } }, { diff --git a/Package.swift b/Package.swift index b942cd34..adfff4bf 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.0 +// swift-tools-version:4.2 import PackageDescription @@ -13,10 +13,10 @@ let package = Package( .package(url: "https://github.com/kylef/PathKit.git", from: "0.9.0"), .package(url: "https://github.com/kylef/Commander.git", from: "0.8.0"), .package(url: "https://github.com/jpsim/Yams.git", from: "1.0.0"), - .package(url: "https://github.com/yonaskolb/JSONUtilities.git", from: "4.0.0"), + .package(url: "https://github.com/yonaskolb/JSONUtilities.git", from: "4.1.0"), .package(url: "https://github.com/kylef/Spectre.git", from: "0.9.0"), .package(url: "https://github.com/onevcat/Rainbow.git", from: "3.0.0"), - .package(url: "https://github.com/tuist/xcodeproj.git", from: "4.3.1"), + .package(url: "https://github.com/tuist/xcodeproj.git", from: "6.3.0"), ], targets: [ .target(name: "XcodeGen", dependencies: [ @@ -27,17 +27,21 @@ let package = Package( .target(name: "XcodeGenKit", dependencies: [ "ProjectSpec", "JSONUtilities", - "xcproj", + "xcodeproj", "PathKit", ]), .target(name: "ProjectSpec", dependencies: [ "JSONUtilities", - "xcproj", + "xcodeproj", "Yams", ]), .testTarget(name: "XcodeGenKitTests", dependencies: [ "XcodeGenKit", "Spectre", + ]), + .testTarget(name: "PerformanceTests", dependencies: [ + "XcodeGenKit", + "Spectre", ]) ] ) diff --git a/README.md b/README.md index 40ec7fbc..cea216b2 100644 --- a/README.md +++ b/README.md @@ -49,13 +49,17 @@ targets: deploymentTarget: "10.0" sources: [MyApp] settings: - debug: - CUSTOM_BUILD_SETTING: my_debug_value - release: - CUSTOM_BUILD_SETTING: my_release_value + configs: + debug: + CUSTOM_BUILD_SETTING: my_debug_value + release: + CUSTOM_BUILD_SETTING: my_release_value dependencies: - target: MyFramework - carthage: Alamofire + - framework: Vendor/MyFramework.framework + - sdk: Contacts.framework + - sdk: libc++.tbd MyFramework: type: framework platform: iOS diff --git a/SettingPresets/Product_Platform/application_iOS.yml b/SettingPresets/Product_Platform/application_iOS.yml index 31225146..db2ffe0a 100644 --- a/SettingPresets/Product_Platform/application_iOS.yml +++ b/SettingPresets/Product_Platform/application_iOS.yml @@ -1,2 +1,2 @@ -CODE_SIGN_IDENTITY[sdk=iphoneos*]: iPhone Developer +CODE_SIGN_IDENTITY: iPhone Developer ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon diff --git a/SettingPresets/base.yml b/SettingPresets/base.yml index 3722c640..9552b7a0 100644 --- a/SettingPresets/base.yml +++ b/SettingPresets/base.yml @@ -42,4 +42,4 @@ GCC_WARN_UNUSED_VARIABLE: YES # Swift Settings PRODUCT_NAME: $(TARGET_NAME) -SWIFT_VERSION: '4.0' +SWIFT_VERSION: '4.2' diff --git a/Sources/ProjectSpec/Config.swift b/Sources/ProjectSpec/Config.swift index 20c7c4ab..2e343e57 100644 --- a/Sources/ProjectSpec/Config.swift +++ b/Sources/ProjectSpec/Config.swift @@ -1,6 +1,5 @@ import Foundation import JSONUtilities -import xcproj public struct Config: Equatable { public var name: String diff --git a/Sources/ProjectSpec/Dependency.swift b/Sources/ProjectSpec/Dependency.swift index 324f703a..722aae65 100644 --- a/Sources/ProjectSpec/Dependency.swift +++ b/Sources/ProjectSpec/Dependency.swift @@ -1,6 +1,5 @@ import Foundation import JSONUtilities -import xcproj public struct Dependency: Equatable { @@ -11,6 +10,7 @@ public struct Dependency: Equatable { public var removeHeaders: Bool = true public var link: Bool? public var implicit: Bool = false + public var weakLink: Bool = false public init( type: DependencyType, @@ -18,7 +18,8 @@ public struct Dependency: Equatable { embed: Bool? = nil, codeSign: Bool? = nil, link: Bool? = nil, - implicit: Bool = false + implicit: Bool = false, + weakLink: Bool = false ) { self.type = type self.reference = reference @@ -26,12 +27,14 @@ public struct Dependency: Equatable { self.codeSign = codeSign self.link = link self.implicit = implicit + self.weakLink = weakLink } public enum DependencyType { case target case framework case carthage + case sdk } } @@ -47,6 +50,9 @@ extension Dependency: JSONObjectConvertible { } else if let carthage: String = jsonDictionary.json(atKeyPath: "carthage") { type = .carthage reference = carthage + } else if let sdk: String = jsonDictionary.json(atKeyPath: "sdk") { + type = .sdk + reference = sdk } else { throw SpecParsingError.invalidDependency(jsonDictionary) } @@ -61,5 +67,8 @@ extension Dependency: JSONObjectConvertible { if let bool: Bool = jsonDictionary.json(atKeyPath: "implicit") { implicit = bool } + if let bool: Bool = jsonDictionary.json(atKeyPath: "weak") { + weakLink = bool + } } } diff --git a/Sources/ProjectSpec/DeploymentTarget.swift b/Sources/ProjectSpec/DeploymentTarget.swift index 190ce071..cf797b02 100644 --- a/Sources/ProjectSpec/DeploymentTarget.swift +++ b/Sources/ProjectSpec/DeploymentTarget.swift @@ -1,6 +1,5 @@ import Foundation import JSONUtilities -import xcproj public struct DeploymentTarget: Equatable { @@ -41,6 +40,15 @@ extension Platform { case .macOS: return "MACOSX_DEPLOYMENT_TARGET" } } + + public var sdkRoot: String { + switch self { + case .iOS: return "iphoneos" + case .tvOS: return "appletvos" + case .watchOS: return "watchos" + case .macOS: return "macosx" + } + } } extension Version { diff --git a/Sources/ProjectSpec/Plist.swift b/Sources/ProjectSpec/Plist.swift new file mode 100644 index 00000000..5b2a502a --- /dev/null +++ b/Sources/ProjectSpec/Plist.swift @@ -0,0 +1,26 @@ +import Foundation +import JSONUtilities + +public struct Plist: Equatable { + + public let path: String + public let properties: [String: Any] + + public init(path: String, attributes: [String: Any] = [:]) { + self.path = path + properties = attributes + } + + public static func == (lhs: Plist, rhs: Plist) -> Bool { + return lhs.path == rhs.path && + NSDictionary(dictionary: lhs.properties).isEqual(to: rhs.properties) + } +} + +extension Plist: JSONObjectConvertible { + + public init(jsonDictionary: JSONDictionary) throws { + path = try jsonDictionary.json(atKeyPath: "path") + properties = jsonDictionary.json(atKeyPath: "properties") ?? [:] + } +} diff --git a/Sources/ProjectSpec/Project.swift b/Sources/ProjectSpec/Project.swift index bb6eeebb..f5d1d351 100644 --- a/Sources/ProjectSpec/Project.swift +++ b/Sources/ProjectSpec/Project.swift @@ -1,7 +1,6 @@ import Foundation import JSONUtilities import PathKit -import xcproj import Yams public struct Project: BuildSettingsContainer { @@ -78,6 +77,10 @@ public struct Project: BuildSettingsContainer { public func getConfig(_ configName: String) -> Config? { return configs.first { $0.name == configName } } + + public var defaultProjectPath: Path { + return basePath + "\(name).xcodeproj" + } } extension Project: CustomDebugStringConvertible { @@ -86,7 +89,7 @@ extension Project: CustomDebugStringConvertible { var string = "Name: \(name)" let indent = " " if !include.isEmpty { - string += "\nInclude:\n\(indent)" + include.map { "📄 \($0)" }.joined(separator: "\n\(indent)") + string += "\nInclude:\n\(indent)" + include.map { $0.description }.joined(separator: "\n\(indent)") } if !settingGroups.isEmpty { @@ -102,6 +105,10 @@ extension Project: CustomDebugStringConvertible { if !aggregateTargets.isEmpty { string += "\nAggregate Targets:\n\(indent)" + aggregateTargets.map { $0.description }.joined(separator: "\n\(indent)") } + if !schemes.isEmpty { + let allSchemes = targets.filter { $0.scheme != nil }.map { $0.name } + schemes.map { $0.name } + string += "\nSchemes:\n\(indent)" + allSchemes.joined(separator: "\n\(indent)") + } return string } diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index d6d87836..907ccffd 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -1,6 +1,6 @@ import Foundation import JSONUtilities -import xcproj +import xcodeproj public typealias BuildType = XCScheme.BuildAction.Entry.BuildFor @@ -89,15 +89,40 @@ public struct Scheme: Equatable { public var config: String? public var gatherCoverageData: Bool public var commandLineArguments: [String: Bool] - public var targets: [String] + public var targets: [TestTarget] public var preActions: [ExecutionAction] public var postActions: [ExecutionAction] public var environmentVariables: [XCScheme.EnvironmentVariable] + + public struct TestTarget: Equatable, ExpressibleByStringLiteral { + public let name: String + public var randomExecutionOrder: Bool + public var parallelizable: Bool + + public init( + name: String, + randomExecutionOrder: Bool = false, + parallelizable: Bool = false + ) { + self.name = name + self.randomExecutionOrder = randomExecutionOrder + self.parallelizable = parallelizable + } + + public init(stringLiteral value: String) { + name = value + randomExecutionOrder = false + parallelizable = false + } + } + public init( config: String, gatherCoverageData: Bool = false, + randomExecutionOrder: Bool = false, + parallelizable: Bool = false, commandLineArguments: [String: Bool] = [:], - targets: [String] = [], + targets: [TestTarget] = [], preActions: [ExecutionAction] = [], postActions: [ExecutionAction] = [], environmentVariables: [XCScheme.EnvironmentVariable] = [] @@ -210,13 +235,34 @@ extension Scheme.Test: JSONObjectConvertible { config = jsonDictionary.json(atKeyPath: "config") gatherCoverageData = jsonDictionary.json(atKeyPath: "gatherCoverageData") ?? false commandLineArguments = jsonDictionary.json(atKeyPath: "commandLineArguments") ?? [:] - targets = jsonDictionary.json(atKeyPath: "targets") ?? [] + if let targets = jsonDictionary["targets"] as? [Any] { + self.targets = try targets.compactMap { target in + if let string = target as? String { + return TestTarget(name: string) + } else if let dictionary = target as? JSONDictionary { + return try TestTarget(jsonDictionary: dictionary) + } else { + return nil + } + } + } else { + targets = [] + } preActions = jsonDictionary.json(atKeyPath: "preActions") ?? [] postActions = jsonDictionary.json(atKeyPath: "postActions") ?? [] environmentVariables = try XCScheme.EnvironmentVariable.parseAll(jsonDictionary: jsonDictionary) } } +extension Scheme.Test.TestTarget: JSONObjectConvertible { + + public init(jsonDictionary: JSONDictionary) throws { + name = try jsonDictionary.json(atKeyPath: "name") + randomExecutionOrder = jsonDictionary.json(atKeyPath: "randomExecutionOrder") ?? false + parallelizable = jsonDictionary.json(atKeyPath: "parallelizable") ?? false + } +} + extension Scheme.Profile: JSONObjectConvertible { public init(jsonDictionary: JSONDictionary) throws { @@ -311,7 +357,7 @@ extension BuildType: JSONPrimitiveConvertible { } } -extension XCScheme.EnvironmentVariable: JSONObjectConvertible, Equatable { +extension XCScheme.EnvironmentVariable: JSONObjectConvertible { private static func parseValue(_ value: Any) -> String { if let bool = value as? Bool { @@ -346,10 +392,4 @@ extension XCScheme.EnvironmentVariable: JSONObjectConvertible, Equatable { return [] } } - - public static func == (lhs: XCScheme.EnvironmentVariable, rhs: XCScheme.EnvironmentVariable) -> Bool { - return lhs.variable == rhs.variable && - lhs.value == rhs.value && - lhs.enabled == rhs.enabled - } } diff --git a/Sources/ProjectSpec/Settings.swift b/Sources/ProjectSpec/Settings.swift index c1a5dad5..26d061bf 100644 --- a/Sources/ProjectSpec/Settings.swift +++ b/Sources/ProjectSpec/Settings.swift @@ -1,7 +1,7 @@ import Foundation import JSONUtilities import PathKit -import xcproj +import xcodeproj public struct Settings: Equatable, JSONObjectConvertible, CustomStringConvertible { diff --git a/Sources/ProjectSpec/SpecOptions.swift b/Sources/ProjectSpec/SpecOptions.swift index 6b4adfc4..9d559578 100644 --- a/Sources/ProjectSpec/SpecOptions.swift +++ b/Sources/ProjectSpec/SpecOptions.swift @@ -1,6 +1,5 @@ import Foundation import JSONUtilities -import xcproj public struct SpecOptions: Equatable { diff --git a/Sources/ProjectSpec/SpecValidation.swift b/Sources/ProjectSpec/SpecValidation.swift index 43f4a419..bbecdfba 100644 --- a/Sources/ProjectSpec/SpecValidation.swift +++ b/Sources/ProjectSpec/SpecValidation.swift @@ -22,6 +22,24 @@ extension Project { } } } + + if settings.buildSettings.count == configs.count { + var allConfigs = true + for buildSetting in settings.buildSettings.keys { + var isConfig = false + for config in configs { + if config.name.lowercased().contains(buildSetting.lowercased()) { + isConfig = true + } + } + if !isConfig { + allConfigs = false + } + } + if allConfigs { + errors.append(.invalidPerConfigSettings) + } + } return errors } @@ -92,8 +110,8 @@ extension Project { } for testTarget in scheme.testTargets { - if getTarget(testTarget) == nil { - errors.append(.invalidTargetSchemeTest(target: target.name, testTarget: testTarget)) + if getTarget(testTarget.name) == nil { + errors.append(.invalidTargetSchemeTest(target: target.name, testTarget: testTarget.name)) } } } @@ -120,8 +138,23 @@ extension Project { for target in targets { for dependency in target.dependencies { - if dependency.type == .target, getProjectTarget(dependency.reference) == nil { - errors.append(.invalidTargetDependency(target: target.name, dependency: dependency.reference)) + switch dependency.type { + case .target: + if getProjectTarget(dependency.reference) == nil { + errors.append(.invalidTargetDependency(target: target.name, dependency: dependency.reference)) + } + case .sdk: + let path = Path(dependency.reference) + if !dependency.reference.contains("/") { + switch path.extension { + case "framework"?, + "tbd"?: + break + default: + errors.append(.invalidSDKDependency(target: target.name, dependency: dependency.reference)) + } + } + default: break } } diff --git a/Sources/ProjectSpec/SpecValidationError.swift b/Sources/ProjectSpec/SpecValidationError.swift index d44fc19a..6c0acb7f 100644 --- a/Sources/ProjectSpec/SpecValidationError.swift +++ b/Sources/ProjectSpec/SpecValidationError.swift @@ -6,6 +6,7 @@ public struct SpecValidationError: Error, CustomStringConvertible { public enum ValidationError: Error, CustomStringConvertible { case invalidXcodeGenVersion(minimumVersion: Version, version: Version) + case invalidSDKDependency(target: String, dependency: String) case invalidTargetDependency(target: String, dependency: String) case invalidTargetSource(target: String, source: String) case invalidTargetConfigFile(target: String, configFile: String, config: String) @@ -21,11 +22,14 @@ public struct SpecValidationError: Error, CustomStringConvertible { case invalidConfigFileConfig(String) case missingConfigForTargetScheme(target: String, configType: ConfigType) case missingDefaultConfig(configName: String) + case invalidPerConfigSettings public var description: String { switch self { case let .invalidXcodeGenVersion(minimumVersion, version): return "XcodeGen version is \(version), but minimum required version specified as \(minimumVersion)" + case let .invalidSDKDependency(target, dependency): + return "Target \(target.quoted) has invalid sdk dependency: \(dependency.quoted). It must be a full path or have the following extensions: .framework, .dylib, .tbd" case let .invalidTargetDependency(target, dependency): return "Target \(target.quoted) has invalid dependency: \(dependency.quoted)" case let .invalidTargetConfigFile(target, configFile, config): @@ -56,6 +60,8 @@ public struct SpecValidationError: Error, CustomStringConvertible { return "Target \(target.quoted) is missing a config of type \(configType.rawValue) to generate its scheme" case let .missingDefaultConfig(name): return "Default configuration \(name) doesn't exist" + case .invalidPerConfigSettings: + return "Settings that are for a specific config must go in \"configs\". \"base\" can be used for common settings" } } } diff --git a/Sources/ProjectSpec/Target.swift b/Sources/ProjectSpec/Target.swift index 3d917cda..10218fad 100644 --- a/Sources/ProjectSpec/Target.swift +++ b/Sources/ProjectSpec/Target.swift @@ -1,6 +1,6 @@ import Foundation import JSONUtilities -import xcproj +import xcodeproj public struct LegacyTarget: Equatable { public var toolPath: String @@ -28,6 +28,8 @@ public struct Target: ProjectTarget { public var settings: Settings public var sources: [TargetSource] public var dependencies: [Dependency] + public var info: Plist? + public var entitlements: Plist? public var transitivelyLinkDependencies: Bool? public var directlyEmbedCarthageDependencies: Bool? public var requiresObjCLinking: Bool? @@ -40,14 +42,14 @@ public struct Target: ProjectTarget { public var legacy: LegacyTarget? public var deploymentTarget: Version? public var attributes: [String: Any] - internal var productName: String? + public var productName: String public var isLegacy: Bool { return legacy != nil } public var filename: String { - var filename = productName ?? name + var filename = productName if let fileExtension = type.fileExtension { filename += ".\(fileExtension)" } @@ -58,11 +60,14 @@ public struct Target: ProjectTarget { name: String, type: PBXProductType, platform: Platform, + productName: String? = nil, deploymentTarget: Version? = nil, settings: Settings = .empty, configFiles: [String: String] = [:], sources: [TargetSource] = [], dependencies: [Dependency] = [], + info: Plist? = nil, + entitlements: Plist? = nil, transitivelyLinkDependencies: Bool? = nil, directlyEmbedCarthageDependencies: Bool? = nil, requiresObjCLinking: Bool? = nil, @@ -78,10 +83,13 @@ public struct Target: ProjectTarget { self.type = type self.platform = platform self.deploymentTarget = deploymentTarget + self.productName = productName ?? name self.settings = settings self.configFiles = configFiles self.sources = sources self.dependencies = dependencies + self.info = info + self.entitlements = entitlements self.transitivelyLinkDependencies = transitivelyLinkDependencies self.directlyEmbedCarthageDependencies = directlyEmbedCarthageDependencies self.requiresObjCLinking = requiresObjCLinking @@ -98,7 +106,7 @@ public struct Target: ProjectTarget { extension Target: CustomStringConvertible { public var description: String { - return "\(platform.emoji) \(name): \(type)" + return "\(name): \(platform.rawValue) \(type)" } } @@ -210,6 +218,8 @@ extension Target: Equatable { lhs.settings == rhs.settings && lhs.configFiles == rhs.configFiles && lhs.sources == rhs.sources && + lhs.info == rhs.info && + lhs.entitlements == rhs.entitlements && lhs.dependencies == rhs.dependencies && lhs.preBuildScripts == rhs.preBuildScripts && lhs.postCompileScripts == rhs.postCompileScripts && @@ -234,8 +244,9 @@ extension LegacyTarget: JSONObjectConvertible { extension Target: NamedJSONDictionaryConvertible { public init(name: String, jsonDictionary: JSONDictionary) throws { - self.name = jsonDictionary.json(atKeyPath: "name") ?? name - productName = jsonDictionary.json(atKeyPath: "productName") + let resolvedName: String = jsonDictionary.json(atKeyPath: "name") ?? name + self.name = resolvedName + productName = jsonDictionary.json(atKeyPath: "productName") ?? resolvedName let typeString: String = try jsonDictionary.json(atKeyPath: "type") if let type = PBXProductType(string: typeString) { self.type = type @@ -279,6 +290,14 @@ extension Target: NamedJSONDictionaryConvertible { } else { dependencies = try jsonDictionary.json(atKeyPath: "dependencies", invalidItemBehaviour: .fail) } + + if jsonDictionary["info"] != nil { + info = try jsonDictionary.json(atKeyPath: "info") as Plist + } + if jsonDictionary["entitlements"] != nil { + entitlements = try jsonDictionary.json(atKeyPath: "entitlements") as Plist + } + transitivelyLinkDependencies = jsonDictionary.json(atKeyPath: "transitivelyLinkDependencies") directlyEmbedCarthageDependencies = jsonDictionary.json(atKeyPath: "directlyEmbedCarthageDependencies") requiresObjCLinking = jsonDictionary.json(atKeyPath: "requiresObjCLinking") diff --git a/Sources/ProjectSpec/TargetScheme.swift b/Sources/ProjectSpec/TargetScheme.swift index 72194461..22b018e9 100644 --- a/Sources/ProjectSpec/TargetScheme.swift +++ b/Sources/ProjectSpec/TargetScheme.swift @@ -1,9 +1,9 @@ import Foundation import JSONUtilities -import xcproj +import xcodeproj public struct TargetScheme: Equatable { - public var testTargets: [String] + public var testTargets: [Scheme.Test.TestTarget] public var configVariants: [String] public var gatherCoverageData: Bool public var commandLineArguments: [String: Bool] @@ -12,7 +12,7 @@ public struct TargetScheme: Equatable { public var postActions: [Scheme.ExecutionAction] public init( - testTargets: [String] = [], + testTargets: [Scheme.Test.TestTarget] = [], configVariants: [String] = [], gatherCoverageData: Bool = false, commandLineArguments: [String: Bool] = [:], @@ -33,7 +33,19 @@ public struct TargetScheme: Equatable { extension TargetScheme: JSONObjectConvertible { public init(jsonDictionary: JSONDictionary) throws { - testTargets = jsonDictionary.json(atKeyPath: "testTargets") ?? [] + if let targets = jsonDictionary["testTargets"] as? [Any] { + testTargets = try targets.compactMap { target in + if let string = target as? String { + return .init(name: string) + } else if let dictionary = target as? JSONDictionary { + return try .init(jsonDictionary: dictionary) + } else { + return nil + } + } + } else { + testTargets = [] + } configVariants = jsonDictionary.json(atKeyPath: "configVariants") ?? [] gatherCoverageData = jsonDictionary.json(atKeyPath: "gatherCoverageData") ?? false commandLineArguments = jsonDictionary.json(atKeyPath: "commandLineArguments") ?? [:] diff --git a/Sources/ProjectSpec/TargetSource.swift b/Sources/ProjectSpec/TargetSource.swift index 74aed837..6bcbfc21 100644 --- a/Sources/ProjectSpec/TargetSource.swift +++ b/Sources/ProjectSpec/TargetSource.swift @@ -1,7 +1,7 @@ import Foundation import JSONUtilities import PathKit -import xcproj +import xcodeproj public struct TargetSource: Equatable { @@ -58,7 +58,7 @@ public struct TargetSource: Equatable { case sharedSupport case plugins - public var destination: xcproj.PBXCopyFilesBuildPhase.SubFolder? { + public var destination: xcodeproj.PBXCopyFilesBuildPhase.SubFolder? { switch self { case .absolutePath: return .absolutePath case .productsDirectory: return .productsDirectory @@ -96,7 +96,7 @@ public struct TargetSource: Equatable { } } - public var buildPhase: xcproj.BuildPhase? { + public var buildPhase: xcodeproj.BuildPhase? { switch self { case .sources: return .sources case .headers: return .headers diff --git a/Sources/ProjectSpec/XCProjExtensions.swift b/Sources/ProjectSpec/XCProjExtensions.swift index 0b3096dc..bd3541a1 100644 --- a/Sources/ProjectSpec/XCProjExtensions.swift +++ b/Sources/ProjectSpec/XCProjExtensions.swift @@ -1,6 +1,6 @@ import Foundation import PathKit -import xcproj +import xcodeproj extension PBXProductType { @@ -60,7 +60,7 @@ extension XCScheme.CommandLineArguments { public convenience init(_ dict: [String: Bool]) { let args = dict.map { tuple in XCScheme.CommandLineArguments.CommandLineArgument(name: tuple.key, enabled: tuple.value) - } + }.sorted { $0.name < $1.name } self.init(arguments: args) } } diff --git a/Sources/XcodeGen/main.swift b/Sources/XcodeGen/main.swift index 7531e821..d914b3fd 100644 --- a/Sources/XcodeGen/main.swift +++ b/Sources/XcodeGen/main.swift @@ -4,9 +4,9 @@ import JSONUtilities import PathKit import ProjectSpec import XcodeGenKit -import xcproj +import xcodeproj -let version = try Version("1.11.2") +let version = try Version("2.0.0") func generate(spec: String, project: String, isQuiet: Bool, justVersion: Bool) { if justVersion { @@ -22,7 +22,7 @@ func generate(spec: String, project: String, isQuiet: Bool, justVersion: Bool) { } let projectSpecPath = Path(spec).absolute() - let projectPath = project == "" ? projectSpecPath.parent() : Path(project).absolute() + var projectPath = project == "" ? projectSpecPath.parent() : Path(project).absolute() if !projectSpecPath.exists { fatalError("No project spec found at \(projectSpecPath.absolute())") @@ -39,27 +39,20 @@ func generate(spec: String, project: String, isQuiet: Bool, justVersion: Bool) { } do { - logger.info("⚙️ Generating project...") - try project.validateMinimumXcodeGenVersion(version) + try project.validate() + logger.info("⚙️ Generating project...") let projectGenerator = ProjectGenerator(project: project) let xcodeProject = try projectGenerator.generateXcodeProject() logger.info("⚙️ Writing project...") + let fileWriter = FileWriter(project: project) + projectPath = projectPath + "\(project.name).xcodeproj" + try fileWriter.writeXcodeProject(xcodeProject, to: projectPath) + try fileWriter.writePlists() - let projectFile = projectPath + "\(project.name).xcodeproj" - let tempPath = Path.temporary + "XcodeGen_\(Int(NSTimeIntervalSince1970))" - try? tempPath.delete() - if projectFile.exists { - try projectFile.copy(tempPath) - } - try xcodeProject.write(path: tempPath, override: true) - try? projectFile.delete() - try tempPath.copy(projectFile) - try? tempPath.delete() - - logger.success("💾 Saved project to \(projectFile.string)") + logger.success("💾 Saved project to \(projectPath)") } catch let error as SpecValidationError { fatalError(error.description) } catch { diff --git a/Sources/XcodeGenKit/FileWriter.swift b/Sources/XcodeGenKit/FileWriter.swift new file mode 100644 index 00000000..82cafa7f --- /dev/null +++ b/Sources/XcodeGenKit/FileWriter.swift @@ -0,0 +1,56 @@ +import Foundation +import PathKit +import ProjectSpec +import xcodeproj + +public class FileWriter { + + let project: Project + + public init(project: Project) { + self.project = project + } + + public func writeXcodeProject(_ xcodeProject: XcodeProj, to projectPath: Path? = nil) throws { + let projectPath = project.defaultProjectPath + let tempPath = Path.temporary + "XcodeGen_\(Int(NSTimeIntervalSince1970))" + try? tempPath.delete() + if projectPath.exists { + try projectPath.copy(tempPath) + } + try xcodeProject.write(path: tempPath, override: true) + try? projectPath.delete() + try tempPath.copy(projectPath) + try? tempPath.delete() + } + + public func writePlists() throws { + + let infoPlistGenerator = InfoPlistGenerator() + for target in project.targets { + // write Info.plist + if let plist = target.info { + let properties = infoPlistGenerator.generateProperties(target: target).merged(plist.properties) + try writePlist(properties, path: plist.path) + } + + // write entitlements + if let plist = target.entitlements { + try writePlist(plist.properties, path: plist.path) + } + } + } + + private func writePlist(_ plist: [String: Any], path: String) throws { + let path = project.basePath + path + if path.exists, let data: Data = try? path.read(), + let existingPlist = (try? PropertyListSerialization.propertyList(from: data, format: nil)) as? [String: Any], NSDictionary(dictionary: plist).isEqual(to: existingPlist) { + // file is the same + return + } + let data = try PropertyListSerialization.data(fromPropertyList: plist, format: .xml, options: 0) + try? path.delete() + try path.parent().mkpath() + try path.write(data) + } +} diff --git a/Sources/XcodeGenKit/InfoPlistGenerator.swift b/Sources/XcodeGenKit/InfoPlistGenerator.swift new file mode 100644 index 00000000..f4850a18 --- /dev/null +++ b/Sources/XcodeGenKit/InfoPlistGenerator.swift @@ -0,0 +1,43 @@ +import Foundation +import PathKit +import ProjectSpec + +public class InfoPlistGenerator { + + /** + Default info plist attributes taken from: + /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Base/Base_DefinitionsInfoPlist.xctemplate/TemplateInfo.plist + */ + var defaultInfoPlist: [String: Any] = { + var dictionary: [String: Any] = [:] + dictionary["CFBundleIdentifier"] = "$(PRODUCT_BUNDLE_IDENTIFIER)" + dictionary["CFBundleInfoDictionaryVersion"] = "6.0" + dictionary["CFBundleExecutable"] = "$(EXECUTABLE_NAME)" + dictionary["CFBundleName"] = "$(PRODUCT_NAME)" + dictionary["CFBundleDevelopmentRegion"] = "$(DEVELOPMENT_LANGUAGE)" + dictionary["CFBundleShortVersionString"] = "1.0" + dictionary["CFBundleVersion"] = "1" + return dictionary + }() + + public func generateProperties(target: Target) -> [String: Any] { + var targetInfoPlist = defaultInfoPlist + switch target.type { + case .uiTestBundle, + .unitTestBundle: + targetInfoPlist["CFBundlePackageType"] = "BNDL" + case .application, + .watch2App: + targetInfoPlist["CFBundlePackageType"] = "APPL" + case .framework: + targetInfoPlist["CFBundlePackageType"] = "FMWK" + case .bundle: + targetInfoPlist["CFBundlePackageType"] = "BNDL" + case .xpcService, + .appExtension: + targetInfoPlist["CFBundlePackageType"] = "XPC!" + default: break + } + return targetInfoPlist + } +} diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index dcb1f6da..96c21623 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -1,8 +1,7 @@ import Foundation -import JSONUtilities import PathKit import ProjectSpec -import xcproj +import xcodeproj import Yams public class PBXProjGenerator { @@ -12,13 +11,13 @@ public class PBXProjGenerator { let pbxProj: PBXProj var sourceGenerator: SourceGenerator! - var targetObjects: [String: ObjectReference] = [:] - var targetAggregateObjects: [String: ObjectReference] = [:] - var targetBuildFiles: [String: ObjectReference] = [:] - var targetFileReferences: [String: String] = [:] + var targetObjects: [String: PBXTarget] = [:] + var targetAggregateObjects: [String: PBXAggregateTarget] = [:] + var targetFileReferences: [String: PBXFileReference] = [:] + var sdkFileReferences: [String: PBXFileReference] = [:] - var carthageFrameworksByPlatform: [String: Set] = [:] - var frameworkFiles: [String] = [] + var carthageFrameworksByPlatform: [String: Set] = [:] + var frameworkFiles: [PBXFileElement] = [] var generated = false @@ -28,21 +27,14 @@ public class PBXProjGenerator { public init(project: Project) { self.project = project - pbxProj = PBXProj(rootObject: "", objectVersion: 46) - sourceGenerator = SourceGenerator(project: project) { [unowned self] id, object in - self.addObject(id: id, object) - } + pbxProj = PBXProj(rootObject: nil, objectVersion: 46) + sourceGenerator = SourceGenerator(project: project, pbxProj: pbxProj) } - func addObject(id: String, _ object: PBXObject) -> String { - let reference = pbxProj.objects.generateReference(object, id) - pbxProj.objects.addObject(object, reference: reference) - return reference - } - - func createObject(id: String, _ object: T) -> ObjectReference { - let reference = addObject(id: id, object) - return ObjectReference(reference: reference, object: object) + func addObject(_ object: T, context: String? = nil) -> T { + pbxProj.add(object: object) + object.context = context + return object } public func generate() throws -> PBXProj { @@ -55,35 +47,34 @@ public class PBXProjGenerator { try sourceGenerator.getFileGroups(path: group) } - let buildConfigs: [ObjectReference] = project.configs.map { config in + let buildConfigs: [XCBuildConfiguration] = project.configs.map { config in let buildSettings = project.getProjectBuildSettings(config: config) - var baseConfigurationReference: String? - if let configPath = project.configFiles[config.name] { - baseConfigurationReference = sourceGenerator.getContainedFileReference(path: project.basePath + configPath) + var baseConfiguration: PBXFileReference? + if let configPath = project.configFiles[config.name], + let fileReference = sourceGenerator.getContainedFileReference(path: project.basePath + configPath) as? PBXFileReference { + baseConfiguration = fileReference } - return createObject( - id: config.name, + let buildConfig = addObject( XCBuildConfiguration( name: config.name, - baseConfigurationReference: baseConfigurationReference, buildSettings: buildSettings ) ) + buildConfig.baseConfiguration = baseConfiguration + return buildConfig } - let configName = project.options.defaultConfig ?? buildConfigs.first?.object.name ?? "" - let buildConfigList = createObject( - id: project.name, + let configName = project.options.defaultConfig ?? buildConfigs.first?.name ?? "" + let buildConfigList = addObject( XCConfigurationList( - buildConfigurations: buildConfigs.map { $0.reference }, + buildConfigurations: buildConfigs, defaultConfigurationName: configName ) ) - var derivedGroups: [ObjectReference] = [] + var derivedGroups: [PBXGroup] = [] - let mainGroup = createObject( - id: "Project", + let mainGroup = addObject( PBXGroup( children: [], sourceTree: .group, @@ -93,18 +84,17 @@ public class PBXProjGenerator { ) ) - let pbxProject = createObject( - id: project.name, + let pbxProject = addObject( PBXProject( name: project.name, - buildConfigurationList: buildConfigList.reference, + buildConfigurationList: buildConfigList, compatibilityVersion: "Xcode 3.2", - mainGroup: mainGroup.reference, + mainGroup: mainGroup, developmentRegion: project.options.developmentLanguage ?? "en" ) ) - pbxProj.rootObject = pbxProject.reference + pbxProj.rootObject = pbxProject for target in project.targets { let targetObject: PBXTarget @@ -115,17 +105,18 @@ public class PBXProjGenerator { buildToolPath: target.legacy?.toolPath, buildArgumentsString: target.legacy?.arguments, passBuildSettingsInEnvironment: target.legacy?.passSettings ?? false, - buildWorkingDirectory: target.legacy?.workingDirectory + buildWorkingDirectory: target.legacy?.workingDirectory, + buildPhases: [] ) } else { - targetObject = PBXNativeTarget(name: target.name) + targetObject = PBXNativeTarget(name: target.name, buildPhases: []) } - targetObjects[target.name] = createObject(id: target.name, targetObject) + targetObjects[target.name] = addObject(targetObject) var explicitFileType: String? var lastKnownFileType: String? - let fileType = PBXFileReference.fileType(path: Path(target.filename)) + let fileType = Xcode.fileType(path: Path(target.filename)) if target.platform == .macOS || target.platform == .watchOS || target.type == .framework { explicitFileType = fileType } else { @@ -133,29 +124,24 @@ public class PBXProjGenerator { } if !target.isLegacy { - let fileReference = createObject( - id: target.name, + let fileReference = addObject( PBXFileReference( sourceTree: .buildProductsDir, explicitFileType: explicitFileType, lastKnownFileType: lastKnownFileType, path: target.filename, includeInIndex: false - ) + ), + context: target.name ) - targetFileReferences[target.name] = fileReference.reference - targetBuildFiles[target.name] = createObject( - id: fileReference.reference, - PBXBuildFile(fileRef: fileReference.reference) - ) + targetFileReferences[target.name] = fileReference } } for target in project.aggregateTargets { - let aggregateTarget = createObject( - id: target.name, + let aggregateTarget = addObject( PBXAggregateTarget( name: target.name, productName: target.name @@ -167,10 +153,9 @@ public class PBXProjGenerator { try project.targets.forEach(generateTarget) try project.aggregateTargets.forEach(generateAggregateTarget) - let productGroup = createObject( - id: "Products", + let productGroup = addObject( PBXGroup( - children: Array(targetFileReferences.values), + children: targetFileReferences.valueArray, sourceTree: .group, name: "Products" ) @@ -179,34 +164,29 @@ public class PBXProjGenerator { if !carthageFrameworksByPlatform.isEmpty { var platforms: [PBXGroup] = [] - var platformReferences: [String] = [] - for (platform, fileReferences) in carthageFrameworksByPlatform { - let platformGroup: ObjectReference = createObject( - id: "Carthage" + platform, + for (platform, files) in carthageFrameworksByPlatform { + let platformGroup: PBXGroup = addObject( PBXGroup( - children: fileReferences.sorted(), + children: files.sorted { $0.nameOrPath < $1.nameOrPath }, sourceTree: .group, path: platform ) ) - platformReferences.append(platformGroup.reference) - platforms.append(platformGroup.object) + platforms.append(platformGroup) } - let carthageGroup = createObject( - id: "Carthage", + let carthageGroup = addObject( PBXGroup( - children: platformReferences.sorted(), + children: platforms, sourceTree: .group, name: "Carthage", path: carthageBuildPath ) ) - frameworkFiles.append(carthageGroup.reference) + frameworkFiles.append(carthageGroup) } if !frameworkFiles.isEmpty { - let group = createObject( - id: "Frameworks", + let group = addObject( PBXGroup( children: frameworkFiles, sourceTree: .group, @@ -216,90 +196,86 @@ public class PBXProjGenerator { derivedGroups.append(group) } - mainGroup.object.children = Array(sourceGenerator.rootGroups) + mainGroup.children = Array(sourceGenerator.rootGroups) sortGroups(group: mainGroup) // add derived groups at the end derivedGroups.forEach(sortGroups) - mainGroup.object.children += derivedGroups - .sorted { $0.object.nameOrPath.localizedStandardCompare($1.object.nameOrPath) == .orderedAscending } - .map { $0.reference } + mainGroup.children += derivedGroups + .sorted { $0.nameOrPath.localizedStandardCompare($1.nameOrPath) == .orderedAscending } + .map { $0 } let projectAttributes: [String: Any] = ["LastUpgradeCheck": project.xcodeVersion] .merged(project.attributes) - .merged(generateTargetAttributes() ?? [:]) let knownRegions = sourceGenerator.knownRegions.sorted() - pbxProject.object.knownRegions = knownRegions.isEmpty ? ["en"] : knownRegions - - let allTargets: [ObjectReference] = Array(targetObjects.values) + Array(targetAggregateObjects.values.map { ObjectReference(reference: $0.reference, object: $0.object) }) - pbxProject.object.targets = allTargets - .sorted { $0.object.name < $1.object.name } - .map { $0.reference } - pbxProject.object.attributes = projectAttributes + pbxProject.knownRegions = knownRegions.isEmpty ? ["en"] : knownRegions + let allTargets: [PBXTarget] = Array(targetObjects.values) + Array(targetAggregateObjects.values) + pbxProject.targets = allTargets + .sorted { $0.name < $1.name } + pbxProject.attributes = projectAttributes + pbxProject.targetAttributes = generateTargetAttributes() return pbxProj } func generateAggregateTarget(_ target: AggregateTarget) throws { - let aggregateTarget = targetAggregateObjects[target.name]!.object + let aggregateTarget = targetAggregateObjects[target.name]! - let configs: [ObjectReference] = project.configs.map { config in + let configs: [XCBuildConfiguration] = project.configs.map { config in let buildSettings = project.getBuildSettings(settings: target.settings, config: config) - var baseConfigurationReference: String? + var baseConfiguration: PBXFileReference? if let configPath = target.configFiles[config.name] { - baseConfigurationReference = sourceGenerator.getContainedFileReference(path: project.basePath + configPath) + baseConfiguration = sourceGenerator.getContainedFileReference(path: project.basePath + configPath) as? PBXFileReference } let buildConfig = XCBuildConfiguration( name: config.name, - baseConfigurationReference: baseConfigurationReference, + baseConfiguration: baseConfiguration, buildSettings: buildSettings ) - return createObject(id: config.name + target.name, buildConfig) + return addObject(buildConfig) } - let dependencies: [String] = target.targets.map { generateTargetDependency(from: target.name, to: $0).reference } + let dependencies = target.targets.map { generateTargetDependency(from: target.name, to: $0) } - let buildConfigList = createObject(id: target.name, XCConfigurationList( - buildConfigurations: configs.map { $0.reference }, + let buildConfigList = addObject(XCConfigurationList( + buildConfigurations: configs, defaultConfigurationName: "" )) - var buildPhases: [String] = [] + var buildPhases: [PBXBuildPhase] = [] buildPhases += try target.buildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) } aggregateTarget.buildPhases = buildPhases - aggregateTarget.buildConfigurationList = buildConfigList.reference + aggregateTarget.buildConfigurationList = buildConfigList aggregateTarget.dependencies = dependencies } - func generateTargetDependency(from: String, to target: String) -> ObjectReference { - guard let targetReference = targetObjects[target]?.reference ?? targetAggregateObjects[target]?.reference else { + func generateTargetDependency(from: String, to target: String) -> PBXTargetDependency { + guard let targetObject = targetObjects[target] ?? targetAggregateObjects[target] else { fatalError("target not found") } - let targetProxy = createObject( - id: "\(from)-\(target)", + let targetProxy = addObject( PBXContainerItemProxy( - containerPortal: pbxProj.rootObject, - remoteGlobalIDString: targetReference, + containerPortal: pbxProj.rootObject!, + remoteGlobalID: targetObject, proxyType: .nativeTarget, remoteInfo: target ) ) - let targetDependency = createObject( - id: "\(from)-\(target)", + let targetDependency = addObject( PBXTargetDependency( - target: targetReference, - targetProxy: targetProxy.reference + target: targetObject, + targetProxy: targetProxy ) ) return targetDependency } - func generateBuildScript(targetName: String, buildScript: BuildScript) throws -> String { + func generateBuildScript(targetName: String, buildScript: BuildScript) throws -> PBXShellScriptBuildPhase { let shellScript: String switch buildScript.script { @@ -310,63 +286,57 @@ public class PBXProjGenerator { } let shellScriptPhase = PBXShellScriptBuildPhase( - files: [], name: buildScript.name ?? "Run Script", inputPaths: buildScript.inputFiles, outputPaths: buildScript.outputFiles, shellPath: buildScript.shell ?? "/bin/sh", - shellScript: shellScript + shellScript: shellScript, + runOnlyForDeploymentPostprocessing: buildScript.runOnlyWhenInstalling, + showEnvVarsInLog: buildScript.showEnvVars ) - shellScriptPhase.runOnlyForDeploymentPostprocessing = buildScript.runOnlyWhenInstalling - shellScriptPhase.showEnvVarsInLog = buildScript.showEnvVars - return createObject(id: String(describing: buildScript.name) + shellScript + targetName, shellScriptPhase).reference + return addObject(shellScriptPhase) } - func generateCopyFiles(targetName: String, copyFiles: TargetSource.BuildPhase.CopyFilesSettings, buildPhaseFiles: [String]) -> String { - return createObject( - id: "copy files" + copyFiles.destination.rawValue + copyFiles.subpath + targetName, - PBXCopyFilesBuildPhase( - dstPath: copyFiles.subpath, - dstSubfolderSpec: copyFiles.destination.destination, - files: buildPhaseFiles - ) - ).reference + func generateCopyFiles(targetName: String, copyFiles: TargetSource.BuildPhase.CopyFilesSettings, buildPhaseFiles: [PBXBuildFile]) -> PBXCopyFilesBuildPhase { + let copyFilesBuildPhase = PBXCopyFilesBuildPhase( + dstPath: copyFiles.subpath, + dstSubfolderSpec: copyFiles.destination.destination, + files: buildPhaseFiles + ) + return addObject(copyFilesBuildPhase) } - func generateTargetAttributes() -> [String: Any]? { + func generateTargetAttributes() -> [PBXTarget: [String: Any]] { - var targetAttributes: [String: [String: Any]] = [:] + var targetAttributes: [PBXTarget: [String: Any]] = [:] - let uiTestTargets = pbxProj.objects.nativeTargets.objectReferences.filter { $0.object.productType == .uiTestBundle } + let uiTestTargets = pbxProj.nativeTargets.filter { $0.productType == .uiTestBundle } for uiTestTarget in uiTestTargets { // look up TEST_TARGET_NAME build setting func testTargetName(_ target: PBXTarget) -> String? { - guard let configurationList = target.buildConfigurationList else { return nil } - guard let buildConfigurationReferences = self.pbxProj.objects.configurationLists[configurationList]?.buildConfigurations else { return nil } + guard let buildConfigurations = target.buildConfigurationList?.buildConfigurations else { return nil } - let configs = buildConfigurationReferences - .compactMap { ref in self.pbxProj.objects.buildConfigurations[ref] } - - return configs + return buildConfigurations .compactMap { $0.buildSettings["TEST_TARGET_NAME"] as? String } .first } - guard let name = testTargetName(uiTestTarget.object) else { continue } - guard let target = self.pbxProj.objects.targets(named: name).first else { continue } + guard let name = testTargetName(uiTestTarget) else { continue } + guard let target = self.pbxProj.targets(named: name).first else { continue } - targetAttributes[uiTestTarget.reference, default: [:]].merge(["TestTargetID": target.reference]) + // FIX: Can't set in xcproj 5.0+ + targetAttributes[uiTestTarget, default: [:]].merge(["TestTargetID": target]) } - func generateTargetAttributes(_ target: ProjectTarget, targetReference: String) { + func generateTargetAttributes(_ target: ProjectTarget, pbxTarget: PBXTarget) { if !target.attributes.isEmpty { - targetAttributes[targetReference, default: [:]].merge(target.attributes) + targetAttributes[pbxTarget, default: [:]].merge(target.attributes) } func getSingleBuildSetting(_ setting: String) -> String? { let settings = project.configs.compactMap { - project.getCombinedBuildSettings(basePath: project.basePath, target: target, config: $0)[setting] as? String + project.getCombinedBuildSetting(setting, target: target, config: $0) as? String } guard settings.count == project.configs.count, let firstSetting = settings.first, @@ -378,7 +348,7 @@ public class PBXProjGenerator { func setTargetAttribute(attribute: String, buildSetting: String) { if let setting = getSingleBuildSetting(buildSetting) { - targetAttributes[targetReference, default: [:]].merge([attribute: setting]) + targetAttributes[pbxTarget, default: [:]].merge([attribute: setting]) } } @@ -387,71 +357,64 @@ public class PBXProjGenerator { } for target in project.aggregateTargets { - guard let targetReference = targetAggregateObjects[target.name]?.reference else { + guard let pbxTarget = targetAggregateObjects[target.name] else { continue } - generateTargetAttributes(target, targetReference: targetReference) + generateTargetAttributes(target, pbxTarget: pbxTarget) } for target in project.targets { - guard let targetReference = targetObjects[target.name]?.reference else { + guard let pbxTarget = targetObjects[target.name] else { continue } - generateTargetAttributes(target, targetReference: targetReference) + generateTargetAttributes(target, pbxTarget: pbxTarget) } - return targetAttributes.isEmpty ? nil : ["TargetAttributes": targetAttributes] + return targetAttributes } - func sortGroups(group: ObjectReference) { + func sortGroups(group: PBXGroup) { // sort children - let children = group.object.children - .compactMap { reference -> ObjectReference? in - guard let fileElement = pbxProj.objects.getFileElement(reference: reference) else { - return nil - } - return ObjectReference(reference: reference, object: fileElement) - } + let children = group.children .sorted { child1, child2 in - let sortOrder1 = child1.object.getSortOrder(groupSortPosition: project.options.groupSortPosition) - let sortOrder2 = child2.object.getSortOrder(groupSortPosition: project.options.groupSortPosition) + let sortOrder1 = child1.getSortOrder(groupSortPosition: project.options.groupSortPosition) + let sortOrder2 = child2.getSortOrder(groupSortPosition: project.options.groupSortPosition) - if sortOrder1 == sortOrder2 { - return child1.object.nameOrPath.localizedStandardCompare(child2.object.nameOrPath) == .orderedAscending - } else { + if sortOrder1 != sortOrder2 { return sortOrder1 < sortOrder2 + } else { + if child1.nameOrPath != child2.nameOrPath { + return child1.nameOrPath.localizedStandardCompare(child2.nameOrPath) == .orderedAscending + } else { + return child1.context ?? "" < child2.context ?? "" + } } } - group.object.children = children.map { $0.reference }.filter { $0 != group.reference } + group.children = children.filter { $0 != group } // sort sub groups - let childGroups = group.object.children.compactMap { reference -> ObjectReference? in - guard let group = pbxProj.objects.groups[reference] else { - return nil - } - return ObjectReference(reference: reference, object: group) } + let childGroups = group.children.compactMap { $0 as? PBXGroup } childGroups.forEach(sortGroups) } func generateTarget(_ target: Target) throws { - - sourceGenerator.targetName = target.name let carthageDependencies = getAllCarthageDependencies(target: target) let sourceFiles = try sourceGenerator.getAllSourceFiles(targetType: target.type, sources: target.sources) + .sorted { $0.path.lastComponent < $1.path.lastComponent } var plistPath: Path? var searchForPlist = true var anyDependencyRequiresObjCLinking = false - var dependencies: [String] = [] - var targetFrameworkBuildFiles: [String] = [] + var dependencies: [PBXTargetDependency] = [] + var targetFrameworkBuildFiles: [PBXBuildFile] = [] var frameworkBuildPaths = Set() - var copyFilesBuildPhasesFiles: [TargetSource.BuildPhase.CopyFilesSettings: [String]] = [:] - var copyFrameworksReferences: [String] = [] - var copyResourcesReferences: [String] = [] - var copyWatchReferences: [String] = [] - var extensions: [String] = [] + var copyFilesBuildPhasesFiles: [TargetSource.BuildPhase.CopyFilesSettings: [PBXBuildFile]] = [:] + var copyFrameworksReferences: [PBXBuildFile] = [] + var copyResourcesReferences: [PBXBuildFile] = [] + var copyWatchReferences: [PBXBuildFile] = [] + var extensions: [PBXBuildFile] = [] var carthageFrameworksToEmbed: [String] = [] let targetDependencies = (target.transitivelyLinkDependencies ?? project.options.transitivelyLinkDependencies) ? @@ -470,6 +433,14 @@ public class PBXProjGenerator { return ["ATTRIBUTES": embedAttributes] } + func getDependencyFrameworkSettings(dependency: Dependency) -> [String: Any]? { + var linkingAttributes: [String] = [] + if dependency.weakLink { + linkingAttributes.append("Weak") + } + return !linkingAttributes.isEmpty ? ["ATTRIBUTES": linkingAttributes] : nil + } + for dependency in targetDependencies { let embed = dependency.embed ?? target.shouldEmbedDependencies @@ -478,24 +449,21 @@ public class PBXProjGenerator { case .target: let dependencyTargetName = dependency.reference let targetDependency = generateTargetDependency(from: target.name, to: dependencyTargetName) - dependencies.append(targetDependency.reference) + dependencies.append(targetDependency) guard let dependencyTarget = project.getTarget(dependencyTargetName) else { continue } - let dependencyFileReference = targetFileReferences[dependencyTargetName]! - let dependecyLinkage = dependencyTarget.defaultLinkage let link = dependency.link ?? ( (dependecyLinkage == .dynamic && target.type != .staticLibrary) || (dependecyLinkage == .static && target.type.isExecutable) ) if link { - let dependencyBuildFile = targetBuildFiles[dependencyTargetName]! - let buildFile = createObject( - id: dependencyBuildFile.reference + target.name, - PBXBuildFile(fileRef: dependencyBuildFile.object.fileRef!) + let dependencyFile = targetFileReferences[dependencyTarget.name]! + let buildFile = addObject( + PBXBuildFile(file: dependencyFile, settings: getDependencyFrameworkSettings(dependency: dependency)) ) - targetFrameworkBuildFiles.append(buildFile.reference) + targetFrameworkBuildFiles.append(buildFile) if !anyDependencyRequiresObjCLinking && dependencyTarget.requiresObjCLinking ?? (dependencyTarget.type == .staticLibrary) { @@ -508,32 +476,31 @@ public class PBXProjGenerator { || (target.type.isTest && (dependencyTarget.type.isFramework || dependencyTarget.type == .bundle)) )) if embed { - let embedFile = createObject( - id: dependencyFileReference + target.name, + let embedFile = addObject( PBXBuildFile( - fileRef: dependencyFileReference, + file: targetFileReferences[dependencyTarget.name]!, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? !dependencyTarget.type.isExecutable) ) ) if dependencyTarget.type.isExtension { // embed app extension - extensions.append(embedFile.reference) + extensions.append(embedFile) } else if dependencyTarget.type.isFramework { - copyFrameworksReferences.append(embedFile.reference) + copyFrameworksReferences.append(embedFile) } else if dependencyTarget.type.isApp && dependencyTarget.platform == .watchOS { - copyWatchReferences.append(embedFile.reference) + copyWatchReferences.append(embedFile) } else if dependencyTarget.type == .xpcService { - copyFilesBuildPhasesFiles[.xpcServices, default: []].append(embedFile.reference) + copyFilesBuildPhasesFiles[.xpcServices, default: []].append(embedFile) } else { - copyResourcesReferences.append(embedFile.reference) + copyResourcesReferences.append(embedFile) } } case .framework: guard target.type != .staticLibrary else { break } - let fileReference: String + let fileReference: PBXFileElement if dependency.implicit { fileReference = sourceGenerator.getFileReference( path: Path(dependency.reference), @@ -547,26 +514,60 @@ public class PBXProjGenerator { ) } - let buildFile = createObject( - id: "framework" + fileReference + target.name, - PBXBuildFile(fileRef: fileReference) + let buildFile = addObject( + PBXBuildFile(file: fileReference, settings: getDependencyFrameworkSettings(dependency: dependency)) ) - targetFrameworkBuildFiles.append(buildFile.reference) + targetFrameworkBuildFiles.append(buildFile) if !frameworkFiles.contains(fileReference) { frameworkFiles.append(fileReference) } if embed { - let embedFile = createObject( - id: "framework embed" + fileReference + target.name, - PBXBuildFile(fileRef: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true)) + let embedFile = addObject( + PBXBuildFile(file: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true)) ) - copyFrameworksReferences.append(embedFile.reference) + copyFrameworksReferences.append(embedFile) } let buildPath = Path(dependency.reference).parent().string.quoted frameworkBuildPaths.insert(buildPath) + case .sdk: + + var dependencyPath = Path(dependency.reference) + if !dependency.reference.contains("/") { + switch dependencyPath.extension ?? "" { + case "framework": + dependencyPath = Path("System/Library/Frameworks") + dependencyPath + case "tbd": + dependencyPath = Path("usr/lib") + dependencyPath + default: break + } + } + + let fileReference: PBXFileReference + if let existingFileReferences = sdkFileReferences[dependency.reference] { + fileReference = existingFileReferences + } else { + fileReference = addObject( + PBXFileReference( + sourceTree: .sdkRoot, + name: dependencyPath.lastComponent, + lastKnownFileType: Xcode.fileType(path: dependencyPath), + path: dependencyPath.string + ) + ) + sdkFileReferences[dependency.reference] = fileReference + frameworkFiles.append(fileReference) + } + + let buildFile = addObject( + PBXBuildFile( + file: fileReference, + settings: getDependencyFrameworkSettings(dependency: dependency) + ) + ) + targetFrameworkBuildFiles.append(buildFile) case .carthage: guard target.type != .staticLibrary else { break } @@ -578,14 +579,14 @@ public class PBXProjGenerator { } let fileReference = sourceGenerator.getFileReference(path: frameworkPath, inPath: platformPath) - let buildFile = createObject( - id: "carthage" + fileReference + target.name, - PBXBuildFile(fileRef: fileReference) - ) - carthageFrameworksByPlatform[target.platform.carthageDirectoryName, default: []].insert(fileReference) - targetFrameworkBuildFiles.append(buildFile.reference) + if dependency.link ?? true { + let buildFile = addObject( + PBXBuildFile(file: fileReference, settings: getDependencyFrameworkSettings(dependency: dependency)) + ) + targetFrameworkBuildFiles.append(buildFile) + } // Embedding handled by iterating over `carthageDependencies` below } @@ -605,39 +606,35 @@ public class PBXProjGenerator { if embed { if directlyEmbedCarthage { - let embedFile = createObject( - id: "carthage embed" + fileReference + target.name, - PBXBuildFile(fileRef: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true)) + let embedFile = addObject( + PBXBuildFile(file: fileReference, settings: getEmbedSettings(dependency: dependency, codeSign: dependency.codeSign ?? true)) ) - copyFrameworksReferences.append(embedFile.reference) + copyFrameworksReferences.append(embedFile) } else { carthageFrameworksToEmbed.append(dependency.reference) } } } - let fileReference = targetFileReferences[target.name] - var buildPhases: [String] = [] + var buildPhases: [PBXBuildPhase] = [] - func getBuildFilesForSourceFiles(_ sourceFiles: [SourceFile]) -> [String] { - let files = sourceFiles + func getBuildFilesForSourceFiles(_ sourceFiles: [SourceFile]) -> [PBXBuildFile] { + return sourceFiles .reduce(into: [SourceFile]()) { output, sourceFile in - if !output.contains(where: { $0.fileReference == sourceFile.fileReference }) { + if !output.contains(where: { $0.fileReference === sourceFile.fileReference }) { output.append(sourceFile) } } - .sorted { $0.path.lastComponent < $1.path.lastComponent } - return files.map { createObject(id: $0.fileReference + target.name, $0.buildFile) } - .map { $0.reference } + .map { addObject($0.buildFile) } } - func getBuildFilesForPhase(_ buildPhase: BuildPhase) -> [String] { + func getBuildFilesForPhase(_ buildPhase: BuildPhase) -> [PBXBuildFile] { let filteredSourceFiles = sourceFiles .filter { $0.buildPhase?.buildPhase == buildPhase } return getBuildFilesForSourceFiles(filteredSourceFiles) } - func getBuildFilesForCopyFilesPhases() -> [TargetSource.BuildPhase.CopyFilesSettings: [String]] { + func getBuildFilesForCopyFilesPhases() -> [TargetSource.BuildPhase.CopyFilesSettings: [PBXBuildFile]] { var sourceFilesByCopyFiles: [TargetSource.BuildPhase.CopyFilesSettings: [SourceFile]] = [:] for sourceFile in sourceFiles { guard case let .copyFiles(copyFilesSettings)? = sourceFile.buildPhase else { continue } @@ -655,25 +652,28 @@ public class PBXProjGenerator { .map { generateCopyFiles(targetName: target.name, copyFiles: $0, buildPhaseFiles: $1) } let headersBuildPhaseFiles = getBuildFilesForPhase(.headers) - if !headersBuildPhaseFiles.isEmpty && (target.type == .framework || target.type == .dynamicLibrary) { - let headersBuildPhase = createObject(id: target.name, PBXHeadersBuildPhase(files: headersBuildPhaseFiles)) - buildPhases.append(headersBuildPhase.reference) + if !headersBuildPhaseFiles.isEmpty { + if target.type == .framework || target.type == .dynamicLibrary { + let headersBuildPhase = addObject(PBXHeadersBuildPhase(files: headersBuildPhaseFiles)) + buildPhases.append(headersBuildPhase) + } else { + headersBuildPhaseFiles.forEach { pbxProj.delete(object: $0) } + } } let sourcesBuildPhaseFiles = getBuildFilesForPhase(.sources) - let sourcesBuildPhase = createObject(id: target.name, PBXSourcesBuildPhase(files: sourcesBuildPhaseFiles)) - buildPhases.append(sourcesBuildPhase.reference) + let sourcesBuildPhase = addObject(PBXSourcesBuildPhase(files: sourcesBuildPhaseFiles)) + buildPhases.append(sourcesBuildPhase) buildPhases += try target.postCompileScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) } let resourcesBuildPhaseFiles = getBuildFilesForPhase(.resources) + copyResourcesReferences if !resourcesBuildPhaseFiles.isEmpty { - let resourcesBuildPhase = createObject(id: target.name, PBXResourcesBuildPhase(files: resourcesBuildPhaseFiles)) - buildPhases.append(resourcesBuildPhase.reference) + let resourcesBuildPhase = addObject(PBXResourcesBuildPhase(files: resourcesBuildPhaseFiles)) + buildPhases.append(resourcesBuildPhase) } - let buildSettings = project.getCombinedBuildSettings(basePath: project.basePath, target: target, config: project.configs[0]) - let swiftObjCInterfaceHeader = buildSettings["SWIFT_OBJC_INTERFACE_HEADER_NAME"] as? String + let swiftObjCInterfaceHeader = project.getCombinedBuildSetting("SWIFT_OBJC_INTERFACE_HEADER_NAME", target: target, config: project.configs[0]) as? String if target.type == .staticLibrary && swiftObjCInterfaceHeader != "" @@ -681,10 +681,8 @@ public class PBXProjGenerator { let inputPaths = ["$(DERIVED_SOURCES_DIR)/$(SWIFT_OBJC_INTERFACE_HEADER_NAME)"] let outputPaths = ["$(BUILT_PRODUCTS_DIR)/include/$(PRODUCT_MODULE_NAME)/$(SWIFT_OBJC_INTERFACE_HEADER_NAME)"] - let script = createObject( - id: "Swift.h" + target.name, + let script = addObject( PBXShellScriptBuildPhase( - files: [], name: "Copy Swift Objective-C Interface Header", inputPaths: inputPaths, outputPaths: outputPaths, @@ -692,7 +690,7 @@ public class PBXProjGenerator { shellScript: "ditto \"${SCRIPT_INPUT_FILE_0}\" \"${SCRIPT_OUTPUT_FILE_0}\"\n" ) ) - buildPhases.append(script.reference) + buildPhases.append(script) } buildPhases += copyFilesBuildPhasesFiles @@ -700,15 +698,14 @@ public class PBXProjGenerator { .map { generateCopyFiles(targetName: target.name, copyFiles: $0, buildPhaseFiles: $1) } if !carthageFrameworksToEmbed.isEmpty { + let inputPaths = carthageFrameworksToEmbed .map { "$(SRCROOT)/\(carthageBuildPath)/\(target.platform)/\($0)\($0.contains(".") ? "" : ".framework")" } let outputPaths = carthageFrameworksToEmbed .map { "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/\($0)\($0.contains(".") ? "" : ".framework")" } let carthageExecutable = project.options.carthageExecutablePath ?? "carthage" - let carthageScript = createObject( - id: "Carthage" + target.name, + let carthageScript = addObject( PBXShellScriptBuildPhase( - files: [], name: "Carthage", inputPaths: inputPaths, outputPaths: outputPaths, @@ -716,22 +713,20 @@ public class PBXProjGenerator { shellScript: "\(carthageExecutable) copy-frameworks\n" ) ) - buildPhases.append(carthageScript.reference) + buildPhases.append(carthageScript) } if !targetFrameworkBuildFiles.isEmpty { - let frameworkBuildPhase = createObject( - id: target.name, + let frameworkBuildPhase = addObject( PBXFrameworksBuildPhase(files: targetFrameworkBuildFiles) ) - buildPhases.append(frameworkBuildPhase.reference) + buildPhases.append(frameworkBuildPhase) } if !extensions.isEmpty { - let copyFilesPhase = createObject( - id: "embed app extensions" + target.name, + let copyFilesPhase = addObject( PBXCopyFilesBuildPhase( dstPath: "", dstSubfolderSpec: .plugins, @@ -740,14 +735,13 @@ public class PBXProjGenerator { ) ) - buildPhases.append(copyFilesPhase.reference) + buildPhases.append(copyFilesPhase) } copyFrameworksReferences += getBuildFilesForPhase(.frameworks) if !copyFrameworksReferences.isEmpty { - let copyFilesPhase = createObject( - id: "embed frameworks" + target.name, + let copyFilesPhase = addObject( PBXCopyFilesBuildPhase( dstPath: "", dstSubfolderSpec: .frameworks, @@ -756,13 +750,12 @@ public class PBXProjGenerator { ) ) - buildPhases.append(copyFilesPhase.reference) + buildPhases.append(copyFilesPhase) } if !copyWatchReferences.isEmpty { - let copyFilesPhase = createObject( - id: "embed watch content" + target.name, + let copyFilesPhase = addObject( PBXCopyFilesBuildPhase( dstPath: "$(CONTENTS_FOLDER_PATH)/Watch", dstSubfolderSpec: .productsDirectory, @@ -771,12 +764,11 @@ public class PBXProjGenerator { ) ) - buildPhases.append(copyFilesPhase.reference) + buildPhases.append(copyFilesPhase) } let buildRules = target.buildRules.map { buildRule in - createObject( - id: "\(target.name)-\(buildRule.action)-\(buildRule.fileType)", + addObject( PBXBuildRule( compilerSpec: buildRule.action.compilerSpec, fileType: buildRule.fileType.fileType, @@ -787,16 +779,23 @@ public class PBXProjGenerator { outputFilesCompilerFlags: buildRule.outputFilesCompilerFlags, script: buildRule.action.script ) - ).reference + ) } buildPhases += try target.postBuildScripts.map { try generateBuildScript(targetName: target.name, buildScript: $0) } - let configs: [ObjectReference] = project.configs.map { config in + let configs: [XCBuildConfiguration] = project.configs.map { config in var buildSettings = project.getTargetBuildSettings(target: target, config: config) - // automatically set INFOPLIST_FILE path - if !project.targetHasBuildSetting("INFOPLIST_FILE", basePath: project.basePath, target: target, config: config) { + // Set CODE_SIGN_ENTITLEMENTS + if let entitlements = target.entitlements { + buildSettings["CODE_SIGN_ENTITLEMENTS"] = entitlements.path + } + + // Set INFOPLIST_FILE + if let info = target.info { + buildSettings["INFOPLIST_FILE"] = info.path + } else if !project.targetHasBuildSetting("INFOPLIST_FILE", target: target, config: config) { if searchForPlist { plistPath = getInfoPlist(target.sources) searchForPlist = false @@ -808,7 +807,7 @@ public class PBXProjGenerator { // automatically calculate bundle id if let bundleIdPrefix = project.options.bundleIdPrefix, - !project.targetHasBuildSetting("PRODUCT_BUNDLE_IDENTIFIER", basePath: project.basePath, target: target, config: config) { + !project.targetHasBuildSetting("PRODUCT_BUNDLE_IDENTIFIER", target: target, config: config) { let characterSet = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "-.")).inverted let escapedTargetName = target.name .replacingOccurrences(of: "_", with: "-") @@ -819,7 +818,7 @@ public class PBXProjGenerator { // automatically set test target name if target.type == .uiTestBundle, - !project.targetHasBuildSetting("TEST_TARGET_NAME", basePath: project.basePath, target: target, config: config) { + !project.targetHasBuildSetting("TEST_TARGET_NAME", target: target, config: config) { for dependency in target.dependencies { if dependency.type == .target, let dependencyTarget = project.getTarget(dependency.reference), @@ -866,32 +865,35 @@ public class PBXProjGenerator { } } - var baseConfigurationReference: String? - if let configPath = target.configFiles[config.name] { - baseConfigurationReference = sourceGenerator.getContainedFileReference(path: project.basePath + configPath) + var baseConfiguration: PBXFileReference? + if let configPath = target.configFiles[config.name], + let fileReference = sourceGenerator.getContainedFileReference(path: project.basePath + configPath) as? PBXFileReference { + baseConfiguration = fileReference } let buildConfig = XCBuildConfiguration( name: config.name, - baseConfigurationReference: baseConfigurationReference, buildSettings: buildSettings ) - return createObject(id: config.name + target.name, buildConfig) + buildConfig.baseConfiguration = baseConfiguration + return addObject(buildConfig) } - let buildConfigList = createObject(id: target.name, XCConfigurationList( - buildConfigurations: configs.map { $0.reference }, + let buildConfigList = addObject(XCConfigurationList( + buildConfigurations: configs, defaultConfigurationName: "" )) - let targetObject = targetObjects[target.name]!.object + let targetObject = targetObjects[target.name]! + + let targetFileReference = targetFileReferences[target.name] targetObject.name = target.name - targetObject.buildConfigurationList = buildConfigList.reference + targetObject.buildConfigurationList = buildConfigList targetObject.buildPhases = buildPhases targetObject.dependencies = dependencies targetObject.productName = target.name targetObject.buildRules = buildRules - targetObject.productReference = fileReference + targetObject.product = targetFileReference if !target.isLegacy { targetObject.productType = target.type } @@ -933,7 +935,7 @@ public class PBXProjGenerator { if let target = projectTarget as? Target { for dependency in target.dependencies { // don't overwrite frameworks, to allow top level ones to rule - if frameworks.contains(reference: dependency.reference) { + if frameworks[dependency.reference] != nil { continue } @@ -977,13 +979,15 @@ public class PBXProjGenerator { for dependency in target.dependencies { // don't overwrite dependencies, to allow top level ones to rule - if dependencies.contains(reference: dependency.reference) { + if dependencies[dependency.reference] != nil { continue } // don't want a dependency if it's going to be embedded or statically linked in a non-top level target // in .target check we filter out targets that will embed all of their dependencies switch dependency.type { + case .sdk: + dependencies[dependency.reference] = dependency case .framework, .carthage: if isTopLevel || dependency.embed == nil { dependencies[dependency.reference] = dependency diff --git a/Sources/XcodeGenKit/ProjectGenerator.swift b/Sources/XcodeGenKit/ProjectGenerator.swift index c1c70f58..7ee145d9 100644 --- a/Sources/XcodeGenKit/ProjectGenerator.swift +++ b/Sources/XcodeGenKit/ProjectGenerator.swift @@ -2,7 +2,7 @@ import Foundation import JSONUtilities import PathKit import ProjectSpec -import xcproj +import xcodeproj import Yams public class ProjectGenerator { @@ -13,21 +13,21 @@ public class ProjectGenerator { self.project = project } - var defaultDebugConfig: Config { - return project.configs.first { $0.type == .debug }! - } - - var defaultReleaseConfig: Config { - return project.configs.first { $0.type == .release }! - } - public func generateXcodeProject() throws -> XcodeProj { - try project.validate() + + // generate PBXProj let pbxProjGenerator = PBXProjGenerator(project: project) - let pbxProject = try pbxProjGenerator.generate() + let pbxProj = try pbxProjGenerator.generate() + + // generate Schemes + let schemeGenerator = SchemeGenerator(project: project, pbxProj: pbxProj) + let schemes = try schemeGenerator.generateSchemes() + + // generate Workspace let workspace = try generateWorkspace() - let sharedData = try generateSharedData(pbxProject: pbxProject) - return XcodeProj(workspace: workspace, pbxproj: pbxProject, sharedData: sharedData) + + let sharedData = XCSharedData(schemes: schemes) + return XcodeProj(workspace: workspace, pbxproj: pbxProj, sharedData: sharedData) } func generateWorkspace() throws -> XCWorkspace { @@ -35,219 +35,4 @@ public class ProjectGenerator { let workspaceData = XCWorkspaceData(children: [dataElement]) return XCWorkspace(data: workspaceData) } - - func generateScheme(_ scheme: Scheme, pbxProject: PBXProj) throws -> XCScheme { - - func getBuildEntry(_ buildTarget: Scheme.BuildTarget) -> XCScheme.BuildAction.Entry { - - guard let targetReference = pbxProject.objects.targets(named: buildTarget.target).first else { - fatalError("Unable to find target named \"\(buildTarget.target)\" in \"PBXProj.objects.targets\"") - } - - guard let buildableName = - project.getTarget(buildTarget.target)?.filename ?? - project.getAggregateTarget(buildTarget.target)?.name else { - fatalError("Unable to determinate \"buildableName\" for build target: \(buildTarget.target)") - } - let buildableReference = XCScheme.BuildableReference( - referencedContainer: "container:\(project.name).xcodeproj", - blueprintIdentifier: targetReference.reference, - buildableName: buildableName, - blueprintName: buildTarget.target - ) - return XCScheme.BuildAction.Entry(buildableReference: buildableReference, buildFor: buildTarget.buildTypes) - } - - let testTargetNames = scheme.test?.targets ?? [] - let testBuildTargets = testTargetNames.map { - Scheme.BuildTarget(target: $0, buildTypes: BuildType.testOnly) - } - - let testBuildTargetEntries = testBuildTargets.map(getBuildEntry) - - let buildActionEntries: [XCScheme.BuildAction.Entry] = scheme.build.targets.map(getBuildEntry) - - func getExecutionAction(_ action: Scheme.ExecutionAction) -> XCScheme.ExecutionAction { - // ExecutionActions can require the use of build settings. Xcode allows the settings to come from a build or test target. - let environmentBuildable = action.settingsTarget.flatMap { settingsTarget in - return (buildActionEntries + testBuildTargetEntries) - .first { settingsTarget == $0.buildableReference.blueprintName }? - .buildableReference - } - return XCScheme.ExecutionAction(scriptText: action.script, title: action.name, environmentBuildable: environmentBuildable) - } - - let target = project.getTarget(scheme.build.targets.first!.target) - let shouldExecuteOnLaunch = target?.type.isExecutable == true - - let buildableReference = buildActionEntries.first!.buildableReference - let productRunable = XCScheme.BuildableProductRunnable(buildableReference: buildableReference) - - let buildAction = XCScheme.BuildAction( - buildActionEntries: buildActionEntries, - preActions: scheme.build.preActions.map(getExecutionAction), - postActions: scheme.build.postActions.map(getExecutionAction), - parallelizeBuild: scheme.build.parallelizeBuild, - buildImplicitDependencies: scheme.build.buildImplicitDependencies - ) - - let testables = testBuildTargetEntries.map { - XCScheme.TestableReference(skipped: false, buildableReference: $0.buildableReference) - } - - let testCommandLineArgs = scheme.test.map { XCScheme.CommandLineArguments($0.commandLineArguments) } - let launchCommandLineArgs = scheme.run.map { XCScheme.CommandLineArguments($0.commandLineArguments) } - let profileCommandLineArgs = scheme.profile.map { XCScheme.CommandLineArguments($0.commandLineArguments) } - - let testVariables = scheme.test.flatMap { $0.environmentVariables.isEmpty ? nil : $0.environmentVariables } - let launchVariables = scheme.run.flatMap { $0.environmentVariables.isEmpty ? nil : $0.environmentVariables } - let profileVariables = scheme.profile.flatMap { $0.environmentVariables.isEmpty ? nil : $0.environmentVariables } - - let testAction = XCScheme.TestAction( - buildConfiguration: scheme.test?.config ?? defaultDebugConfig.name, - macroExpansion: buildableReference, - testables: testables, - preActions: scheme.test?.preActions.map(getExecutionAction) ?? [], - postActions: scheme.test?.postActions.map(getExecutionAction) ?? [], - shouldUseLaunchSchemeArgsEnv: scheme.test?.shouldUseLaunchSchemeArgsEnv ?? true, - codeCoverageEnabled: scheme.test?.gatherCoverageData ?? false, - commandlineArguments: testCommandLineArgs, - environmentVariables: testVariables - ) - - let launchAction = XCScheme.LaunchAction( - buildableProductRunnable: shouldExecuteOnLaunch ? productRunable : nil, - buildConfiguration: scheme.run?.config ?? defaultDebugConfig.name, - preActions: scheme.run?.preActions.map(getExecutionAction) ?? [], - postActions: scheme.run?.postActions.map(getExecutionAction) ?? [], - macroExpansion: shouldExecuteOnLaunch ? nil : buildableReference, - commandlineArguments: launchCommandLineArgs, - environmentVariables: launchVariables - ) - - let profileAction = XCScheme.ProfileAction( - buildableProductRunnable: productRunable, - buildConfiguration: scheme.profile?.config ?? defaultReleaseConfig.name, - preActions: scheme.profile?.preActions.map(getExecutionAction) ?? [], - postActions: scheme.profile?.postActions.map(getExecutionAction) ?? [], - shouldUseLaunchSchemeArgsEnv: scheme.profile?.shouldUseLaunchSchemeArgsEnv ?? true, - commandlineArguments: profileCommandLineArgs, - environmentVariables: profileVariables - ) - - let analyzeAction = XCScheme.AnalyzeAction(buildConfiguration: scheme.analyze?.config ?? defaultDebugConfig.name) - - let archiveAction = XCScheme.ArchiveAction( - buildConfiguration: scheme.archive?.config ?? defaultReleaseConfig.name, - revealArchiveInOrganizer: scheme.archive?.revealArchiveInOrganizer ?? true, - customArchiveName: scheme.archive?.customArchiveName, - preActions: scheme.archive?.preActions.map(getExecutionAction) ?? [], - postActions: scheme.archive?.postActions.map(getExecutionAction) ?? [] - ) - - return XCScheme( - name: scheme.name, - lastUpgradeVersion: project.xcodeVersion, - version: project.schemeVersion, - buildAction: buildAction, - testAction: testAction, - launchAction: launchAction, - profileAction: profileAction, - analyzeAction: analyzeAction, - archiveAction: archiveAction - ) - } - - func generateSharedData(pbxProject: PBXProj) throws -> XCSharedData { - var xcschemes: [XCScheme] = [] - - for scheme in project.schemes { - let xcscheme = try generateScheme(scheme, pbxProject: pbxProject) - xcschemes.append(xcscheme) - } - - for target in project.targets { - if let targetScheme = target.scheme { - - if targetScheme.configVariants.isEmpty { - let schemeName = target.name - - let debugConfig = project.configs.first { $0.type == .debug }! - let releaseConfig = project.configs.first { $0.type == .release }! - - let scheme = Scheme( - name: schemeName, - target: target, - targetScheme: targetScheme, - debugConfig: debugConfig.name, - releaseConfig: releaseConfig.name - ) - let xcscheme = try generateScheme(scheme, pbxProject: pbxProject) - xcschemes.append(xcscheme) - } else { - for configVariant in targetScheme.configVariants { - - let schemeName = "\(target.name) \(configVariant)" - - let debugConfig = project.configs - .first { $0.type == .debug && $0.name.contains(configVariant) }! - let releaseConfig = project.configs - .first { $0.type == .release && $0.name.contains(configVariant) }! - - let scheme = Scheme( - name: schemeName, - target: target, - targetScheme: targetScheme, - debugConfig: debugConfig.name, - releaseConfig: releaseConfig.name - ) - let xcscheme = try generateScheme(scheme, pbxProject: pbxProject) - xcschemes.append(xcscheme) - } - } - } - } - - return XCSharedData(schemes: xcschemes) - } -} - -extension Scheme { - public init(name: String, target: Target, targetScheme: TargetScheme, debugConfig: String, releaseConfig: String) { - self.init( - name: name, - build: .init(targets: [Scheme.BuildTarget(target: target.name)]), - run: .init( - config: debugConfig, - commandLineArguments: targetScheme.commandLineArguments, - preActions: targetScheme.preActions, - postActions: targetScheme.postActions, - environmentVariables: targetScheme.environmentVariables - ), - test: .init( - config: debugConfig, - gatherCoverageData: targetScheme.gatherCoverageData, - commandLineArguments: targetScheme.commandLineArguments, - targets: targetScheme.testTargets, - preActions: targetScheme.preActions, - postActions: targetScheme.postActions, - environmentVariables: targetScheme.environmentVariables - ), - profile: .init( - config: releaseConfig, - commandLineArguments: targetScheme.commandLineArguments, - preActions: targetScheme.preActions, - postActions: targetScheme.postActions, - environmentVariables: targetScheme.environmentVariables - ), - analyze: .init( - config: debugConfig - ), - archive: .init( - config: releaseConfig, - preActions: targetScheme.preActions, - postActions: targetScheme.postActions - ) - ) - } } diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift new file mode 100644 index 00000000..fb1b021d --- /dev/null +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -0,0 +1,242 @@ +import Foundation +import ProjectSpec +import xcodeproj + +public class SchemeGenerator { + + let project: Project + let pbxProj: PBXProj + + var defaultDebugConfig: Config { + return project.configs.first { $0.type == .debug }! + } + + var defaultReleaseConfig: Config { + return project.configs.first { $0.type == .release }! + } + + public init(project: Project, pbxProj: PBXProj) { + self.project = project + self.pbxProj = pbxProj + } + + public func generateSchemes() throws -> [XCScheme] { + var xcschemes: [XCScheme] = [] + + for scheme in project.schemes { + let xcscheme = try generateScheme(scheme) + xcschemes.append(xcscheme) + } + + for target in project.targets { + if let targetScheme = target.scheme { + + if targetScheme.configVariants.isEmpty { + let schemeName = target.name + + let debugConfig = project.configs.first { $0.type == .debug }! + let releaseConfig = project.configs.first { $0.type == .release }! + + let scheme = Scheme( + name: schemeName, + target: target, + targetScheme: targetScheme, + debugConfig: debugConfig.name, + releaseConfig: releaseConfig.name + ) + let xcscheme = try generateScheme(scheme) + xcschemes.append(xcscheme) + } else { + for configVariant in targetScheme.configVariants { + + let schemeName = "\(target.name) \(configVariant)" + + let debugConfig = project.configs + .first { $0.type == .debug && $0.name.contains(configVariant) }! + let releaseConfig = project.configs + .first { $0.type == .release && $0.name.contains(configVariant) }! + + let scheme = Scheme( + name: schemeName, + target: target, + targetScheme: targetScheme, + debugConfig: debugConfig.name, + releaseConfig: releaseConfig.name + ) + let xcscheme = try generateScheme(scheme) + xcschemes.append(xcscheme) + } + } + } + } + + return xcschemes + } + + public func generateScheme(_ scheme: Scheme) throws -> XCScheme { + + func getBuildEntry(_ buildTarget: Scheme.BuildTarget) -> XCScheme.BuildAction.Entry { + + guard let pbxTarget = pbxProj.targets(named: buildTarget.target).first else { + fatalError("Unable to find target named \"\(buildTarget.target)\" in \"PBXProj.targets\"") + } + + guard let buildableName = + project.getTarget(buildTarget.target)?.filename ?? + project.getAggregateTarget(buildTarget.target)?.name else { + fatalError("Unable to determinate \"buildableName\" for build target: \(buildTarget.target)") + } + let buildableReference = XCScheme.BuildableReference( + referencedContainer: "container:\(project.name).xcodeproj", + blueprint: pbxTarget, + buildableName: buildableName, + blueprintName: buildTarget.target + ) + return XCScheme.BuildAction.Entry(buildableReference: buildableReference, buildFor: buildTarget.buildTypes) + } + + let testTargets = scheme.test?.targets ?? [] + let testBuildTargets = testTargets.map { + Scheme.BuildTarget(target: $0.name, buildTypes: BuildType.testOnly) + } + + let testBuildTargetEntries = testBuildTargets.map(getBuildEntry) + + let buildActionEntries: [XCScheme.BuildAction.Entry] = scheme.build.targets.map(getBuildEntry) + + func getExecutionAction(_ action: Scheme.ExecutionAction) -> XCScheme.ExecutionAction { + // ExecutionActions can require the use of build settings. Xcode allows the settings to come from a build or test target. + let environmentBuildable = action.settingsTarget.flatMap { settingsTarget in + return (buildActionEntries + testBuildTargetEntries) + .first { settingsTarget == $0.buildableReference.blueprintName }? + .buildableReference + } + return XCScheme.ExecutionAction(scriptText: action.script, title: action.name, environmentBuildable: environmentBuildable) + } + + let target = project.getTarget(scheme.build.targets.first!.target) + let shouldExecuteOnLaunch = target?.type.isExecutable == true + + let buildableReference = buildActionEntries.first!.buildableReference + let productRunable = XCScheme.BuildableProductRunnable(buildableReference: buildableReference) + + let buildAction = XCScheme.BuildAction( + buildActionEntries: buildActionEntries, + preActions: scheme.build.preActions.map(getExecutionAction), + postActions: scheme.build.postActions.map(getExecutionAction), + parallelizeBuild: scheme.build.parallelizeBuild, + buildImplicitDependencies: scheme.build.buildImplicitDependencies + ) + + let testables = zip(testTargets, testBuildTargetEntries).map { testTarget, testBuilEntries in + XCScheme.TestableReference( + skipped: false, + parallelizable: testTarget.parallelizable, + randomExecutionOrdering: testTarget.randomExecutionOrder, + buildableReference: testBuilEntries.buildableReference + ) + } + + let testCommandLineArgs = scheme.test.map { XCScheme.CommandLineArguments($0.commandLineArguments) } + let launchCommandLineArgs = scheme.run.map { XCScheme.CommandLineArguments($0.commandLineArguments) } + let profileCommandLineArgs = scheme.profile.map { XCScheme.CommandLineArguments($0.commandLineArguments) } + + let testVariables = scheme.test.flatMap { $0.environmentVariables.isEmpty ? nil : $0.environmentVariables } + let launchVariables = scheme.run.flatMap { $0.environmentVariables.isEmpty ? nil : $0.environmentVariables } + let profileVariables = scheme.profile.flatMap { $0.environmentVariables.isEmpty ? nil : $0.environmentVariables } + + let testAction = XCScheme.TestAction( + buildConfiguration: scheme.test?.config ?? defaultDebugConfig.name, + macroExpansion: buildableReference, + testables: testables, + preActions: scheme.test?.preActions.map(getExecutionAction) ?? [], + postActions: scheme.test?.postActions.map(getExecutionAction) ?? [], + shouldUseLaunchSchemeArgsEnv: scheme.test?.shouldUseLaunchSchemeArgsEnv ?? true, + codeCoverageEnabled: scheme.test?.gatherCoverageData ?? false, + commandlineArguments: testCommandLineArgs, + environmentVariables: testVariables + ) + + let launchAction = XCScheme.LaunchAction( + buildableProductRunnable: shouldExecuteOnLaunch ? productRunable : nil, + buildConfiguration: scheme.run?.config ?? defaultDebugConfig.name, + preActions: scheme.run?.preActions.map(getExecutionAction) ?? [], + postActions: scheme.run?.postActions.map(getExecutionAction) ?? [], + macroExpansion: shouldExecuteOnLaunch ? nil : buildableReference, + commandlineArguments: launchCommandLineArgs, + environmentVariables: launchVariables + ) + + let profileAction = XCScheme.ProfileAction( + buildableProductRunnable: productRunable, + buildConfiguration: scheme.profile?.config ?? defaultReleaseConfig.name, + preActions: scheme.profile?.preActions.map(getExecutionAction) ?? [], + postActions: scheme.profile?.postActions.map(getExecutionAction) ?? [], + shouldUseLaunchSchemeArgsEnv: scheme.profile?.shouldUseLaunchSchemeArgsEnv ?? true, + commandlineArguments: profileCommandLineArgs, + environmentVariables: profileVariables + ) + + let analyzeAction = XCScheme.AnalyzeAction(buildConfiguration: scheme.analyze?.config ?? defaultDebugConfig.name) + + let archiveAction = XCScheme.ArchiveAction( + buildConfiguration: scheme.archive?.config ?? defaultReleaseConfig.name, + revealArchiveInOrganizer: scheme.archive?.revealArchiveInOrganizer ?? true, + customArchiveName: scheme.archive?.customArchiveName, + preActions: scheme.archive?.preActions.map(getExecutionAction) ?? [], + postActions: scheme.archive?.postActions.map(getExecutionAction) ?? [] + ) + + return XCScheme( + name: scheme.name, + lastUpgradeVersion: project.xcodeVersion, + version: project.schemeVersion, + buildAction: buildAction, + testAction: testAction, + launchAction: launchAction, + profileAction: profileAction, + analyzeAction: analyzeAction, + archiveAction: archiveAction + ) + } +} + +extension Scheme { + public init(name: String, target: Target, targetScheme: TargetScheme, debugConfig: String, releaseConfig: String) { + self.init( + name: name, + build: .init(targets: [Scheme.BuildTarget(target: target.name)]), + run: .init( + config: debugConfig, + commandLineArguments: targetScheme.commandLineArguments, + preActions: targetScheme.preActions, + postActions: targetScheme.postActions, + environmentVariables: targetScheme.environmentVariables + ), + test: .init( + config: debugConfig, + gatherCoverageData: targetScheme.gatherCoverageData, + commandLineArguments: targetScheme.commandLineArguments, + targets: targetScheme.testTargets, + preActions: targetScheme.preActions, + postActions: targetScheme.postActions, + environmentVariables: targetScheme.environmentVariables + ), + profile: .init( + config: releaseConfig, + commandLineArguments: targetScheme.commandLineArguments, + preActions: targetScheme.preActions, + postActions: targetScheme.postActions, + environmentVariables: targetScheme.environmentVariables + ), + analyze: .init( + config: debugConfig + ), + archive: .init( + config: releaseConfig, + preActions: targetScheme.preActions, + postActions: targetScheme.postActions + ) + ) + } +} diff --git a/Sources/XcodeGenKit/SettingsBuilder.swift b/Sources/XcodeGenKit/SettingsBuilder.swift index c5974e9f..5415d839 100644 --- a/Sources/XcodeGenKit/SettingsBuilder.swift +++ b/Sources/XcodeGenKit/SettingsBuilder.swift @@ -2,7 +2,7 @@ import Foundation import JSONUtilities import PathKit import ProjectSpec -import xcproj +import xcodeproj import Yams extension Project { @@ -10,6 +10,15 @@ extension Project { public func getProjectBuildSettings(config: Config) -> BuildSettings { var buildSettings: BuildSettings = [:] + // set project SDKROOT is a single platform + if targets.count > 0 { + let platforms = Dictionary(grouping: targets) { $0.platform } + if platforms.count == 1 { + let platform = platforms.first!.key + buildSettings["SDKROOT"] = platform.sdkRoot + } + } + if let type = config.type, options.settingPresets.applyProject { buildSettings += SettingsPresetFile.base.getBuildSettings() buildSettings += SettingsPresetFile.config(type).getBuildSettings() @@ -81,31 +90,27 @@ extension Project { } // combines all levels of a target's settings: target, target config, project, project config - public func getCombinedBuildSettings(basePath: Path, target: ProjectTarget, config: Config, includeProject: Bool = true) -> BuildSettings { - var buildSettings: BuildSettings = [:] - if includeProject { - if let configFilePath = configFiles[config.name] { - buildSettings += loadConfigFileBuildSettings(path: configFilePath) - } - buildSettings += getProjectBuildSettings(config: config) + public func getCombinedBuildSetting(_ setting: String, target: ProjectTarget, config: Config) -> Any? { + if let target = target as? Target, + let value = getTargetBuildSettings(target: target, config: config)[setting] { + return value } - if let configFilePath = target.configFiles[config.name] { - buildSettings += loadConfigFileBuildSettings(path: configFilePath) + if let configFilePath = target.configFiles[config.name], + let value = loadConfigFileBuildSettings(path: configFilePath)?[setting] { + return value } - if let target = target as? Target { - buildSettings += getTargetBuildSettings(target: target, config: config) + if let value = getProjectBuildSettings(config: config)[setting] { + return value } - return buildSettings + if let configFilePath = configFiles[config.name], + let value = loadConfigFileBuildSettings(path: configFilePath)?[setting] { + return value + } + return nil } - public func targetHasBuildSetting(_ setting: String, basePath: Path, target: Target, config: Config, includeProject: Bool = true) -> Bool { - let buildSettings = getCombinedBuildSettings( - basePath: basePath, - target: target, - config: config, - includeProject: includeProject - ) - return buildSettings[setting] != nil + public func targetHasBuildSetting(_ setting: String, target: Target, config: Config) -> Bool { + return getCombinedBuildSetting(setting, target: target, config: config) != nil } /// Removes values from build settings if they are defined in an xcconfig file @@ -126,28 +131,43 @@ extension Project { /// Returns cached build settings from a config file private func loadConfigFileBuildSettings(path: String) -> BuildSettings? { let configFilePath = basePath + path - if let settings = configFileSettings[configFilePath.string] { - return settings + if let cached = configFileSettings[configFilePath.string] { + return cached.value } else { - guard let configFile = try? XCConfig(path: configFilePath) else { return nil } + guard let configFile = try? XCConfig(path: configFilePath) else { + configFileSettings[configFilePath.string] = .nothing + return nil + } let settings = configFile.flattenedBuildSettings() - configFileSettings[configFilePath.string] = settings + configFileSettings[configFilePath.string] = .cached(settings) return settings } } } +private enum Cached { + case cached(T) + case nothing + + var value: T? { + switch self { + case let .cached(value): return value + case .nothing: return nil + } + } +} + // cached flattened xcconfig file settings -private var configFileSettings: [String: BuildSettings] = [:] +private var configFileSettings: [String: Cached] = [:] // cached setting preset settings -private var settingPresetSettings: [String: BuildSettings] = [:] +private var settingPresetSettings: [String: Cached] = [:] extension SettingsPresetFile { public func getBuildSettings() -> BuildSettings? { - if let group = settingPresetSettings[path] { - return group + if let cached = settingPresetSettings[path] { + return cached.value } let bundlePath = Path(Bundle.main.bundlePath) let relativePath = Path("SettingPresets/\(path).yml") @@ -171,6 +191,7 @@ extension SettingsPresetFile { case .product, .productPlatform: break } + settingPresetSettings[path] = .nothing return nil } @@ -178,7 +199,7 @@ extension SettingsPresetFile { print("Error parsing \"\(name)\" settings") return nil } - settingPresetSettings[path] = buildSettings + settingPresetSettings[path] = .cached(buildSettings) return buildSettings } } diff --git a/Sources/XcodeGenKit/SettingsPresetFile.swift b/Sources/XcodeGenKit/SettingsPresetFile.swift index 4fa276b3..5122bc96 100644 --- a/Sources/XcodeGenKit/SettingsPresetFile.swift +++ b/Sources/XcodeGenKit/SettingsPresetFile.swift @@ -1,6 +1,6 @@ import Foundation import ProjectSpec -import xcproj +import xcodeproj public enum SettingsPresetFile { case config(ConfigType) diff --git a/Sources/XcodeGenKit/SourceGenerator.swift b/Sources/XcodeGenKit/SourceGenerator.swift index 12709f61..5ee4ac9d 100644 --- a/Sources/XcodeGenKit/SourceGenerator.swift +++ b/Sources/XcodeGenKit/SourceGenerator.swift @@ -1,45 +1,41 @@ import Foundation import PathKit import ProjectSpec -import xcproj +import xcodeproj struct SourceFile { let path: Path - let fileReference: String + let fileReference: PBXFileElement let buildFile: PBXBuildFile let buildPhase: TargetSource.BuildPhase? } class SourceGenerator { - var rootGroups: Set = [] - private var fileReferencesByPath: [String: String] = [:] - private var groupsByPath: [Path: ObjectReference] = [:] - private var variantGroupsByPath: [Path: ObjectReference] = [:] + var rootGroups: Set = [] + private var fileReferencesByPath: [String: PBXFileElement] = [:] + private var groupsByPath: [Path: PBXGroup] = [:] + private var variantGroupsByPath: [Path: PBXVariantGroup] = [:] private let project: Project - var addObjectClosure: (String, PBXObject) -> String + let pbxProj: PBXProj + var targetSourceExcludePaths: Set = [] var defaultExcludedFiles = [ ".DS_Store", ] - var targetName: String = "" - private(set) var knownRegions: Set = [] - init(project: Project, addObjectClosure: @escaping (String, PBXObject) -> String) { + init(project: Project, pbxProj: PBXProj) { self.project = project - self.addObjectClosure = addObjectClosure + self.pbxProj = pbxProj } - func addObject(id: String, _ object: PBXObject) -> String { - return addObjectClosure(id, object) - } - - func createObject(id: String, _ object: T) -> ObjectReference { - let reference = addObject(id: id, object) - return ObjectReference(reference: reference, object: object) + func addObject(_ object: T, context: String? = nil) -> T { + pbxProj.add(object: object) + object.context = context + return object } func getAllSourceFiles(targetType: PBXProductType, sources: [TargetSource]) throws -> [SourceFile] { @@ -91,7 +87,7 @@ class SourceGenerator { settings["COMPILER_FLAGS"] = targetSource.compilerFlags.joined(separator: " ") } - let buildFile = PBXBuildFile(fileRef: fileReference, settings: settings.isEmpty ? nil : settings) + let buildFile = PBXBuildFile(file: fileReference, settings: settings.isEmpty ? nil : settings) return SourceFile( path: path, fileReference: fileReference, @@ -100,7 +96,7 @@ class SourceGenerator { ) } - func getContainedFileReference(path: Path) -> String { + func getContainedFileReference(path: Path) -> PBXFileElement { let createIntermediateGroups = project.options.createIntermediateGroups let parentPath = path.parent() @@ -113,12 +109,12 @@ class SourceGenerator { ) if createIntermediateGroups { - createIntermediaGroups(for: parentGroup.reference, at: parentPath) + createIntermediaGroups(for: parentGroup, at: parentPath) } return fileReference } - func getFileReference(path: Path, inPath: Path, name: String? = nil, sourceTree: PBXSourceTree = .group, lastKnownFileType: String? = nil) -> String { + func getFileReference(path: Path, inPath: Path, name: String? = nil, sourceTree: PBXSourceTree = .group, lastKnownFileType: String? = nil) -> PBXFileElement { let fileReferenceKey = path.string.lowercased() if let fileReference = fileReferencesByPath[fileReferenceKey] { return fileReference @@ -128,7 +124,7 @@ class SourceGenerator { if fileReferencePath.string == fileReferenceName { fileReferenceName = nil } - let lastKnownFileType = lastKnownFileType ?? PBXFileReference.fileType(path: path) + let lastKnownFileType = lastKnownFileType ?? Xcode.fileType(path: path) if path.extension == "xcdatamodeld" { let versionedModels = (try? path.children()) ?? [] @@ -138,10 +134,9 @@ class SourceGenerator { .filter { $0.extension == "xcdatamodel" } .sorted { $0.string.localizedStandardCompare($1.string) == .orderedAscending } - let modelFileReference = + let modelFileReferences = sortedPaths.map { path in - createObject( - id: path.byRemovingBase(path: project.basePath).string, + addObject( PBXFileReference( sourceTree: .group, lastKnownFileType: "wrapper.xcdatamodel", @@ -152,23 +147,22 @@ class SourceGenerator { // If no current version path is found we fall back to alphabetical // order by taking the last item in the sortedPaths array let currentVersionPath = findCurrentCoreDataModelVersionPath(using: versionedModels) ?? sortedPaths.last - let currentVersion: ObjectReference? = { + let currentVersion: PBXFileReference? = { guard let indexOf = sortedPaths.index(where: { $0 == currentVersionPath }) else { return nil } - return modelFileReference[indexOf] + return modelFileReferences[indexOf] }() - let versionGroup = addObject(id: fileReferencePath.string, XCVersionGroup( - currentVersion: currentVersion?.reference, + let versionGroup = addObject(XCVersionGroup( + currentVersion: currentVersion, path: fileReferencePath.string, sourceTree: sourceTree, versionGroupType: "wrapper.xcdatamodel", - children: modelFileReference.map { $0.reference } + children: modelFileReferences )) fileReferencesByPath[fileReferenceKey] = versionGroup return versionGroup } else { // For all extensions other than `xcdatamodeld` - let fileReference = createObject( - id: path.byRemovingBase(path: project.basePath).string, + let fileReference = addObject( PBXFileReference( sourceTree: sourceTree, name: fileReferenceName, @@ -176,8 +170,8 @@ class SourceGenerator { path: fileReferencePath.string ) ) - fileReferencesByPath[fileReferenceKey] = fileReference.reference - return fileReference.reference + fileReferencesByPath[fileReferenceKey] = fileReference + return fileReference } } } @@ -209,12 +203,16 @@ class SourceGenerator { /// Create a group or return an existing one at the path. /// Any merged children are added to a new group or merged into an existing one. - private func getGroup(path: Path, name: String? = nil, mergingChildren children: [String], createIntermediateGroups: Bool, isBaseGroup: Bool) -> ObjectReference { - let groupReference: ObjectReference + private func getGroup(path: Path, name: String? = nil, mergingChildren children: [PBXFileElement], createIntermediateGroups: Bool, isBaseGroup: Bool) -> PBXGroup { + let groupReference: PBXGroup if let cachedGroup = groupsByPath[path] { - // only add the children that aren't already in the cachedGroup - cachedGroup.object.children = Array(Set(cachedGroup.object.children + children)) + for child in children { + // only add the children that aren't already in the cachedGroup + if !cachedGroup.children.contains(child) { + cachedGroup.children.append(child) + } + } groupReference = cachedGroup } else { @@ -237,28 +235,27 @@ class SourceGenerator { name: groupName != groupPath ? groupName : nil, path: groupPath ) - groupReference = createObject(id: path.byRemovingBase(path: project.basePath).string, group) + groupReference = addObject(group) groupsByPath[path] = groupReference if isTopLevelGroup { - rootGroups.insert(groupReference.reference) + rootGroups.insert(groupReference) } } return groupReference } /// Creates a variant group or returns an existing one at the path - private func getVariantGroup(path: Path, inPath: Path) -> ObjectReference { - let variantGroup: ObjectReference + private func getVariantGroup(path: Path, inPath: Path) -> PBXVariantGroup { + let variantGroup: PBXVariantGroup if let cachedGroup = variantGroupsByPath[path] { variantGroup = cachedGroup } else { let group = PBXVariantGroup( - children: [], sourceTree: .group, name: path.lastComponent ) - variantGroup = createObject(id: path.byRemovingBase(path: project.basePath).string, group) + variantGroup = addObject(group) variantGroupsByPath[path] = variantGroup } return variantGroup @@ -307,27 +304,24 @@ class SourceGenerator { /// creates all the source files and groups they belong to for a given targetSource private func getGroupSources(targetType: PBXProductType, targetSource: TargetSource, path: Path, isBaseGroup: Bool) - throws -> (sourceFiles: [SourceFile], groups: [ObjectReference]) { + throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { let children = try getSourceChildren(targetSource: targetSource, dirPath: path) let directories = children .filter { $0.isDirectory && $0.extension == nil && $0.extension != "lproj" } - .sorted { $0.lastComponent < $1.lastComponent } let filePaths = children .filter { $0.isFile || $0.extension != nil && $0.extension != "lproj" } - .sorted { $0.lastComponent < $1.lastComponent } let localisedDirectories = children .filter { $0.extension == "lproj" } - .sorted { $0.lastComponent < $1.lastComponent } - var groupChildren: [String] = filePaths.map { getFileReference(path: $0, inPath: path) } + var groupChildren: [PBXFileElement] = filePaths.map { getFileReference(path: $0, inPath: path) } var allSourceFiles: [SourceFile] = filePaths.map { generateSourceFile(targetType: targetType, targetSource: targetSource, path: $0) } - var groups: [ObjectReference] = [] + var groups: [PBXGroup] = [] for path in directories { let subGroups = try getGroupSources(targetType: targetType, targetSource: targetSource, path: path, isBaseGroup: false) @@ -338,11 +332,11 @@ class SourceGenerator { allSourceFiles += subGroups.sourceFiles - guard let first = subGroups.groups.first else { + guard let firstGroup = subGroups.groups.first else { continue } - groupChildren.append(first.reference) + groupChildren.append(firstGroup) groups += subGroups.groups } @@ -365,13 +359,13 @@ class SourceGenerator { .filter(isIncludedPath) .sorted() { let variantGroup = getVariantGroup(path: filePath, inPath: path) - groupChildren.append(variantGroup.reference) - baseLocalisationVariantGroups.append(variantGroup.object) + groupChildren.append(variantGroup) + baseLocalisationVariantGroups.append(variantGroup) let sourceFile = SourceFile( path: filePath, - fileReference: variantGroup.reference, - buildFile: PBXBuildFile(fileRef: variantGroup.reference), + fileReference: variantGroup, + buildFile: PBXBuildFile(file: variantGroup), buildPhase: .resources ) allSourceFiles.append(sourceFile) @@ -409,7 +403,7 @@ class SourceGenerator { let sourceFile = SourceFile( path: filePath, fileReference: fileReference, - buildFile: PBXBuildFile(fileRef: fileReference), + buildFile: PBXBuildFile(file: fileReference), buildPhase: .resources ) allSourceFiles.append(sourceFile) @@ -425,7 +419,7 @@ class SourceGenerator { isBaseGroup: isBaseGroup ) if project.options.createIntermediateGroups { - createIntermediaGroups(for: group.reference, at: path) + createIntermediaGroups(for: group, at: path) } groups.insert(group, at: 0) @@ -442,7 +436,7 @@ class SourceGenerator { let createIntermediateGroups = project.options.createIntermediateGroups var sourceFiles: [SourceFile] = [] - let sourceReference: String + let sourceReference: PBXFileElement var sourcePath = path switch type { case .folder: @@ -483,7 +477,7 @@ class SourceGenerator { } else { let parentGroup = getGroup(path: parentPath, mergingChildren: [fileReference], createIntermediateGroups: createIntermediateGroups, isBaseGroup: true) sourcePath = parentPath - sourceReference = parentGroup.reference + sourceReference = parentGroup } sourceFiles.append(sourceFile) @@ -491,11 +485,11 @@ class SourceGenerator { let (groupSourceFiles, groups) = try getGroupSources(targetType: targetType, targetSource: targetSource, path: path, isBaseGroup: true) let group = groups.first! if let name = targetSource.name { - group.object.name = name + group.name = name } sourceFiles += groupSourceFiles - sourceReference = group.reference + sourceReference = group } if createIntermediateGroups { @@ -506,7 +500,7 @@ class SourceGenerator { } // Add groups for all parents recursively - private func createIntermediaGroups(for groupReference: String, at path: Path) { + private func createIntermediaGroups(for fileElement: PBXFileElement, at path: Path) { let parentPath = path.parent() guard parentPath != project.basePath && path.string.contains(project.basePath.string) else { @@ -515,10 +509,10 @@ class SourceGenerator { } let hasParentGroup = groupsByPath[parentPath] != nil - let parentGroup = getGroup(path: parentPath, mergingChildren: [groupReference], createIntermediateGroups: true, isBaseGroup: false) + let parentGroup = getGroup(path: parentPath, mergingChildren: [fileElement], createIntermediateGroups: true, isBaseGroup: false) if !hasParentGroup { - createIntermediaGroups(for: parentGroup.reference, at: parentPath) + createIntermediaGroups(for: parentGroup, at: parentPath) } } diff --git a/Sources/XcodeGenKit/Version.swift b/Sources/XcodeGenKit/Version.swift index 7fdeee10..d37cebab 100644 --- a/Sources/XcodeGenKit/Version.swift +++ b/Sources/XcodeGenKit/Version.swift @@ -4,7 +4,7 @@ import ProjectSpec extension Project { var xcodeVersion: String { - return XCodeVersion.parse(options.xcodeVersion ?? "9.3") + return XCodeVersion.parse(options.xcodeVersion ?? "10.0") } var schemeVersion: String { diff --git a/Sources/XcodeGenKit/XCProjExtensions.swift b/Sources/XcodeGenKit/XCProjExtensions.swift index edf9fe5e..4aee97aa 100644 --- a/Sources/XcodeGenKit/XCProjExtensions.swift +++ b/Sources/XcodeGenKit/XCProjExtensions.swift @@ -1,5 +1,6 @@ import Foundation -import xcproj +import PathKit +import xcodeproj extension PBXFileElement { @@ -11,8 +12,8 @@ extension PBXFileElement { extension PBXProj { public func printGroups() -> String { - guard let project = objects.projects.first?.value, - let mainGroup = objects.groups.getReference(project.mainGroup) else { + guard let project = projects.first, + let mainGroup = project.mainGroup else { return "" } return printGroup(group: mainGroup) @@ -20,17 +21,31 @@ extension PBXProj { public func printGroup(group: PBXGroup) -> String { var string = group.nameOrPath - for reference in group.children { - if let group = objects.groups.getReference(reference) { + for child in group.children { + if let group = child as? PBXGroup { string += "\n 📁 " + printGroup(group: group).replacingOccurrences(of: "\n ", with: "\n ") - } else if let fileReference = objects.fileReferences.getReference(reference) { + } else if let fileReference = child as? PBXFileReference { string += "\n 📄 " + fileReference.nameOrPath - } else if let variantGroup = objects.variantGroups.getReference(reference) { + } else if let variantGroup = child as? PBXVariantGroup { string += "\n 🌎 " + variantGroup.nameOrPath - } else if let versionGroup = objects.versionGroups.getReference(reference) { + } else if let versionGroup = child as? XCVersionGroup { string += "\n 🔢 " + versionGroup.nameOrPath } } return string } } + +extension Dictionary { + + public var valueArray: Array { + return Array(values) + } +} + +extension Xcode { + + public static func fileType(path: Path) -> String? { + return path.extension.flatMap { Xcode.filetype(extension: $0) } + } +} diff --git a/Tests/Fixtures/TestProject/App_iOS/App.entitlements b/Tests/Fixtures/TestProject/App_iOS/App.entitlements new file mode 100644 index 00000000..37d691ef --- /dev/null +++ b/Tests/Fixtures/TestProject/App_iOS/App.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.application-groups + group.com.app + + diff --git a/Tests/Fixtures/TestProject/App_iOS/AppDelegate.swift b/Tests/Fixtures/TestProject/App_iOS/AppDelegate.swift index 3116cdbf..2c79185e 100644 --- a/Tests/Fixtures/TestProject/App_iOS/AppDelegate.swift +++ b/Tests/Fixtures/TestProject/App_iOS/AppDelegate.swift @@ -6,7 +6,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. _ = FrameworkStruct() // Standalone files added to project by path-to-file. diff --git a/Tests/Fixtures/TestProject/App_iOS/ViewController.swift b/Tests/Fixtures/TestProject/App_iOS/ViewController.swift index 4cdc9940..a44b02a4 100644 --- a/Tests/Fixtures/TestProject/App_iOS/ViewController.swift +++ b/Tests/Fixtures/TestProject/App_iOS/ViewController.swift @@ -1,10 +1,11 @@ +import Contacts import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. + _ = CNContact() } override func didReceiveMemoryWarning() { diff --git a/Tests/Fixtures/TestProject/App_macOS/AppDelegate.swift b/Tests/Fixtures/TestProject/App_macOS/AppDelegate.swift new file mode 100644 index 00000000..1e3be7aa --- /dev/null +++ b/Tests/Fixtures/TestProject/App_macOS/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + func applicationDidFinishLaunching(_ aNotification: Notification) { + // Insert code here to initialize your application + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } +} diff --git a/Tests/Fixtures/TestProject/App_macOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Tests/Fixtures/TestProject/App_macOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..2db2b1c7 --- /dev/null +++ b/Tests/Fixtures/TestProject/App_macOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/Fixtures/TestProject/App_macOS/Assets.xcassets/Contents.json b/Tests/Fixtures/TestProject/App_macOS/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Tests/Fixtures/TestProject/App_macOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/Fixtures/TestProject/App_macOS/Base.lproj/Main.storyboard b/Tests/Fixtures/TestProject/App_macOS/Base.lproj/Main.storyboard new file mode 100644 index 00000000..bf7fd51b --- /dev/null +++ b/Tests/Fixtures/TestProject/App_macOS/Base.lproj/Main.storyboard @@ -0,0 +1,717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Fixtures/TestProject/App_macOS/Info.plist b/Tests/Fixtures/TestProject/App_macOS/Info.plist new file mode 100644 index 00000000..cab4fbf4 --- /dev/null +++ b/Tests/Fixtures/TestProject/App_macOS/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + CustomSetting + $CUSTOM_SETTING + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/Tests/Fixtures/TestProject/App_macOS/ViewController.swift b/Tests/Fixtures/TestProject/App_macOS/ViewController.swift new file mode 100644 index 00000000..ec0eea30 --- /dev/null +++ b/Tests/Fixtures/TestProject/App_macOS/ViewController.swift @@ -0,0 +1,16 @@ +import Cocoa + +class ViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override var representedObject: Any? { + didSet { + // Update the view, if already loaded. + } + } +} diff --git a/Tests/Fixtures/TestProject/App_watchOS Extension/InterfaceController.swift b/Tests/Fixtures/TestProject/App_watchOS Extension/InterfaceController.swift index 712d399a..2a6519b8 100644 --- a/Tests/Fixtures/TestProject/App_watchOS Extension/InterfaceController.swift +++ b/Tests/Fixtures/TestProject/App_watchOS Extension/InterfaceController.swift @@ -1,12 +1,12 @@ -import Alamofire import Foundation +import Result import WatchKit class InterfaceController: WKInterfaceController { override func awake(withContext context: Any?) { super.awake(withContext: context) - let method = HTTPMethod.get + _ = Result.success("value") // Configure interface objects here. } diff --git a/Tests/Fixtures/TestProject/App_watchOS/Info.plist b/Tests/Fixtures/TestProject/App_watchOS/Info.plist index faa65943..7d614116 100644 --- a/Tests/Fixtures/TestProject/App_watchOS/Info.plist +++ b/Tests/Fixtures/TestProject/App_watchOS/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.2 CFBundleVersion 1 UISupportedInterfaceOrientations diff --git a/Tests/Fixtures/TestProject/Cartfile b/Tests/Fixtures/TestProject/Cartfile index 821b0ae3..27636fa1 100644 --- a/Tests/Fixtures/TestProject/Cartfile +++ b/Tests/Fixtures/TestProject/Cartfile @@ -1 +1 @@ -github "Alamofire/Alamofire" +github "antitypical/Result" \ No newline at end of file diff --git a/Tests/Fixtures/TestProject/Cartfile.resolved b/Tests/Fixtures/TestProject/Cartfile.resolved index 9efe68da..23aa9709 100644 --- a/Tests/Fixtures/TestProject/Cartfile.resolved +++ b/Tests/Fixtures/TestProject/Cartfile.resolved @@ -1 +1 @@ -github "Alamofire/Alamofire" "4.7.2" +github "antitypical/Result" "4.0.0" diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 714481c8..8b2f0211 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXAggregateTarget section */ - AT_445731917037 /* SuperTarget */ = { + AT_D40C01B2BAD29EDEA392714DFB69FE8F /* SuperTarget */ = { isa = PBXAggregateTarget; - buildConfigurationList = CL_445731917037 /* Build configuration list for PBXAggregateTarget "SuperTarget" */; + buildConfigurationList = CL_B523BC91AF70F483BF998E2BA8DD6669 /* Build configuration list for PBXAggregateTarget "SuperTarget" */; buildPhases = ( - SSBP_8280041834 /* MyScript */, + SSBP_831D7D5A30B0F736E1E92F7B5CF9428F /* MyScript */, ); dependencies = ( - TD_208010900457 /* PBXTargetDependency */, - TD_747418473860 /* PBXTargetDependency */, + TD_B8AB4064784522A5F3760CB1372D1BCD /* PBXTargetDependency */, + TD_D056799E80FFF41247BAE692D01142F0 /* PBXTargetDependency */, ); name = SuperTarget; productName = SuperTarget; @@ -23,829 +23,935 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - BF_138356261076 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_363921640403 /* InterfaceController.swift */; }; - BF_139519317795 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_452853029807 /* Alamofire.framework */; }; - BF_167705969896 /* TestProjectUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_145531354566 /* TestProjectUITests.swift */; }; - BF_182635022050 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_830053537293 /* Assets.xcassets */; }; - BF_184447863946 = {isa = PBXBuildFile; fileRef = FR_935153865209 /* iMessageApp.app */; }; - BF_186245454304 /* LocalizedStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_118219888726 /* LocalizedStoryboard.storyboard */; }; - BF_190684453680 = {isa = PBXBuildFile; fileRef = FR_376569054786 /* XPC Service.xpc */; }; - BF_206432481076 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_340586388409 /* ExtensionDelegate.swift */; }; - BF_211435872001 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = VG_473000061463 /* Localizable.strings */; }; - BF_212221512596 /* StaticLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_470929579339 /* StaticLibrary.swift */; }; - BF_215463341392 /* SomeFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_654302359039 /* SomeFramework.framework */; }; - BF_217053936758 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_752394658615 /* Alamofire.framework */; }; - BF_225293845818 = {isa = PBXBuildFile; fileRef = FR_507023492251 /* App_watchOS Extension.appex */; }; - BF_237760701422 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_987043315473 /* Assets.xcassets */; }; - BF_239684316986 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_815403394914 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_243071719122 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_172952167809 /* FrameworkFile.swift */; }; - BF_259448131292 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_815403394914 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_268392110450 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_587738154368 /* Assets.xcassets */; }; - BF_279581961655 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_868653349092 /* Assets.xcassets */; }; - BF_280535243540 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_609193904586 /* Main.storyboard */; }; - BF_284620660317 /* MyBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FR_238161558082 /* MyBundle.bundle */; }; - BF_292474606791 = {isa = PBXBuildFile; fileRef = FR_525119120469 /* Framework.framework */; }; - BF_303822704662 = {isa = PBXBuildFile; fileRef = FR_472296042419 /* Framework.framework */; }; - BF_304637845091 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_151462316179 /* main.m */; }; - BF_308631758818 /* XPC Service.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_376569054786 /* XPC Service.xpc */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_314868376788 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = VG_746876637628 /* Localizable.stringsdict */; }; - BF_324363145049 /* Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_472296042419 /* Framework.framework */; }; - BF_331192862207 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_481575785861 /* ViewController.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; }; - BF_334321520545 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_377082606829 /* Assets.xcassets */; }; - BF_334778067417 = {isa = PBXBuildFile; fileRef = FR_783122899910 /* App_iOS_Tests.xctest */; }; - BF_337656089700 = {isa = PBXBuildFile; fileRef = FR_399755008402 /* StaticLibrary_ObjC.a */; }; - BF_360196406184 /* TestProjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_722239415598 /* TestProjectTests.swift */; }; - BF_415651546539 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_752394658615 /* Alamofire.framework */; }; - BF_425679397292 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_183521624014 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_441538117869 /* App_watchOS Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = FR_507023492251 /* App_watchOS Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - BF_456457948943 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_172952167809 /* FrameworkFile.swift */; }; - BF_458111705914 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_410645050443 /* Alamofire.framework */; }; - BF_461044234706 /* SomeFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_654302359039 /* SomeFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_496472559782 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_183521624014 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_501771188469 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_410645050443 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_503484983186 /* MoreUnder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_196911129660 /* MoreUnder.swift */; }; - BF_510053944904 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_815403394914 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_518775144316 /* SomeXPCService.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_229826849033 /* SomeXPCService.xpc */; }; - BF_526105569599 = {isa = PBXBuildFile; fileRef = FR_437179166843 /* StaticLibrary_Swift.a */; }; - BF_535236390262 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_257516580010 /* Alamofire.framework */; }; - BF_538515166673 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_256263906698 /* LaunchScreen.storyboard */; }; - BF_552913093094 /* Framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_525119120469 /* Framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_561304997165 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_675266829517 /* Standalone.swift */; }; - BF_563614389392 = {isa = PBXBuildFile; fileRef = FR_618687462494 /* iMessageExtension.appex */; }; - BF_597639300414 /* Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_525119120469 /* Framework.framework */; }; - BF_607543323797 /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_698230898030 /* StaticLibrary_ObjC.h */; }; - BF_612351978356 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_264279911176 /* Interface.storyboard */; }; - BF_624802436672 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_172952167809 /* FrameworkFile.swift */; }; - BF_632297340262 /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = "FR_698230898030-1" /* StaticLibrary_ObjC.m */; }; - BF_647038614509 /* iMessageApp.app in Resources */ = {isa = PBXBuildFile; fileRef = FR_935153865209 /* iMessageApp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - BF_650026899468 = {isa = PBXBuildFile; fileRef = FR_602719163962 /* XPC_Service.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_670499288392 /* Model.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = VG_229021855709 /* Model.xcdatamodeld */; settings = {COMPILER_FLAGS = "-Werror"; }; }; - BF_681504666330 = {isa = PBXBuildFile; fileRef = FR_825232110500 /* App_iOS.app */; }; - BF_703054643820 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_310979699934 /* MessagesViewController.swift */; }; - BF_704149935229 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_675266829517 /* Standalone.swift */; }; - BF_721498080533 /* ResourceFolder in Resources */ = {isa = PBXBuildFile; fileRef = FR_257073931060 /* ResourceFolder */; }; - BF_725992639588 = {isa = PBXBuildFile; fileRef = FR_480982116789 /* App_macOS.app */; }; - BF_732745079658 = {isa = PBXBuildFile; fileRef = FR_324671077936 /* App_watchOS.app */; }; - BF_734036107922 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_183521624014 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_742449020987 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_410645050443 /* Alamofire.framework */; }; - BF_747443236192 /* App_watchOS.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = FR_324671077936 /* App_watchOS.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - BF_752022362638 /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_665156855283 /* module.modulemap */; }; - BF_757906110813 = {isa = PBXBuildFile; fileRef = FR_662315837182 /* Framework.framework */; }; - BF_770495922915 /* StaticLibrary_ObjC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_399755008402 /* StaticLibrary_ObjC.a */; }; - BF_803757127643 = {isa = PBXBuildFile; fileRef = FR_739513596122 /* XPC_ServiceProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_807556340853 /* Empty.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_837374194182 /* Empty.h */; }; - BF_813358525536 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_183521624014 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_828878846239 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_201160695646 /* MainInterface.storyboard */; }; - BF_830383951771 /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_304712043717 /* NotificationController.swift */; }; - BF_854463933379 = {isa = PBXBuildFile; fileRef = FR_438704538506 /* Framework.framework */; }; - BF_854691035877 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_257516580010 /* Alamofire.framework */; }; - BF_855988705556 /* XPC_Service.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_602719163945 /* XPC_Service.m */; }; - BF_860391087135 /* StandaloneAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_408537768279 /* StandaloneAssets.xcassets */; }; - BF_863842036151 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_410645050443 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_870702193513 /* iMessageExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = FR_618687462494 /* iMessageExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - BF_892119987440 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_854336462818 /* AppDelegate.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; }; - BF_897881229855 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_257516580010 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_898051828670 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_752394658615 /* Alamofire.framework */; }; - BF_901390118565 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_172952167809 /* FrameworkFile.swift */; }; - BF_905038616071 /* Framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_472296042419 /* Framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF_905617636654 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_815403394914 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; - BF_940936137577 = {isa = PBXBuildFile; fileRef = FR_123503999387 /* App_iOS_UITests.xctest */; }; - BF_943177036061 /* StaticLibrary_ObjC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_399755008402 /* StaticLibrary_ObjC.a */; }; + BF_021628792D80050372F6E56A6C3D0561 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_B993F75B001AB1C272CE83CACC06F0E5 /* AppDelegate.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; }; + BF_0378AD9857D61219363F74B2FA308B5A /* Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_EFD283107EDF836BF0D9F4EB3F9A0016 /* Framework.framework */; }; + BF_0A6C302954FF03411D6F2704ECF5C738 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_0B3CE605B6243480C374176E01B1BB12 /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_96127F4D9D804B89024AB846F0961621 /* module.modulemap */; }; + BF_0BBC6762FFFC3394DCB0570CCEFB1970 /* iMessageExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = FR_0570C52FB0BC489485EAF0CE7B7119A1 /* iMessageExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + BF_149B8FD8F114C531F675E01FBE814609 /* ResourceFolder in Resources */ = {isa = PBXBuildFile; fileRef = FR_1B0304C0E4DC73614BAA550E4A80D41C /* ResourceFolder */; }; + BF_19C973A29D9994B1E0655B1AFC5528AD /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_6542B94EE7DA40CD30BC54DED26C61C7 /* Interface.storyboard */; }; + BF_1C8AAB7468188315681C0879591969B4 /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_96127F4D9D804B89024AB846F0961621 /* module.modulemap */; }; + BF_1EC32E6544284999188A140FB5FC6E67 /* TestProjectUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_5CFDEA59B939FA9F3CA4F775B9E6AD2B /* TestProjectUITests.swift */; }; + BF_230439786C4C6849F488A5FADC6A42A5 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_11478908A963CED036DABEF21D85DF01 /* Result.framework */; }; + BF_2356EAE09301354149D45720369BE7F2 /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_D0BE69522DB875ADB041E9135E0767CA /* StaticLibrary_ObjC.h */; }; + BF_30024D558743C8ABC415D87431CDC13C /* SomeFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_2F56FD7A1F7782467AC9F315B6133468 /* SomeFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_3080067722B357BFC053D89CCDBF5397 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_33EA0F8B2ADA2D24A683FCD8D6235B10 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_36BCFE51A59D5EAE19684491C9F5427F /* StaticLibrary_ObjC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_1C00E09FA3D2CDB962FE8D5584853E0D /* StaticLibrary_ObjC.a */; }; + BF_3811C1771AF5342AD8F9FEB63A3465B5 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_390908C547D6F8520DF9AA0CC5A98EB1 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_3DD4DE355C21662A9169EE41C44F73E3 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_3B680DD27CFCD491675F1BF257A95A24 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_42C8B667C3B7417C14B063AF0F16C1A6 /* StaticLibrary_ObjC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_36044227861B95AC5060E7D063BED65A /* StaticLibrary_ObjC.a */; }; + BF_47A75C8A7EF15658238E254C846C5C6B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_30676EBEE9BE54AA26CAE69BE744CAE8 /* Main.storyboard */; }; + BF_47FBEFEA08B9642C1F711EDA77FC8C89 /* LocalizedStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_FE6D89DA2D7E7F58340D566590FF221C /* LocalizedStoryboard.storyboard */; }; + BF_47FF83A37355E90F93C0F5B2CFBCE317 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_82E3C6C060C4487B5177509917C3FAE3 /* Standalone.swift */; }; + BF_486398284252AEE9001DD72E5E710D93 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_6A3D8067EBC18CB321826EB21FEBD094 /* libc++.tbd */; }; + BF_4D56F3F4D081A77C11325B96DD34D8E1 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_4EBBAD70FA73DDC89BD933866B90DD08 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_51D370314B5DA8E002A908021E459F50 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_A55A35F549FD72775C37ED05342812AA /* Assets.xcassets */; }; + BF_527E94EECC2501E12D28790BF9318FD3 /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_96127F4D9D804B89024AB846F0961621 /* module.modulemap */; }; + BF_52C8E2C5962601534CE6F00B88FDB048 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_14B7B5469AA17939993A2B25E775D391 /* Main.storyboard */; }; + BF_5336CD16DBDB1654D75AA91B922DEAD6 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_CC3A24A5C8E1815346752C5AB0745176 /* InterfaceController.swift */; }; + BF_569CC068CD4B7BCE35E974D7B61566DB /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_59E5DB880E7823E6BC1D62FAF99E5758 /* App_watchOS.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = FR_30E7940EF436086816B40DAC068BD238 /* App_watchOS.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + BF_5C6407EDAC3D88B020BCB46724DC1D14 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_65835F9276FF0DB8E27D098367F9D03C /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = VG_C247AA37E9057916EDDC65C7B55E2F38 /* Localizable.stringsdict */; }; + BF_67219751DE020023F9D6068EDCCDC445 /* SomeXPCService.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_4EB4AAACD714C13E5BC894C71B954299 /* SomeXPCService.xpc */; }; + BF_6AA4D902E371C0F078917EB44F966B16 /* App_watchOS Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = FR_545DDE4AB557C8FAAD87775CD4271BDF /* App_watchOS Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + BF_6E2D4086A22C12D516A06AE66DC48D16 /* Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_099E2C49D4A0B799E78B39C47FBEADF7 /* Framework.framework */; }; + BF_703163C1C547AD6EF09BEA5F5F5ED49C /* module.modulemap in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_96127F4D9D804B89024AB846F0961621 /* module.modulemap */; }; + BF_729EB1C88A5E43B2342099D81B301F4D /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_76825DD9B3B10103CDAB9D235BDF6A91 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_5FEC20FF753341FD0483E2E4C622DB05 /* MessagesViewController.swift */; }; + BF_77C9BB7BED4F5970D02E69312259FE09 /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_C2A280C4FA602E6610BCFB820602B69E /* StaticLibrary_ObjC.m */; }; + BF_7C9646667C0D479544A2207DEE3E930B /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_3DD4DE355C21662A9169EE41C44F73E3 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_81711FB79375EB743254B809B4E246E0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_4DB225C7FF39C16EEFD9A1A5595FCDBC /* AppDelegate.swift */; }; + BF_8610CB66872BC72C1690EBD8D102FBC0 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_86F2552DA1E230901EC4CB1A40399019 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_CEAE8D9C3F3920D6EADE5455C188EAAE /* Result.framework */; }; + BF_8765851BF5D99B10C220DDD57B968B10 /* Result.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_11478908A963CED036DABEF21D85DF01 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_90F0E9253F2768C312B65530931CD55A /* Empty.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_DBD29CA78CDBBEF69B2C39C6D23BBDA1 /* Empty.h */; }; + BF_910C2D6055BD22643F042545CD21AA78 /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_D0BE69522DB875ADB041E9135E0767CA /* StaticLibrary_ObjC.h */; }; + BF_93A4E1A93C7DB4289E526466D547E55E /* SomeFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_2F56FD7A1F7782467AC9F315B6133468 /* SomeFramework.framework */; }; + BF_9743BCF98E3EF021AB384652DA126416 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_9A09F93850576AF57455BE58FD53C42F /* Contacts.framework */; }; + BF_9830FFD35765AACD86D1B619E22830D6 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_3DD4DE355C21662A9169EE41C44F73E3 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_98DEE7FD578AA439550E0023A2ECE8D0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_25BDF725104C5E280D45CBF33F54C72C /* ViewController.swift */; }; + BF_9A74AED05E2F61530BFA0F7D23AF0112 /* Model.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = VG_EB676136B9F946373D4796800CC00AD4 /* Model.xcdatamodeld */; settings = {COMPILER_FLAGS = "-Werror"; }; }; + BF_9D9B97D239384F4CE6E73852E027B787 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_B537FEE8515090D3BA0F5CFF3BC76BB1 /* Assets.xcassets */; }; + BF_A29F8B04C9DD9ADE1EF5AFDAAA0130D2 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_DBB69305458B16774C88720CDD3978E5 /* ExtensionDelegate.swift */; }; + BF_A8A5905BCA8872B2D7B0EF6326B33077 /* MyBundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FR_291D6D09ACADC420638E83BEE89DFFEB /* MyBundle.bundle */; }; + BF_ABA4EA32A6DB022806126D9C1418BBA3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_ED407ECED0DF010B1E787D238EA91A5D /* Assets.xcassets */; }; + BF_AC2CE59D56846478FDFBB376FF9F9DC0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = VG_BE436BDD64E90EFB600D47AC69B49DD3 /* Localizable.strings */; }; + BF_B2B4B15D6F7B242DBDA39939111282F9 /* TestProjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_D7B45FAEE40EE622B4FA9192609F9717 /* TestProjectTests.swift */; }; + BF_B5446C54E942A18E025D2061A88004A4 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_11478908A963CED036DABEF21D85DF01 /* Result.framework */; }; + BF_B57F9691AD12CA8AE5528A2BAB9E4A43 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_F256536BB07CF3E64C4DD934F75BED9C /* LaunchScreen.storyboard */; }; + BF_B69A0C5F1A19F65CA603F58247A8CD41 /* Framework2.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_1EA1EAB0CB9BD96BC550879E58911B12 /* Framework2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_B6E31790D07B981E52CD5BC9049FE303 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_B8E824A58BFE0B81E16BB26087FDC8B4 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_CEAE8D9C3F3920D6EADE5455C188EAAE /* Result.framework */; }; + BF_BD2537A230BFC8A86681F0AF34C929DA /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_8B770F475242D91FC20289A3B35CD165 /* Result.framework */; }; + BF_BEFDF47CD7D88221A9C166BD65BF2013 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_C5EA496FE2EDF51C92DC55FD552472E5 /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_D0BE69522DB875ADB041E9135E0767CA /* StaticLibrary_ObjC.h */; }; + BF_C9D24A56926211130F4E25B5D9972B58 /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_C2A280C4FA602E6610BCFB820602B69E /* StaticLibrary_ObjC.m */; }; + BF_CD062A97959629BD672893FDAE89A1E9 /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_BB49B398F9291781A60DA963A0BF168C /* NotificationController.swift */; }; + BF_D0676C98017B6FDD96A733CB851645DE /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_C2A280C4FA602E6610BCFB820602B69E /* StaticLibrary_ObjC.m */; }; + BF_D0D1D142403C75D11757CB7092E8D035 /* XPC Service.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_1FA381C639CE4923ED6845790A5DF9D2 /* XPC Service.xpc */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_D2532BE2FA7D664875AD6E29A22269C0 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_9A09F93850576AF57455BE58FD53C42F /* Contacts.framework */; }; + BF_D3D64E2595369BBDEF03E07543AE2779 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_D6588CD7B83034816FFD3A7DB10DAD78 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_16B791CFA2095097A17CC216977DF6EF /* Assets.xcassets */; }; + BF_D7E271A6820E0A908736F44F99341DE1 /* Framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_EFD283107EDF836BF0D9F4EB3F9A0016 /* Framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_DA12D48C9BCEC64D55B87CE8703432BE /* StaticLibrary_ObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR_D0BE69522DB875ADB041E9135E0767CA /* StaticLibrary_ObjC.h */; }; + BF_DBF3047DCE71CB2E7B9AC7367F44F8DB /* StaticLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_CCC97AF230188CAF9B4A66324891CCAD /* StaticLibrary.swift */; }; + BF_E228A4D3997297780216722D71AC9FE5 /* StaticLibrary_ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_C2A280C4FA602E6610BCFB820602B69E /* StaticLibrary_ObjC.m */; }; + BF_E2D02DDEDD7DC21831F50A6EAA71E528 /* StandaloneAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_C6A9DE885CAF350F6C9D0AC6F7324CD3 /* StandaloneAssets.xcassets */; }; + BF_E35C9C198B45406E64439FF96C17F056 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_E6B3BA0A3A687598FB5CCDF0524E1B10 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */; }; + BF_EA0063B4FC2A0980A746D35A8DF71CED /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG_06DC429EEFBBA25BC3EE1AA1B4062C10 /* MainInterface.storyboard */; }; + BF_EBC45940911A4942BA04AE1285BF3802 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_A0867B127ACF3ED382EB2FD5133D3EA8 /* Assets.xcassets */; }; + BF_EC0616A0D18A2F723D2AF50287C43669 /* Headers in Headers */ = {isa = PBXBuildFile; fileRef = FR_3DD4DE355C21662A9169EE41C44F73E3 /* Headers */; settings = {ATTRIBUTES = (Public, ); }; }; + BF_ED8BB47A2229EC3BEE544608267FB82D /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_DC1C8DE46218F90A3F4FD5F8DE4F0ABB /* Result.framework */; }; + BF_F12E44D8E7F617E8A5FD8E1A342E5FAD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_752FB5DFFBC490CFB9742549A0C48527 /* ViewController.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; }; + BF_F3D57DA3E1F8A539BDD72E02A8C23FC6 /* iMessageApp.app in Resources */ = {isa = PBXBuildFile; fileRef = FR_3305E7E3B08D04C667D02BD29D3A45A9 /* iMessageApp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + BF_F6A0FC1F0C9A4EC13BCCBB764D716C3F /* Result.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_CEAE8D9C3F3920D6EADE5455C188EAAE /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_F6FBB97A7DE0F6D06661A00E3B22E8CF /* Framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_099E2C49D4A0B799E78B39C47FBEADF7 /* Framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_F7AC9F45ED37FCD5A749FD6F5F4518AF /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_82E3C6C060C4487B5177509917C3FAE3 /* Standalone.swift */; }; + BF_F8D73622DA7CFF30DB9AD17C08C63655 /* Framework2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR_1EA1EAB0CB9BD96BC550879E58911B12 /* Framework2.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + BF_F9E44FE6ECBD936A8C762D425DDBA37C /* Result.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FR_CEAE8D9C3F3920D6EADE5455C188EAAE /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF_FA28229372AB6236883309181258AF26 /* XPC_Service.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_7F4496C534F2DF8C4FB9A8D52414990B /* XPC_Service.m */; }; + BF_FA5F3C87A2571E0F39637D118B6C6F8F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR_B243640A6F73B3F3D33ABD05ABDBC26B /* Assets.xcassets */; }; + BF_FD13F69A90FB1D5676B97A8C77D710B4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FR_F5436E663145426483F206F8A61400BC /* main.m */; }; + BF_FF7EBDFA4462D2983743C84CE99D9714 /* MoreUnder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR_AC5B2FCE520D5306B254D5857E15B6CB /* MoreUnder.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - CIP_10972496596 /* PBXContainerItemProxy */ = { + CIP_1AEF07B9F6A9BC9605E82F26AE7BFE15 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_472296042419; - remoteInfo = Framework_iOS; + remoteGlobalIDString = NT_6AEE12F93D449E249F5348BBF35D3053; + remoteInfo = StaticLibrary_ObjC_iOS; }; - CIP_19329118292 /* PBXContainerItemProxy */ = { + CIP_1C3D8F2BF099A773651CF8A195466469 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_507023492251; - remoteInfo = "App_watchOS Extension"; + remoteGlobalIDString = NT_D4C3E345E90AF9F6CBE8CF226FCFBCD6; + remoteInfo = StaticLibrary_ObjC_tvOS; }; - CIP_20801090045 /* PBXContainerItemProxy */ = { + CIP_1F8C8F9FAC75236BB2F60C3BCAE41C55 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_825232110500; + remoteGlobalIDString = NT_6AEE12F93D449E249F5348BBF35D3053; + remoteInfo = StaticLibrary_ObjC_iOS; + }; + CIP_291A38592460740F400A80DE5DBA9679 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_BEB0891E36797FE2214A0A9D516D408D; remoteInfo = App_iOS; }; - CIP_23558050412 /* PBXContainerItemProxy */ = { + CIP_47399FDE0885501C87782313489C95A3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_525119120469; - remoteInfo = Framework_macOS; + remoteGlobalIDString = NT_34A020E43FBBD797051205235CD82B70; + remoteInfo = StaticLibrary_ObjC_watchOS; }; - CIP_28856087625 /* PBXContainerItemProxy */ = { + CIP_4FA1F11884BC4F5DBDFAC1FBEC60AFC1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_935153865209; + remoteGlobalIDString = NT_BEB0891E36797FE2214A0A9D516D408D; + remoteInfo = App_iOS; + }; + CIP_5E9F76628F77E820EB9AA60A282D8691 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_6BD068FAAC6AA35C090C48147B94EC6E; remoteInfo = iMessageApp; }; - CIP_31792113134 /* PBXContainerItemProxy */ = { + CIP_5F2FD3F0AED59431B4F98D7238CAA733 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_618687462494; - remoteInfo = iMessageExtension; + remoteGlobalIDString = NT_5245AB6D3B3CFBC95AEBADF6E0C593B8; + remoteInfo = "App_watchOS Extension"; }; - CIP_33710394010 /* PBXContainerItemProxy */ = { + CIP_64ED071F49DC88F8192387D7A18827F1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_399755008402; - remoteInfo = StaticLibrary_ObjC; + remoteGlobalIDString = NT_15609BCEEB00CBCC4C42110EB0366A6F; + remoteInfo = StaticLibrary_ObjC_macOS; }; - CIP_62903878492 /* PBXContainerItemProxy */ = { + CIP_6D60DD975DE7829AEA72BD4098DE13E6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_399755008402; - remoteInfo = StaticLibrary_ObjC; - }; - CIP_66745555235 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_399755008402; - remoteInfo = StaticLibrary_ObjC; - }; - CIP_67619158112 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_825232110500; - remoteInfo = App_iOS; - }; - CIP_72152212817 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_399755008402; - remoteInfo = StaticLibrary_ObjC; - }; - CIP_74378499241 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_376569054786; - remoteInfo = "XPC Service"; - }; - CIP_74741847386 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_472296042419; - remoteInfo = Framework_iOS; - }; - CIP_78441234790 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_399755008402; - remoteInfo = StaticLibrary_ObjC; - }; - CIP_82410178775 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT_324671077936; + remoteGlobalIDString = NT_38A9FE87056942A2746E0FF025B52A91; remoteInfo = App_watchOS; }; - CIP_88714386547 /* PBXContainerItemProxy */ = { + CIP_73A78E804E93B79E9ED934358CDD7D9D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_825232110500; + remoteGlobalIDString = NT_BEB0891E36797FE2214A0A9D516D408D; remoteInfo = App_iOS; }; - CIP_95747640947 /* PBXContainerItemProxy */ = { + CIP_862C50E687ABB75CCDF71F1157709A4D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = P_8448771205358 /* Project object */; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; proxyType = 1; - remoteGlobalIDString = NT_399755008402; - remoteInfo = StaticLibrary_ObjC; + remoteGlobalIDString = NT_9F72C903B42E1AA3B88F97B917231B15; + remoteInfo = Framework2_iOS; + }; + CIP_A760C88E6F24D3F06081AEBDEB8AE54B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_7D108AE86BED8C9CCF52C2646FA4C5DE; + remoteInfo = Framework_iOS; + }; + CIP_B5B71FB9D5064D7E05E9E44827A87775 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_6A4FC6EE80FB2821AB96D51C3BC8966E; + remoteInfo = iMessageExtension; + }; + CIP_BAAD03920C86C2839C3C93FDA5568ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_23509FD082D1F788E6D6431F509B11AF; + remoteInfo = "XPC Service"; + }; + CIP_C82ED1EBAD4D7218ED9694EB7BF4DE74 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_15609BCEEB00CBCC4C42110EB0366A6F; + remoteInfo = StaticLibrary_ObjC_macOS; + }; + CIP_CA46A507405C3CBD7579D2C9A3F8719E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_9D53AF351F8DAE25354F2391248DFCCA; + remoteInfo = Framework_macOS; + }; + CIP_DC690C90FF2F615A1EB93D9803F8D905 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT_7D108AE86BED8C9CCF52C2646FA4C5DE; + remoteInfo = Framework_iOS; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - CFBP_2836118931 /* Embed Watch Content */ = { + CFBP_0B6C520DAC94DDCE678BE15C53528F25 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + BF_910C2D6055BD22643F042545CD21AA78 /* StaticLibrary_ObjC.h in CopyFiles */, + BF_527E94EECC2501E12D28790BF9318FD3 /* module.modulemap in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_1C40B0777F31334440F91C2DB34EF404 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BF_B69A0C5F1A19F65CA603F58247A8CD41 /* Framework2.framework in Embed Frameworks */, + BF_D7E271A6820E0A908736F44F99341DE1 /* Framework.framework in Embed Frameworks */, + BF_30024D558743C8ABC415D87431CDC13C /* SomeFramework.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_2FE0B34CC045616C815F2675387DA9D5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BF_F9E44FE6ECBD936A8C762D425DDBA37C /* Result.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_3BE6FE084D6BE913354F37B1DD9A8D92 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BF_F6A0FC1F0C9A4EC13BCCBB764D716C3F /* Result.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_469B033759EACBB99ECBF1008677C590 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + BF_6AA4D902E371C0F078917EB44F966B16 /* App_watchOS Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_4DFB7882C9F8BAB250BB0A6B9457B4CC /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + BF_C5EA496FE2EDF51C92DC55FD552472E5 /* StaticLibrary_ObjC.h in CopyFiles */, + BF_0B3CE605B6243480C374176E01B1BB12 /* module.modulemap in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_712E86A86BBF89DB5B5F3874B24B8996 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + BF_DA12D48C9BCEC64D55B87CE8703432BE /* StaticLibrary_ObjC.h in CopyFiles */, + BF_703163C1C547AD6EF09BEA5F5F5ED49C /* module.modulemap in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_961F46C30E720E886AEFD11D45DDA199 /* Embed Watch Content */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; dstSubfolderSpec = 16; files = ( - BF_747443236192 /* App_watchOS.app in Embed Watch Content */, + BF_59E5DB880E7823E6BC1D62FAF99E5758 /* App_watchOS.app in Embed Watch Content */, ); name = "Embed Watch Content"; runOnlyForDeploymentPostprocessing = 0; }; - CFBP_3265670993 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - BF_607543323797 /* StaticLibrary_ObjC.h in CopyFiles */, - BF_752022362638 /* module.modulemap in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CFBP_4082141876 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - BF_863842036151 /* Alamofire.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - CFBP_4626438721 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - BF_501771188469 /* Alamofire.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - CFBP_4684049960 /* Embed App Extensions */ = { + CFBP_AD91D17C63B2CD9AE7EFB9EFD62A8223 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - BF_441538117869 /* App_watchOS Extension.appex in Embed App Extensions */, + BF_0BBC6762FFFC3394DCB0570CCEFB1970 /* iMessageExtension.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - CFBP_4930089528 /* Embed Frameworks */ = { + CFBP_CB2355266C8BAA9C97863011F3DE05A2 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - BF_552913093094 /* Framework.framework in Embed Frameworks */, - BF_897881229855 /* Alamofire.framework in Embed Frameworks */, + BF_F6FBB97A7DE0F6D06661A00E3B22E8CF /* Framework.framework in Embed Frameworks */, + BF_8765851BF5D99B10C220DDD57B968B10 /* Result.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - CFBP_5460766702 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - BF_870702193513 /* iMessageExtension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - CFBP_6493932244 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - BF_905038616071 /* Framework.framework in Embed Frameworks */, - BF_461044234706 /* SomeFramework.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - CFBP_7191905390 /* CopyFiles */ = { + CFBP_CC1EF1963551F7E08925519982C248B9 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = "include/$(PRODUCT_NAME)"; dstSubfolderSpec = 16; files = ( - BF_807556340853 /* Empty.h in CopyFiles */, + BF_2356EAE09301354149D45720369BE7F2 /* StaticLibrary_ObjC.h in CopyFiles */, + BF_1C8AAB7468188315681C0879591969B4 /* module.modulemap in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; - CFBP_8368933518 /* CopyFiles */ = { + CFBP_CC737A6BF6243B189B109606B0C4B5A2 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; dstSubfolderSpec = 16; files = ( - BF_308631758818 /* XPC Service.xpc in CopyFiles */, - BF_518775144316 /* SomeXPCService.xpc in CopyFiles */, + BF_D0D1D142403C75D11757CB7092E8D035 /* XPC Service.xpc in CopyFiles */, + BF_67219751DE020023F9D6068EDCCDC445 /* SomeXPCService.xpc in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CFBP_D7E07645BC437C4DFBB212DFC4F3B09E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + BF_90F0E9253F2768C312B65530931CD55A /* Empty.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - FR_118219888726 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = ""; }; - FR_123503999387 /* App_iOS_UITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_145531354566 /* TestProjectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectUITests.swift; sourceTree = ""; }; - FR_151462316179 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - FR_172952167809 /* FrameworkFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkFile.swift; sourceTree = ""; }; - FR_183521624014 /* MyFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyFramework.h; sourceTree = ""; }; - FR_196911129660 /* MoreUnder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreUnder.swift; sourceTree = ""; }; - FR_201160695646 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; - FR_229826849033 /* SomeXPCService.xpc */ = {isa = PBXFileReference; path = SomeXPCService.xpc; sourceTree = ""; }; - FR_232605427418 /* Mintfile */ = {isa = PBXFileReference; path = Mintfile; sourceTree = ""; }; - FR_238161558082 /* MyBundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = MyBundle.bundle; sourceTree = ""; }; - FR_247808626608 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_256263906698 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - FR_257073931060 /* ResourceFolder */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ResourceFolder; path = Resources/ResourceFolder; sourceTree = SOURCE_ROOT; }; - FR_257516580010 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; - FR_263408310401 /* Model 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 3.xcdatamodel"; sourceTree = ""; }; - FR_264279911176 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; - FR_293137352077 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_304712043717 /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; - FR_310979699934 /* MessagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesViewController.swift; sourceTree = ""; }; - FR_324671077936 /* App_watchOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App_watchOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_340586388409 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; - FR_363921640403 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = ""; }; - FR_376569054786 /* XPC Service.xpc */ = {isa = PBXFileReference; includeInIndex = 0; path = "XPC Service.xpc"; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_377082606829 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - FR_399755008402 /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = archive.ar; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_408537768279 /* StandaloneAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = StandaloneAssets.xcassets; sourceTree = ""; }; - FR_410645050443 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; - FR_437179166843 /* StaticLibrary_Swift.a */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = archive.ar; path = StaticLibrary_Swift.a; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_438704538506 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_452853029807 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; - FR_461737784133 /* module.modulemap */ = {isa = PBXFileReference; path = module.modulemap; sourceTree = ""; }; - FR_470929579339 /* StaticLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaticLibrary.swift; sourceTree = ""; }; - FR_472296042419 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_473000061463 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; - FR_479281060337 /* Folder */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Folder; sourceTree = SOURCE_ROOT; }; - FR_480982116789 /* App_macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App_macOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_481575785861 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - FR_500792082643 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = ""; }; - FR_505327409380 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_507023492251 /* App_watchOS Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "App_watchOS Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_525119120469 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_530852296303 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_570918052822 /* Model.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Model.xcdatamodel; sourceTree = ""; }; - FR_587738154368 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - FR_602633703434 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; - FR_602719163945 /* XPC_Service.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPC_Service.m; sourceTree = ""; }; - FR_602719163962 /* XPC_Service.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPC_Service.h; sourceTree = ""; }; - FR_609193904586 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - FR_618687462494 /* iMessageExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = iMessageExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_635802719871 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; - FR_643034527839 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_654302359039 /* SomeFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SomeFramework.framework; path = Vendor/SomeFramework.framework; sourceTree = ""; }; - FR_655678458041 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_660690926982 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = ""; }; - FR_662315837182 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_665156855283 /* module.modulemap */ = {isa = PBXFileReference; path = module.modulemap; sourceTree = ""; }; - FR_675266829517 /* Standalone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Standalone.swift; sourceTree = ""; }; - FR_698230898030 /* StaticLibrary_ObjC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StaticLibrary_ObjC.h; sourceTree = ""; }; - "FR_698230898030-1" /* StaticLibrary_ObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StaticLibrary_ObjC.m; sourceTree = ""; }; - FR_722239415598 /* TestProjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectTests.swift; sourceTree = ""; }; - FR_725187762757 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_739513596122 /* XPC_ServiceProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPC_ServiceProtocol.h; sourceTree = ""; }; - FR_746876637628 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.stringsdict; sourceTree = ""; }; - FR_748548478992 /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; - FR_752394658615 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; - FR_771029596306 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - FR_775316160345 /* SomeFile */ = {isa = PBXFileReference; path = SomeFile; sourceTree = ""; }; - FR_783122899910 /* App_iOS_Tests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_796781152159 /* Model 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 2.xcdatamodel"; sourceTree = ""; }; - FR_803921963291 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_815403394914 /* Headers */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Headers; sourceTree = SOURCE_ROOT; }; - FR_825232110500 /* App_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_830053537293 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - FR_837374194182 /* Empty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Empty.h; sourceTree = ""; }; - FR_854336462818 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - FR_868653349092 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - FR_935153865209 /* iMessageApp.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = iMessageApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - FR_948931241088 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR_987043315473 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_05405007CB77B2E003B19B89401C12AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_0570C52FB0BC489485EAF0CE7B7119A1 /* iMessageExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = iMessageExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_07C0A7866967FA47B3F2777BF4AB694A /* XPC_Service.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPC_Service.h; sourceTree = ""; }; + FR_0823766D9A1DAB5D3F9CC04A9B35FA3E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_099E2C49D4A0B799E78B39C47FBEADF7 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_0A30B76CD8B0A84B8C488FABC16C4682 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_11478908A963CED036DABEF21D85DF01 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + FR_11E95FCD1DEB0C8A01A053518C1DAA8E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + FR_16B791CFA2095097A17CC216977DF6EF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_1B0304C0E4DC73614BAA550E4A80D41C /* ResourceFolder */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ResourceFolder; path = Resources/ResourceFolder; sourceTree = SOURCE_ROOT; }; + FR_1C00E09FA3D2CDB962FE8D5584853E0D /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_1EA1EAB0CB9BD96BC550879E58911B12 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_1FA381C639CE4923ED6845790A5DF9D2 /* XPC Service.xpc */ = {isa = PBXFileReference; includeInIndex = 0; path = "XPC Service.xpc"; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_22A431E337CB22CE70E39135206EDE27 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = ""; }; + FR_257D977B4221AB25C1EC0ACD6128A89B /* App_iOS_UITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_25BDF725104C5E280D45CBF33F54C72C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkFile.swift; sourceTree = ""; }; + FR_2649A01C17A7301DD72EA826604ED8AA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + FR_291D6D09ACADC420638E83BEE89DFFEB /* MyBundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = MyBundle.bundle; sourceTree = ""; }; + FR_2F56FD7A1F7782467AC9F315B6133468 /* SomeFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SomeFramework.framework; path = Vendor/SomeFramework.framework; sourceTree = ""; }; + FR_30E7940EF436086816B40DAC068BD238 /* App_watchOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App_watchOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_3305E7E3B08D04C667D02BD29D3A45A9 /* iMessageApp.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = iMessageApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_347062562C9C212A082B1326BBCDC71B /* Model 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 2.xcdatamodel"; sourceTree = ""; }; + FR_35B9B5E8A2ED60FBB9CED8AE515B16B5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = ""; }; + FR_36044227861B95AC5060E7D063BED65A /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = archive.ar; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_3744DA35690747A918CC896E2354C59D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_3B4065B548BFD8CFB3D1153F7106DDA3 /* Folder */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Folder; sourceTree = SOURCE_ROOT; }; + FR_3B708FF662F6F7D8E4FABBB1B3F33604 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_3DD4DE355C21662A9169EE41C44F73E3 /* Headers */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Headers; sourceTree = SOURCE_ROOT; }; + FR_3ED99EEAF978C071491E281B8EAFD249 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_41E1155D8A7FDD97B783A1D5B3AD2C5B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_426E58636FD3B81A8F45788D3E65BC50 /* StaticLibrary_Swift.a */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = archive.ar; path = StaticLibrary_Swift.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_4B58A01ABBE8E0A56B7B5A539C9BF5C7 /* Base */ = {isa = PBXFileReference; name = Base; path = Base.lproj/Localizable.stringsdict; sourceTree = ""; }; + FR_4DB225C7FF39C16EEFD9A1A5595FCDBC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + FR_4EB4AAACD714C13E5BC894C71B954299 /* SomeXPCService.xpc */ = {isa = PBXFileReference; path = SomeXPCService.xpc; sourceTree = ""; }; + FR_545DDE4AB557C8FAAD87775CD4271BDF /* App_watchOS Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "App_watchOS Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_58A974F0E117C1384FD1B5147E524659 /* Model.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Model.xcdatamodel; sourceTree = ""; }; + FR_5A840A83C22F13EBFE051C061E549F95 /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = archive.ar; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_5CFDEA59B939FA9F3CA4F775B9E6AD2B /* TestProjectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectUITests.swift; sourceTree = ""; }; + FR_5E4B4E53251DE2294715A48CC249EBFD /* Mintfile */ = {isa = PBXFileReference; path = Mintfile; sourceTree = ""; }; + FR_5FEC20FF753341FD0483E2E4C622DB05 /* MessagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesViewController.swift; sourceTree = ""; }; + FR_62ECE5A3D0F25415CB50A28226B91EBE /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + FR_640ADF15D2B92FDC35556B2E0934C21C /* App_macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App_macOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_654475F320EF1630562C841CA8B6938A /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_6643E0FE8DD9AAC71691A739070C6833 /* Model 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 3.xcdatamodel"; sourceTree = ""; }; + FR_6A3D8067EBC18CB321826EB21FEBD094 /* libc++.tbd */ = {isa = PBXFileReference; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + FR_752FB5DFFBC490CFB9742549A0C48527 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + FR_7532DD7B78451A5040048474AC4FBCCC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FR_7C782E8FBF41DE8BB1E3789DF2C8C1F7 /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; + FR_7C8280C3C5E1D43BBB12A5F0156A8305 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + FR_7F4496C534F2DF8C4FB9A8D52414990B /* XPC_Service.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPC_Service.m; sourceTree = ""; }; + FR_81A08F81FED7C42DC346B9611ECD21AA /* XPC_ServiceProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPC_ServiceProtocol.h; sourceTree = ""; }; + FR_82E3C6C060C4487B5177509917C3FAE3 /* Standalone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Standalone.swift; sourceTree = ""; }; + FR_89162821C7F86126DC7F165E93E0DD23 /* App_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_8B770F475242D91FC20289A3B35CD165 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + FR_96127F4D9D804B89024AB846F0961621 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.module; path = module.modulemap; sourceTree = ""; }; + FR_98BB4C8D33EB0E666C136ACD08B21EB3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_9A09F93850576AF57455BE58FD53C42F /* Contacts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Contacts.framework; path = System/Library/Frameworks/Contacts.framework; sourceTree = SDKROOT; }; + FR_9B4B00A3CDADD50167B2393562AEBAB2 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.module; path = module.modulemap; sourceTree = ""; }; + FR_A0867B127ACF3ED382EB2FD5133D3EA8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_A0DA89632C14F8DF99F15196E6EBB7D5 /* Framework2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_A51DE87AC269BC36016F9CAC32B4ECB2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = ""; }; + FR_A55A35F549FD72775C37ED05342812AA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyFramework.h; sourceTree = ""; }; + FR_ABEBA07AEF9FB6D7F5B6D94FD76FF330 /* StaticLibrary_ObjC.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = StaticLibrary_ObjC.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_AC5B2FCE520D5306B254D5857E15B6CB /* MoreUnder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreUnder.swift; sourceTree = ""; }; + FR_B243640A6F73B3F3D33ABD05ABDBC26B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_B537FEE8515090D3BA0F5CFF3BC76BB1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_B993F75B001AB1C272CE83CACC06F0E5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + FR_BB49B398F9291781A60DA963A0BF168C /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; + FR_BCEF8D29C9B93D3160D8D76DD368C8AD /* en */ = {isa = PBXFileReference; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; + FR_C2A280C4FA602E6610BCFB820602B69E /* StaticLibrary_ObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StaticLibrary_ObjC.m; sourceTree = ""; }; + FR_C5682A1371F91CBD1254C115F0439F12 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FR_C6A9DE885CAF350F6C9D0AC6F7324CD3 /* StandaloneAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = StandaloneAssets.xcassets; sourceTree = ""; }; + FR_C73B96CEEE97DE429C638EBD9C2F3D2B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + FR_C86A7EAE4DFF4327D1E7D32A597CA4AC /* SomeFile */ = {isa = PBXFileReference; path = SomeFile; sourceTree = ""; }; + FR_CB1D0F4BB53B8DEE921C6E232193A62B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_CC3A24A5C8E1815346752C5AB0745176 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = ""; }; + FR_CCC97AF230188CAF9B4A66324891CCAD /* StaticLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaticLibrary.swift; sourceTree = ""; }; + FR_CEAE8D9C3F3920D6EADE5455C188EAAE /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + FR_D0BE69522DB875ADB041E9135E0767CA /* StaticLibrary_ObjC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StaticLibrary_ObjC.h; sourceTree = ""; }; + FR_D5FDE9E6362055E854CE1D3980716A4C /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_D7B45FAEE40EE622B4FA9192609F9717 /* TestProjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectTests.swift; sourceTree = ""; }; + FR_DACDD51068A6E1B7D2470F3E27E5EB2C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_DBB69305458B16774C88720CDD3978E5 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; + FR_DBD29CA78CDBBEF69B2C39C6D23BBDA1 /* Empty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Empty.h; sourceTree = ""; }; + FR_DC1C8DE46218F90A3F4FD5F8DE4F0ABB /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; + FR_E3314150DA4CEFF65D69CF7DB678E845 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR_E7BC65B06A0819B53634C5CD51946D98 /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = ""; }; + FR_EBD99C110BD7AE780C87A31CF2E4E7DB /* App_iOS_Tests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_ED407ECED0DF010B1E787D238EA91A5D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR_EFD283107EDF836BF0D9F4EB3F9A0016 /* Framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Framework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR_F5353B71B99044C8C37D7601A8107195 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; + FR_F5436E663145426483F206F8A61400BC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FR_F861CF6DF133AAD164CBE6DF2C7CEBFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - FBP_32467107793 /* Frameworks */ = { + FBP_18D4325BBE506E88E1C742F57AECB0CD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF_415651546539 /* Alamofire.framework in Frameworks */, + BF_D2532BE2FA7D664875AD6E29A22269C0 /* Contacts.framework in Frameworks */, + BF_F8D73622DA7CFF30DB9AD17C08C63655 /* Framework2.framework in Frameworks */, + BF_0378AD9857D61219363F74B2FA308B5A /* Framework.framework in Frameworks */, + BF_B8E824A58BFE0B81E16BB26087FDC8B4 /* Result.framework in Frameworks */, + BF_42C8B667C3B7417C14B063AF0F16C1A6 /* StaticLibrary_ObjC.a in Frameworks */, + BF_93A4E1A93C7DB4289E526466D547E55E /* SomeFramework.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FBP_43870453850 /* Frameworks */ = { + FBP_1BDCD6E0245ED2400E6FE9AC9C334DE4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF_898051828670 /* Alamofire.framework in Frameworks */, + BF_BD2537A230BFC8A86681F0AF34C929DA /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FBP_47229604241 /* Frameworks */ = { + FBP_4E773D46F6F726BBC0032C576D02FCB7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF_742449020987 /* Alamofire.framework in Frameworks */, + BF_9743BCF98E3EF021AB384652DA126416 /* Contacts.framework in Frameworks */, + BF_6E2D4086A22C12D516A06AE66DC48D16 /* Framework.framework in Frameworks */, + BF_230439786C4C6849F488A5FADC6A42A5 /* Result.framework in Frameworks */, + BF_36BCFE51A59D5EAE19684491C9F5427F /* StaticLibrary_ObjC.a in Frameworks */, + BF_486398284252AEE9001DD72E5E710D93 /* libc++.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FBP_48098211678 /* Frameworks */ = { + FBP_71D96680A2FBE24C4C8BD0B5E55FE034 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF_535236390262 /* Alamofire.framework in Frameworks */, - BF_597639300414 /* Framework.framework in Frameworks */, - BF_770495922915 /* StaticLibrary_ObjC.a in Frameworks */, + BF_ED8BB47A2229EC3BEE544608267FB82D /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FBP_50702349225 /* Frameworks */ = { + FBP_935BCDE6C86D2D59A945DC1E6886D7C3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF_217053936758 /* Alamofire.framework in Frameworks */, + BF_B5446C54E942A18E025D2061A88004A4 /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FBP_52511912046 /* Frameworks */ = { + FBP_98B76E46D78FD48FB47A41B8891665BC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF_854691035877 /* Alamofire.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FBP_66231583718 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BF_139519317795 /* Alamofire.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FBP_82523211050 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BF_458111705914 /* Alamofire.framework in Frameworks */, - BF_324363145049 /* Framework.framework in Frameworks */, - BF_943177036061 /* StaticLibrary_ObjC.a in Frameworks */, - BF_215463341392 /* SomeFramework.framework in Frameworks */, + BF_86F2552DA1E230901EC4CB1A40399019 /* Result.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - G_1235039993875 /* App_iOS_UITests */ = { + G_089F5A7E7FB159719FE19B5E84B85D5D /* App_watchOS Extension */ = { isa = PBXGroup; children = ( - FR_643034527839 /* Info.plist */, - FR_145531354566 /* TestProjectUITests.swift */, - ); - path = App_iOS_UITests; - sourceTree = ""; - }; - G_1646573205915 /* iMessage MessagesExtension */ = { - isa = PBXGroup; - children = ( - FR_830053537293 /* Assets.xcassets */, - FR_948931241088 /* Info.plist */, - VG_201160695646 /* MainInterface.storyboard */, - FR_310979699934 /* MessagesViewController.swift */, - ); - path = "iMessage MessagesExtension"; - sourceTree = ""; - }; - G_1885780145626 /* CopyFiles */ = { - isa = PBXGroup; - children = ( - FR_837374194182 /* Empty.h */, - ); - path = CopyFiles; - sourceTree = ""; - }; - G_1952740716080 /* Frameworks */ = { - isa = PBXGroup; - children = ( - G_2883690153011 /* Carthage */, - FR_654302359039 /* SomeFramework.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - G_2262017438925 /* iOS */ = { - isa = PBXGroup; - children = ( - FR_410645050443 /* Alamofire.framework */, - ); - path = iOS; - sourceTree = ""; - }; - G_2262017442691 /* Mac */ = { - isa = PBXGroup; - children = ( - FR_257516580010 /* Alamofire.framework */, - ); - path = Mac; - sourceTree = ""; - }; - G_2883690153011 /* Carthage */ = { - isa = PBXGroup; - children = ( - G_2262017438925 /* iOS */, - G_2262017442691 /* Mac */, - G_8628897169668 /* tvOS */, - G_8244488572839 /* watchOS */, - ); - name = Carthage; - path = Carthage/Build; - sourceTree = ""; - }; - G_3234630030493 /* FileGroup */ = { - isa = PBXGroup; - children = ( - G_8030722683864 /* UnderFileGroup */, - ); - path = FileGroup; - sourceTree = ""; - }; - G_3246710779368 /* App_watchOS */ = { - isa = PBXGroup; - children = ( - FR_587738154368 /* Assets.xcassets */, - FR_293137352077 /* Info.plist */, - VG_264279911176 /* Interface.storyboard */, - ); - path = App_watchOS; - sourceTree = ""; - }; - G_3765690547864 /* XPC Service */ = { - isa = PBXGroup; - children = ( - FR_803921963291 /* Info.plist */, - FR_151462316179 /* main.m */, - FR_602719163962 /* XPC_Service.h */, - FR_602719163945 /* XPC_Service.m */, - FR_739513596122 /* XPC_ServiceProtocol.h */, - ); - path = "XPC Service"; - sourceTree = ""; - }; - G_3997550084026 /* StaticLibrary_ObjC */ = { - isa = PBXGroup; - children = ( - G_5938599606592 /* Module */, - FR_698230898030 /* StaticLibrary_ObjC.h */, - "FR_698230898030-1" /* StaticLibrary_ObjC.m */, - ); - path = StaticLibrary_ObjC; - sourceTree = ""; - }; - G_4371791668439 /* StaticLibrary_Swift */ = { - isa = PBXGroup; - children = ( - FR_470929579339 /* StaticLibrary.swift */, - ); - path = StaticLibrary_Swift; - sourceTree = ""; - }; - G_4661500274312 /* Framework */ = { - isa = PBXGroup; - children = ( - FR_172952167809 /* FrameworkFile.swift */, - FR_247808626608 /* Info.plist */, - FR_183521624014 /* MyFramework.h */, - ); - path = Framework; - sourceTree = ""; - }; - G_4793969390202 /* Vendor */ = { - isa = PBXGroup; - children = ( - FR_229826849033 /* SomeXPCService.xpc */, - ); - path = Vendor; - sourceTree = ""; - }; - G_5070234922517 /* App_watchOS Extension */ = { - isa = PBXGroup; - children = ( - FR_987043315473 /* Assets.xcassets */, - FR_340586388409 /* ExtensionDelegate.swift */, - FR_530852296303 /* Info.plist */, - FR_363921640403 /* InterfaceController.swift */, - FR_304712043717 /* NotificationController.swift */, - FR_748548478992 /* PushNotificationPayload.apns */, + FR_B243640A6F73B3F3D33ABD05ABDBC26B /* Assets.xcassets */, + FR_DBB69305458B16774C88720CDD3978E5 /* ExtensionDelegate.swift */, + FR_3744DA35690747A918CC896E2354C59D /* Info.plist */, + FR_CC3A24A5C8E1815346752C5AB0745176 /* InterfaceController.swift */, + FR_BB49B398F9291781A60DA963A0BF168C /* NotificationController.swift */, + FR_7C782E8FBF41DE8BB1E3789DF2C8C1F7 /* PushNotificationPayload.apns */, ); path = "App_watchOS Extension"; sourceTree = ""; }; - G_5938599606592 /* Module */ = { + G_0D2DDBB1C39493B8B0EAF9CC23272F2D /* Framework */ = { isa = PBXGroup; children = ( - FR_665156855283 /* module.modulemap */, + FR_261C31660333EF514356EFCBDB368EAB /* FrameworkFile.swift */, + FR_F861CF6DF133AAD164CBE6DF2C7CEBFF /* Info.plist */, + FR_A957DAE2193BE1E970F452BFEFF3EBF6 /* MyFramework.h */, ); - path = Module; + path = Framework; sourceTree = ""; }; - G_6651250437419 /* StandaloneFiles */ = { + G_23236546763854F4301D7847EBA0A2BF /* XPC Service */ = { isa = PBXGroup; children = ( - FR_675266829517 /* Standalone.swift */, - FR_408537768279 /* StandaloneAssets.xcassets */, + FR_98BB4C8D33EB0E666C136ACD08B21EB3 /* Info.plist */, + FR_F5436E663145426483F206F8A61400BC /* main.m */, + FR_07C0A7866967FA47B3F2777BF4AB694A /* XPC_Service.h */, + FR_7F4496C534F2DF8C4FB9A8D52414990B /* XPC_Service.m */, + FR_81A08F81FED7C42DC346B9611ECD21AA /* XPC_ServiceProtocol.h */, ); - path = StandaloneFiles; + path = "XPC Service"; sourceTree = ""; }; - G_7189434949822 /* Resources */ = { + G_26EB72A03E79484F94412C6DF07B2C65 /* iOS */ = { isa = PBXGroup; children = ( - FR_238161558082 /* MyBundle.bundle */, + FR_CEAE8D9C3F3920D6EADE5455C188EAAE /* Result.framework */, ); - path = Resources; + path = iOS; sourceTree = ""; }; - G_7831228999101 /* App_iOS_Tests */ = { + G_2C00D0D23CBE29FF5F6DFEB95CBF2ECA /* UnderFileGroup */ = { isa = PBXGroup; children = ( - FR_655678458041 /* Info.plist */, - FR_722239415598 /* TestProjectTests.swift */, - ); - path = App_iOS_Tests; - sourceTree = ""; - }; - G_8030722683864 /* UnderFileGroup */ = { - isa = PBXGroup; - children = ( - FR_196911129660 /* MoreUnder.swift */, + FR_AC5B2FCE520D5306B254D5857E15B6CB /* MoreUnder.swift */, ); path = UnderFileGroup; sourceTree = ""; }; - G_8244488572839 /* watchOS */ = { + G_322C327C1DB8AE7E0B99EF59318DFE22 /* Resources */ = { isa = PBXGroup; children = ( - FR_752394658615 /* Alamofire.framework */, + FR_291D6D09ACADC420638E83BEE89DFFEB /* MyBundle.bundle */, ); - path = watchOS; + path = Resources; sourceTree = ""; }; - G_8252321105004 /* App */ = { + G_3569DDFAF0CD0D2E17F8D05B12F9A7BA /* tvOS */ = { isa = PBXGroup; children = ( - FR_854336462818 /* AppDelegate.swift */, - FR_868653349092 /* Assets.xcassets */, - FR_725187762757 /* Info.plist */, - VG_256263906698 /* LaunchScreen.storyboard */, - VG_473000061463 /* Localizable.strings */, - VG_746876637628 /* Localizable.stringsdict */, - VG_118219888726 /* LocalizedStoryboard.storyboard */, - VG_609193904586 /* Main.storyboard */, - VG_229021855709 /* Model.xcdatamodeld */, - FR_461737784133 /* module.modulemap */, - FR_481575785861 /* ViewController.swift */, + FR_8B770F475242D91FC20289A3B35CD165 /* Result.framework */, + ); + path = tvOS; + sourceTree = ""; + }; + G_373C03E19EC66ABB051FC35B4E57A52E /* App_iOS_UITests */ = { + isa = PBXGroup; + children = ( + FR_0823766D9A1DAB5D3F9CC04A9B35FA3E /* Info.plist */, + FR_5CFDEA59B939FA9F3CA4F775B9E6AD2B /* TestProjectUITests.swift */, + ); + path = App_iOS_UITests; + sourceTree = ""; + }; + G_415E92CCC7C77CD8BB161FA75E8B66EF /* iMessage MessagesExtension */ = { + isa = PBXGroup; + children = ( + FR_16B791CFA2095097A17CC216977DF6EF /* Assets.xcassets */, + FR_E3314150DA4CEFF65D69CF7DB678E845 /* Info.plist */, + VG_06DC429EEFBBA25BC3EE1AA1B4062C10 /* MainInterface.storyboard */, + FR_5FEC20FF753341FD0483E2E4C622DB05 /* MessagesViewController.swift */, + ); + path = "iMessage MessagesExtension"; + sourceTree = ""; + }; + G_4401384B8D17D0B62305BE82DE0660D2 /* App_iOS_Tests */ = { + isa = PBXGroup; + children = ( + FR_CB1D0F4BB53B8DEE921C6E232193A62B /* Info.plist */, + FR_D7B45FAEE40EE622B4FA9192609F9717 /* TestProjectTests.swift */, + ); + path = App_iOS_Tests; + sourceTree = ""; + }; + G_4A1045347B09A484656D26436E35FDCC /* StaticLibrary_ObjC */ = { + isa = PBXGroup; + children = ( + G_AFE0E055A99B8BF7C44E69B9B69889C8 /* Module */, + FR_D0BE69522DB875ADB041E9135E0767CA /* StaticLibrary_ObjC.h */, + FR_C2A280C4FA602E6610BCFB820602B69E /* StaticLibrary_ObjC.m */, + ); + path = StaticLibrary_ObjC; + sourceTree = ""; + }; + G_54CAD56F6F3EAD10E9DB8D50B52D09F3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + G_A1CE8BFBEAC6AFDC64D7068C3CE11421 /* Carthage */, + FR_9A09F93850576AF57455BE58FD53C42F /* Contacts.framework */, + FR_6A3D8067EBC18CB321826EB21FEBD094 /* libc++.tbd */, + FR_2F56FD7A1F7782467AC9F315B6133468 /* SomeFramework.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + G_68375B6CA3E19FBBA0246B55B60849C0 /* App_macOS */ = { + isa = PBXGroup; + children = ( + FR_4DB225C7FF39C16EEFD9A1A5595FCDBC /* AppDelegate.swift */, + FR_A55A35F549FD72775C37ED05342812AA /* Assets.xcassets */, + FR_3ED99EEAF978C071491E281B8EAFD249 /* Info.plist */, + VG_14B7B5469AA17939993A2B25E775D391 /* Main.storyboard */, + FR_25BDF725104C5E280D45CBF33F54C72C /* ViewController.swift */, + ); + path = App_macOS; + sourceTree = ""; + }; + G_77F9CDD1713BAEF02DF44C1EA19D86B8 /* Mac */ = { + isa = PBXGroup; + children = ( + FR_11478908A963CED036DABEF21D85DF01 /* Result.framework */, + ); + path = Mac; + sourceTree = ""; + }; + G_7C1E92BE8CA995A6B0952C8AE6F5ADF9 /* App_watchOS */ = { + isa = PBXGroup; + children = ( + FR_ED407ECED0DF010B1E787D238EA91A5D /* Assets.xcassets */, + FR_DACDD51068A6E1B7D2470F3E27E5EB2C /* Info.plist */, + VG_6542B94EE7DA40CD30BC54DED26C61C7 /* Interface.storyboard */, + ); + path = App_watchOS; + sourceTree = ""; + }; + G_81658721738C48797F805CC891E70B6F /* Configs */ = { + isa = PBXGroup; + children = ( + FR_F5353B71B99044C8C37D7601A8107195 /* base.xcconfig */, + FR_22A431E337CB22CE70E39135206EDE27 /* config.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + G_8F5765334752A7E52B1E63ACAC466729 /* App */ = { + isa = PBXGroup; + children = ( + FR_E7BC65B06A0819B53634C5CD51946D98 /* App.entitlements */, + FR_B993F75B001AB1C272CE83CACC06F0E5 /* AppDelegate.swift */, + FR_A0867B127ACF3ED382EB2FD5133D3EA8 /* Assets.xcassets */, + FR_05405007CB77B2E003B19B89401C12AB /* Info.plist */, + VG_F256536BB07CF3E64C4DD934F75BED9C /* LaunchScreen.storyboard */, + VG_BE436BDD64E90EFB600D47AC69B49DD3 /* Localizable.strings */, + VG_C247AA37E9057916EDDC65C7B55E2F38 /* Localizable.stringsdict */, + VG_FE6D89DA2D7E7F58340D566590FF221C /* LocalizedStoryboard.storyboard */, + VG_30676EBEE9BE54AA26CAE69BE744CAE8 /* Main.storyboard */, + VG_EB676136B9F946373D4796800CC00AD4 /* Model.xcdatamodeld */, + FR_9B4B00A3CDADD50167B2393562AEBAB2 /* module.modulemap */, + FR_752FB5DFFBC490CFB9742549A0C48527 /* ViewController.swift */, ); name = App; path = App_iOS; sourceTree = ""; }; - G_8268950006174 /* iMessage */ = { + G_9DEB15811B31C2D4D4B63339FBE33149 /* FileGroup */ = { isa = PBXGroup; children = ( - FR_377082606829 /* Assets.xcassets */, - FR_505327409380 /* Info.plist */, + G_2C00D0D23CBE29FF5F6DFEB95CBF2ECA /* UnderFileGroup */, ); - path = iMessage; + path = FileGroup; sourceTree = ""; }; - G_8340618952527 /* Configs */ = { + G_9E36E5E1B7BEC6A8D683D2E36CE21BCE /* CopyFiles */ = { isa = PBXGroup; children = ( - FR_635802719871 /* base.xcconfig */, - FR_660690926982 /* config.xcconfig */, + FR_DBD29CA78CDBBEF69B2C39C6D23BBDA1 /* Empty.h */, ); - path = Configs; + path = CopyFiles; sourceTree = ""; }; - G_8448771205358 = { + G_A1CE8BFBEAC6AFDC64D7068C3CE11421 /* Carthage */ = { isa = PBXGroup; children = ( - G_8252321105004 /* App */, - G_7831228999101 /* App_iOS_Tests */, - G_1235039993875 /* App_iOS_UITests */, - G_3246710779368 /* App_watchOS */, - G_5070234922517 /* App_watchOS Extension */, - G_8340618952527 /* Configs */, - G_1885780145626 /* CopyFiles */, - G_3234630030493 /* FileGroup */, - G_4661500274312 /* Framework */, - G_8268950006174 /* iMessage */, - G_1646573205915 /* iMessage MessagesExtension */, - G_7189434949822 /* Resources */, - G_6651250437419 /* StandaloneFiles */, - G_3997550084026 /* StaticLibrary_ObjC */, - G_4371791668439 /* StaticLibrary_Swift */, - G_4793969390202 /* Vendor */, - G_3765690547864 /* XPC Service */, - FR_479281060337 /* Folder */, - FR_815403394914 /* Headers */, - FR_232605427418 /* Mintfile */, - FR_257073931060 /* ResourceFolder */, - FR_775316160345 /* SomeFile */, - G_1952740716080 /* Frameworks */, - G_8620238527590 /* Products */, + G_26EB72A03E79484F94412C6DF07B2C65 /* iOS */, + G_77F9CDD1713BAEF02DF44C1EA19D86B8 /* Mac */, + G_3569DDFAF0CD0D2E17F8D05B12F9A7BA /* tvOS */, + G_CC8E08E619EF6EA96B28904C6651F6B8 /* watchOS */, + ); + name = Carthage; + path = Carthage/Build; + sourceTree = ""; + }; + G_AFE0E055A99B8BF7C44E69B9B69889C8 /* Module */ = { + isa = PBXGroup; + children = ( + FR_96127F4D9D804B89024AB846F0961621 /* module.modulemap */, + ); + path = Module; + sourceTree = ""; + }; + G_B0D2DFD450BCF614AA46E474644F2CE3 /* Products */ = { + isa = PBXGroup; + children = ( + FR_EBD99C110BD7AE780C87A31CF2E4E7DB /* App_iOS_Tests.xctest */, + FR_257D977B4221AB25C1EC0ACD6128A89B /* App_iOS_UITests.xctest */, + FR_89162821C7F86126DC7F165E93E0DD23 /* App_iOS.app */, + FR_640ADF15D2B92FDC35556B2E0934C21C /* App_macOS.app */, + FR_545DDE4AB557C8FAAD87775CD4271BDF /* App_watchOS Extension.appex */, + FR_30E7940EF436086816B40DAC068BD238 /* App_watchOS.app */, + FR_EFD283107EDF836BF0D9F4EB3F9A0016 /* Framework.framework */, + FR_099E2C49D4A0B799E78B39C47FBEADF7 /* Framework.framework */, + FR_D5FDE9E6362055E854CE1D3980716A4C /* Framework.framework */, + FR_654475F320EF1630562C841CA8B6938A /* Framework.framework */, + FR_1EA1EAB0CB9BD96BC550879E58911B12 /* Framework2.framework */, + FR_0A30B76CD8B0A84B8C488FABC16C4682 /* Framework2.framework */, + FR_3B708FF662F6F7D8E4FABBB1B3F33604 /* Framework2.framework */, + FR_A0DA89632C14F8DF99F15196E6EBB7D5 /* Framework2.framework */, + FR_3305E7E3B08D04C667D02BD29D3A45A9 /* iMessageApp.app */, + FR_0570C52FB0BC489485EAF0CE7B7119A1 /* iMessageExtension.appex */, + FR_36044227861B95AC5060E7D063BED65A /* StaticLibrary_ObjC.a */, + FR_1C00E09FA3D2CDB962FE8D5584853E0D /* StaticLibrary_ObjC.a */, + FR_5A840A83C22F13EBFE051C061E549F95 /* StaticLibrary_ObjC.a */, + FR_ABEBA07AEF9FB6D7F5B6D94FD76FF330 /* StaticLibrary_ObjC.a */, + FR_426E58636FD3B81A8F45788D3E65BC50 /* StaticLibrary_Swift.a */, + FR_1FA381C639CE4923ED6845790A5DF9D2 /* XPC Service.xpc */, + ); + name = Products; + sourceTree = ""; + }; + G_CBE9DB02095FA0DF8A7ECE76A4BD81A4 = { + isa = PBXGroup; + children = ( + G_8F5765334752A7E52B1E63ACAC466729 /* App */, + G_4401384B8D17D0B62305BE82DE0660D2 /* App_iOS_Tests */, + G_373C03E19EC66ABB051FC35B4E57A52E /* App_iOS_UITests */, + G_68375B6CA3E19FBBA0246B55B60849C0 /* App_macOS */, + G_7C1E92BE8CA995A6B0952C8AE6F5ADF9 /* App_watchOS */, + G_089F5A7E7FB159719FE19B5E84B85D5D /* App_watchOS Extension */, + G_81658721738C48797F805CC891E70B6F /* Configs */, + G_9E36E5E1B7BEC6A8D683D2E36CE21BCE /* CopyFiles */, + G_9DEB15811B31C2D4D4B63339FBE33149 /* FileGroup */, + G_0D2DDBB1C39493B8B0EAF9CC23272F2D /* Framework */, + G_DFE333D63D37FEA4C705A105F9FE0C2A /* iMessage */, + G_415E92CCC7C77CD8BB161FA75E8B66EF /* iMessage MessagesExtension */, + G_322C327C1DB8AE7E0B99EF59318DFE22 /* Resources */, + G_D0428A559D8B50225BCD0A3640D8B431 /* StandaloneFiles */, + G_4A1045347B09A484656D26436E35FDCC /* StaticLibrary_ObjC */, + G_CC2410394CB552EF47011133E3A148F5 /* StaticLibrary_Swift */, + G_EEC8BB7E2370237E3F5D64AA1BD42CC9 /* Vendor */, + G_23236546763854F4301D7847EBA0A2BF /* XPC Service */, + FR_3B4065B548BFD8CFB3D1153F7106DDA3 /* Folder */, + FR_3DD4DE355C21662A9169EE41C44F73E3 /* Headers */, + FR_5E4B4E53251DE2294715A48CC249EBFD /* Mintfile */, + FR_1B0304C0E4DC73614BAA550E4A80D41C /* ResourceFolder */, + FR_C86A7EAE4DFF4327D1E7D32A597CA4AC /* SomeFile */, + G_54CAD56F6F3EAD10E9DB8D50B52D09F3 /* Frameworks */, + G_B0D2DFD450BCF614AA46E474644F2CE3 /* Products */, ); indentWidth = 2; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; - G_8620238527590 /* Products */ = { + G_CC2410394CB552EF47011133E3A148F5 /* StaticLibrary_Swift */ = { isa = PBXGroup; children = ( - FR_783122899910 /* App_iOS_Tests.xctest */, - FR_123503999387 /* App_iOS_UITests.xctest */, - FR_825232110500 /* App_iOS.app */, - FR_480982116789 /* App_macOS.app */, - FR_507023492251 /* App_watchOS Extension.appex */, - FR_324671077936 /* App_watchOS.app */, - FR_525119120469 /* Framework.framework */, - FR_662315837182 /* Framework.framework */, - FR_438704538506 /* Framework.framework */, - FR_472296042419 /* Framework.framework */, - FR_935153865209 /* iMessageApp.app */, - FR_618687462494 /* iMessageExtension.appex */, - FR_399755008402 /* StaticLibrary_ObjC.a */, - FR_437179166843 /* StaticLibrary_Swift.a */, - FR_376569054786 /* XPC Service.xpc */, + FR_CCC97AF230188CAF9B4A66324891CCAD /* StaticLibrary.swift */, ); - name = Products; + path = StaticLibrary_Swift; sourceTree = ""; }; - G_8628897169668 /* tvOS */ = { + G_CC8E08E619EF6EA96B28904C6651F6B8 /* watchOS */ = { isa = PBXGroup; children = ( - FR_452853029807 /* Alamofire.framework */, + FR_DC1C8DE46218F90A3F4FD5F8DE4F0ABB /* Result.framework */, ); - path = tvOS; + path = watchOS; + sourceTree = ""; + }; + G_D0428A559D8B50225BCD0A3640D8B431 /* StandaloneFiles */ = { + isa = PBXGroup; + children = ( + FR_82E3C6C060C4487B5177509917C3FAE3 /* Standalone.swift */, + FR_C6A9DE885CAF350F6C9D0AC6F7324CD3 /* StandaloneAssets.xcassets */, + ); + path = StandaloneFiles; + sourceTree = ""; + }; + G_DFE333D63D37FEA4C705A105F9FE0C2A /* iMessage */ = { + isa = PBXGroup; + children = ( + FR_B537FEE8515090D3BA0F5CFF3BC76BB1 /* Assets.xcassets */, + FR_41E1155D8A7FDD97B783A1D5B3AD2C5B /* Info.plist */, + ); + path = iMessage; + sourceTree = ""; + }; + G_EEC8BB7E2370237E3F5D64AA1BD42CC9 /* Vendor */ = { + isa = PBXGroup; + children = ( + FR_4EB4AAACD714C13E5BC894C71B954299 /* SomeXPCService.xpc */, + ); + path = Vendor; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - HBP_43870453850 /* Headers */ = { + HBP_1A14716AFB45FE3C40861AEC5BFC7160 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BF_239684316986 /* Headers in Headers */, - BF_813358525536 /* MyFramework.h in Headers */, + BF_0A6C302954FF03411D6F2704ECF5C738 /* MyFramework.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - HBP_47229604241 /* Headers */ = { + HBP_28AB146B2409C5AB0F7A57873541C794 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BF_510053944904 /* Headers in Headers */, - BF_425679397292 /* MyFramework.h in Headers */, + BF_390908C547D6F8520DF9AA0CC5A98EB1 /* Headers in Headers */, + BF_BEFDF47CD7D88221A9C166BD65BF2013 /* MyFramework.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - HBP_52511912046 /* Headers */ = { + HBP_5B487D2A0AEF5F301CF0DD29039EC911 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BF_905617636654 /* Headers in Headers */, - BF_496472559782 /* MyFramework.h in Headers */, + BF_4EBBAD70FA73DDC89BD933866B90DD08 /* MyFramework.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - HBP_66231583718 /* Headers */ = { + HBP_7854F8DBCA44D8AB407768095D725CA7 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BF_259448131292 /* Headers in Headers */, - BF_734036107922 /* MyFramework.h in Headers */, + BF_EC0616A0D18A2F723D2AF50287C43669 /* Headers in Headers */, + BF_569CC068CD4B7BCE35E974D7B61566DB /* MyFramework.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + HBP_98CC32EF86CB88CC66AA4CD229EB6072 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_9830FFD35765AACD86D1B619E22830D6 /* Headers in Headers */, + BF_3B680DD27CFCD491675F1BF257A95A24 /* MyFramework.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + HBP_9DD85101234CF2E78A49044D618D1D80 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_7C9646667C0D479544A2207DEE3E930B /* Headers in Headers */, + BF_33EA0F8B2ADA2D24A683FCD8D6235B10 /* MyFramework.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + HBP_A3CA1B21BE2C36844B1C6BA4D2A20394 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_E35C9C198B45406E64439FF96C17F056 /* MyFramework.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + HBP_D19BC27B3521E3ED15AB860A9AC22D2A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_B6E31790D07B981E52CD5BC9049FE303 /* MyFramework.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXLegacyTarget section */ - LT_479264660374 /* Legacy */ = { + LT_5A51AFB390A610885D62F601DE321E4E /* Legacy */ = { isa = PBXLegacyTarget; - buildConfigurationList = CL_479264660374 /* Build configuration list for PBXLegacyTarget "Legacy" */; + buildConfigurationList = CL_F8A83116F913B5DD0538C3680E08BDDB /* Build configuration list for PBXLegacyTarget "Legacy" */; buildPhases = ( - SBP_47926466037 /* Sources */, + SBP_C18D008976BE0EFD3D3A3C68FB79D271 /* Sources */, ); buildToolPath = /usr/bin/true; dependencies = ( @@ -857,48 +963,44 @@ /* End PBXLegacyTarget section */ /* Begin PBXNativeTarget section */ - NT_123503999387 /* App_iOS_UITests */ = { + NT_15609BCEEB00CBCC4C42110EB0366A6F /* StaticLibrary_ObjC_macOS */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_123503999387 /* Build configuration list for PBXNativeTarget "App_iOS_UITests" */; + buildConfigurationList = CL_3BB54CFB2F2EFE7302C0B0709BD0AE04 /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_macOS" */; buildPhases = ( - SBP_12350399938 /* Sources */, - CFBP_4082141876 /* Embed Frameworks */, + CFBP_712E86A86BBF89DB5B5F3874B24B8996 /* CopyFiles */, + SBP_52AE5DCFB4487297D6889C7F014AD281 /* Sources */, ); buildRules = ( ); dependencies = ( - TD_676191581124 /* PBXTargetDependency */, ); - name = App_iOS_UITests; - productName = App_iOS_UITests; - productReference = FR_123503999387 /* App_iOS_UITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; + name = StaticLibrary_ObjC_macOS; + productName = StaticLibrary_ObjC_macOS; + productReference = FR_1C00E09FA3D2CDB962FE8D5584853E0D /* StaticLibrary_ObjC.a */; + productType = "com.apple.product-type.library.static"; }; - NT_324671077936 /* App_watchOS */ = { + NT_193BAF154270D1C21E269EDF2A1BD3F6 /* App_iOS_Tests */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_324671077936 /* Build configuration list for PBXNativeTarget "App_watchOS" */; + buildConfigurationList = CL_89763567DCA601C83E4C78A9917D81AD /* Build configuration list for PBXNativeTarget "App_iOS_Tests" */; buildPhases = ( - SBP_32467107793 /* Sources */, - RBP_32467107793 /* Resources */, - SSBP_5954948530 /* Carthage */, - FBP_32467107793 /* Frameworks */, - CFBP_4684049960 /* Embed App Extensions */, + SBP_70B2F11AAC526FDB99D68212C2C92CE6 /* Sources */, + CFBP_2FE0B34CC045616C815F2675387DA9D5 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( - TD_193291182921 /* PBXTargetDependency */, + TD_402541000CCC58970431E41C3D928AB8 /* PBXTargetDependency */, ); - name = App_watchOS; - productName = App_watchOS; - productReference = FR_324671077936 /* App_watchOS.app */; - productType = "com.apple.product-type.application.watchapp2"; + name = App_iOS_Tests; + productName = App_iOS_Tests; + productReference = FR_EBD99C110BD7AE780C87A31CF2E4E7DB /* App_iOS_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; - NT_376569054786 /* XPC Service */ = { + NT_23509FD082D1F788E6D6431F509B11AF /* XPC Service */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_376569054786 /* Build configuration list for PBXNativeTarget "XPC Service" */; + buildConfigurationList = CL_6993244897DFCCF1F61A6136FDBE3C01 /* Build configuration list for PBXNativeTarget "XPC Service" */; buildPhases = ( - SBP_37656905478 /* Sources */, + SBP_669CBAFD2D7234A2BEDCEAA4949ED575 /* Sources */, ); buildRules = ( ); @@ -906,31 +1008,15 @@ ); name = "XPC Service"; productName = "XPC Service"; - productReference = FR_376569054786 /* XPC Service.xpc */; + productReference = FR_1FA381C639CE4923ED6845790A5DF9D2 /* XPC Service.xpc */; productType = "com.apple.product-type.xpc-service"; }; - NT_399755008402 /* StaticLibrary_ObjC */ = { + NT_2940463C85DCD0660288786BC66F2C4C /* StaticLibrary_Swift */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_399755008402 /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC" */; + buildConfigurationList = CL_159255858B3EEC02844A3059326A6B93 /* Build configuration list for PBXNativeTarget "StaticLibrary_Swift" */; buildPhases = ( - CFBP_3265670993 /* CopyFiles */, - SBP_39975500840 /* Sources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = StaticLibrary_ObjC; - productName = StaticLibrary_ObjC; - productReference = FR_399755008402 /* StaticLibrary_ObjC.a */; - productType = "com.apple.product-type.library.static"; - }; - NT_437179166843 /* StaticLibrary_Swift */ = { - isa = PBXNativeTarget; - buildConfigurationList = CL_437179166843 /* Build configuration list for PBXNativeTarget "StaticLibrary_Swift" */; - buildPhases = ( - SBP_43717916684 /* Sources */, - SSBP_5390042403 /* Copy Swift Objective-C Interface Header */, + SBP_3DD17ED231CE07543581040F32049525 /* Sources */, + SSBP_4A83147402B05D3C84D21F0487315914 /* Copy Swift Objective-C Interface Header */, ); buildRules = ( ); @@ -938,75 +1024,50 @@ ); name = StaticLibrary_Swift; productName = StaticLibrary_Swift; - productReference = FR_437179166843 /* StaticLibrary_Swift.a */; + productReference = FR_426E58636FD3B81A8F45788D3E65BC50 /* StaticLibrary_Swift.a */; productType = "com.apple.product-type.library.static"; }; - NT_438704538506 /* Framework_watchOS */ = { + NT_34A020E43FBBD797051205235CD82B70 /* StaticLibrary_ObjC_watchOS */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_438704538506 /* Build configuration list for PBXNativeTarget "Framework_watchOS" */; + buildConfigurationList = CL_2E30D27084B352548CCAA3500158519B /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_watchOS" */; buildPhases = ( - HBP_43870453850 /* Headers */, - SBP_43870453850 /* Sources */, - FBP_43870453850 /* Frameworks */, - SSBP_2467869845 /* MyScript */, + CFBP_4DFB7882C9F8BAB250BB0A6B9457B4CC /* CopyFiles */, + SBP_924258C7A9F27B13508604CAF625E0D3 /* Sources */, ); buildRules = ( ); dependencies = ( - TD_784412347908 /* PBXTargetDependency */, ); - name = Framework_watchOS; - productName = Framework_watchOS; - productReference = FR_438704538506 /* Framework.framework */; - productType = "com.apple.product-type.framework"; + name = StaticLibrary_ObjC_watchOS; + productName = StaticLibrary_ObjC_watchOS; + productReference = FR_ABEBA07AEF9FB6D7F5B6D94FD76FF330 /* StaticLibrary_ObjC.a */; + productType = "com.apple.product-type.library.static"; }; - NT_472296042419 /* Framework_iOS */ = { + NT_38A9FE87056942A2746E0FF025B52A91 /* App_watchOS */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_472296042419 /* Build configuration list for PBXNativeTarget "Framework_iOS" */; + buildConfigurationList = CL_C50D7BB75115E8561A0975DE1B65E088 /* Build configuration list for PBXNativeTarget "App_watchOS" */; buildPhases = ( - HBP_47229604241 /* Headers */, - SBP_47229604241 /* Sources */, - FBP_47229604241 /* Frameworks */, - SSBP_3886691194 /* MyScript */, + SBP_ED63FCA00BD617EFF125ECDF9D24FAD8 /* Sources */, + RBP_5623703FDC4F6DF4679D8BAF27518F2F /* Resources */, + SSBP_7F147E7ED45BAAE2186975B7FF9EB08A /* Carthage */, + CFBP_469B033759EACBB99ECBF1008677C590 /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( - TD_667455552356 /* PBXTargetDependency */, + TD_2A43F973A3E1CF675A967054BA52074B /* PBXTargetDependency */, ); - name = Framework_iOS; - productName = Framework_iOS; - productReference = FR_472296042419 /* Framework.framework */; - productType = "com.apple.product-type.framework"; + name = App_watchOS; + productName = App_watchOS; + productReference = FR_30E7940EF436086816B40DAC068BD238 /* App_watchOS.app */; + productType = "com.apple.product-type.application.watchapp2"; }; - NT_480982116789 /* App_macOS */ = { + NT_5245AB6D3B3CFBC95AEBADF6E0C593B8 /* App_watchOS Extension */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_480982116789 /* Build configuration list for PBXNativeTarget "App_macOS" */; + buildConfigurationList = CL_333C6C3162FB671343E806257FB2A411 /* Build configuration list for PBXNativeTarget "App_watchOS Extension" */; buildPhases = ( - SBP_48098211678 /* Sources */, - CFBP_8368933518 /* CopyFiles */, - FBP_48098211678 /* Frameworks */, - CFBP_4930089528 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - TD_235580504123 /* PBXTargetDependency */, - TD_629038784927 /* PBXTargetDependency */, - TD_743784992411 /* PBXTargetDependency */, - ); - name = App_macOS; - productName = App_macOS; - productReference = FR_480982116789 /* App_macOS.app */; - productType = "com.apple.product-type.application"; - }; - NT_507023492251 /* App_watchOS Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = CL_507023492251 /* Build configuration list for PBXNativeTarget "App_watchOS Extension" */; - buildPhases = ( - SBP_50702349225 /* Sources */, - RBP_50702349225 /* Resources */, - FBP_50702349225 /* Frameworks */, + SBP_49F3C650EA105D1EF50817673A8DB33A /* Sources */, + RBP_1BFB64F249645ABF48C3CCDF8D5FA094 /* Resources */, ); buildRules = ( ); @@ -1014,34 +1075,31 @@ ); name = "App_watchOS Extension"; productName = "App_watchOS Extension"; - productReference = FR_507023492251 /* App_watchOS Extension.appex */; + productReference = FR_545DDE4AB557C8FAAD87775CD4271BDF /* App_watchOS Extension.appex */; productType = "com.apple.product-type.watchkit2-extension"; }; - NT_525119120469 /* Framework_macOS */ = { + NT_66B6A18138FD1FB5ECF3FC67B20FF3D3 /* Framework2_tvOS */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_525119120469 /* Build configuration list for PBXNativeTarget "Framework_macOS" */; + buildConfigurationList = CL_A55E6C4018D2631D41C660DBF2113765 /* Build configuration list for PBXNativeTarget "Framework2_tvOS" */; buildPhases = ( - HBP_52511912046 /* Headers */, - SBP_52511912046 /* Sources */, - FBP_52511912046 /* Frameworks */, - SSBP_8255377629 /* MyScript */, + HBP_A3CA1B21BE2C36844B1C6BA4D2A20394 /* Headers */, + SBP_DB9B8E1504ED9DD92AE41067C53B5082 /* Sources */, ); buildRules = ( ); dependencies = ( - TD_337103940101 /* PBXTargetDependency */, ); - name = Framework_macOS; - productName = Framework_macOS; - productReference = FR_525119120469 /* Framework.framework */; + name = Framework2_tvOS; + productName = Framework2_tvOS; + productReference = FR_3B708FF662F6F7D8E4FABBB1B3F33604 /* Framework2.framework */; productType = "com.apple.product-type.framework"; }; - NT_618687462494 /* iMessageExtension */ = { + NT_6A4FC6EE80FB2821AB96D51C3BC8966E /* iMessageExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_618687462494 /* Build configuration list for PBXNativeTarget "iMessageExtension" */; + buildConfigurationList = CL_3ABBEC1A6EFC98F40894F5E4769650EF /* Build configuration list for PBXNativeTarget "iMessageExtension" */; buildPhases = ( - SBP_61868746249 /* Sources */, - RBP_61868746249 /* Resources */, + SBP_110D7B4160D965B7964619BF78E01DE2 /* Sources */, + RBP_A5B7C086E8F07F5FEE9B99375E375819 /* Resources */, ); buildRules = ( ); @@ -1049,113 +1107,273 @@ ); name = iMessageExtension; productName = iMessageExtension; - productReference = FR_618687462494 /* iMessageExtension.appex */; + productReference = FR_0570C52FB0BC489485EAF0CE7B7119A1 /* iMessageExtension.appex */; productType = "com.apple.product-type.app-extension.messages"; }; - NT_662315837182 /* Framework_tvOS */ = { + NT_6A7B08EB167FD3A759C339FDBED7E019 /* Framework_watchOS */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_662315837182 /* Build configuration list for PBXNativeTarget "Framework_tvOS" */; + buildConfigurationList = CL_674C71F7D7B679C67A944F0110840758 /* Build configuration list for PBXNativeTarget "Framework_watchOS" */; buildPhases = ( - HBP_66231583718 /* Headers */, - SBP_66231583718 /* Sources */, - FBP_66231583718 /* Frameworks */, - SSBP_6331376344 /* MyScript */, + HBP_98CC32EF86CB88CC66AA4CD229EB6072 /* Headers */, + SBP_8990272D7DD45CFBDAB18690861BD4E8 /* Sources */, + FBP_71D96680A2FBE24C4C8BD0B5E55FE034 /* Frameworks */, + SSBP_B07F447D73408EA48C54A8E7F5B8D575 /* MyScript */, ); buildRules = ( ); dependencies = ( - TD_957476409477 /* PBXTargetDependency */, + TD_205ABD699FA8E05C47D73E8EB2D0F9EF /* PBXTargetDependency */, ); - name = Framework_tvOS; - productName = Framework_tvOS; - productReference = FR_662315837182 /* Framework.framework */; + name = Framework_watchOS; + productName = Framework_watchOS; + productReference = FR_654475F320EF1630562C841CA8B6938A /* Framework.framework */; productType = "com.apple.product-type.framework"; }; - NT_783122899910 /* App_iOS_Tests */ = { + NT_6AEE12F93D449E249F5348BBF35D3053 /* StaticLibrary_ObjC_iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_783122899910 /* Build configuration list for PBXNativeTarget "App_iOS_Tests" */; + buildConfigurationList = CL_F6ECF2D45799DBBB48DE9AE80AC280AA /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_iOS" */; buildPhases = ( - SBP_78312289991 /* Sources */, - CFBP_4626438721 /* Embed Frameworks */, + CFBP_0B6C520DAC94DDCE678BE15C53528F25 /* CopyFiles */, + SBP_D6209A702C851D0CFD1CC2B225986D45 /* Sources */, ); buildRules = ( ); dependencies = ( - TD_887143865471 /* PBXTargetDependency */, ); - name = App_iOS_Tests; - productName = App_iOS_Tests; - productReference = FR_783122899910 /* App_iOS_Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; + name = StaticLibrary_ObjC_iOS; + productName = StaticLibrary_ObjC_iOS; + productReference = FR_36044227861B95AC5060E7D063BED65A /* StaticLibrary_ObjC.a */; + productType = "com.apple.product-type.library.static"; }; - NT_825232110500 /* App_iOS */ = { + NT_6BD068FAAC6AA35C090C48147B94EC6E /* iMessageApp */ = { isa = PBXNativeTarget; - buildConfigurationList = CL_825232110500 /* Build configuration list for PBXNativeTarget "App_iOS" */; + buildConfigurationList = CL_AA475AE6741D5744A91627E7FAF4C986 /* Build configuration list for PBXNativeTarget "iMessageApp" */; buildPhases = ( - SBP_82523211050 /* Sources */, - RBP_82523211050 /* Resources */, - CFBP_7191905390 /* CopyFiles */, - SSBP_8106229290 /* Carthage */, - FBP_82523211050 /* Frameworks */, - CFBP_6493932244 /* Embed Frameworks */, - CFBP_2836118931 /* Embed Watch Content */, - SSBP_5106020372 /* Strip Unused Architectures from Frameworks */, - SSBP_8706434794 /* MyScript */, + SBP_20DDAC7BCD11ECA8B08695FE5D7314A9 /* Sources */, + RBP_9291220ECDCB98B69BB31C3E875042EC /* Resources */, + CFBP_AD91D17C63B2CD9AE7EFB9EFD62A8223 /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( - TD_824101787753 /* PBXTargetDependency */, - TD_109724965966 /* PBXTargetDependency */, - TD_721522128177 /* PBXTargetDependency */, - TD_288560876254 /* PBXTargetDependency */, - ); - name = App_iOS; - productName = App_iOS; - productReference = FR_825232110500 /* App_iOS.app */; - productType = "com.apple.product-type.application"; - }; - NT_935153865209 /* iMessageApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = CL_935153865209 /* Build configuration list for PBXNativeTarget "iMessageApp" */; - buildPhases = ( - SBP_93515386520 /* Sources */, - RBP_93515386520 /* Resources */, - CFBP_5460766702 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - TD_317921131342 /* PBXTargetDependency */, + TD_846DB03B9778D6C8E81FE52A5A212420 /* PBXTargetDependency */, ); name = iMessageApp; productName = iMessageApp; - productReference = FR_935153865209 /* iMessageApp.app */; + productReference = FR_3305E7E3B08D04C667D02BD29D3A45A9 /* iMessageApp.app */; productType = "com.apple.product-type.application.messages"; }; + NT_7D108AE86BED8C9CCF52C2646FA4C5DE /* Framework_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_9FEF3E411E281B1820B2B067FC1C1B85 /* Build configuration list for PBXNativeTarget "Framework_iOS" */; + buildPhases = ( + HBP_28AB146B2409C5AB0F7A57873541C794 /* Headers */, + SBP_0CB30551A2D40126958D8D6DAF6922E2 /* Sources */, + FBP_98B76E46D78FD48FB47A41B8891665BC /* Frameworks */, + SSBP_13B42B84708A6ABC082BE00176F5DCB2 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + TD_117F878FC368C83443CEC1707531F7F2 /* PBXTargetDependency */, + ); + name = Framework_iOS; + productName = Framework_iOS; + productReference = FR_EFD283107EDF836BF0D9F4EB3F9A0016 /* Framework.framework */; + productType = "com.apple.product-type.framework"; + }; + NT_87DF09E78830E7EB3C00B6134A2D5A5D /* Framework2_macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_289609080F2D20D506C8A587BC92807B /* Build configuration list for PBXNativeTarget "Framework2_macOS" */; + buildPhases = ( + HBP_5B487D2A0AEF5F301CF0DD29039EC911 /* Headers */, + SBP_C469AFC0C383156AF5C80EBBC089D9FC /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework2_macOS; + productName = Framework2_macOS; + productReference = FR_0A30B76CD8B0A84B8C488FABC16C4682 /* Framework2.framework */; + productType = "com.apple.product-type.framework"; + }; + NT_9D53AF351F8DAE25354F2391248DFCCA /* Framework_macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_7A3206BF9A92D4552AE40D148897BB3E /* Build configuration list for PBXNativeTarget "Framework_macOS" */; + buildPhases = ( + HBP_7854F8DBCA44D8AB407768095D725CA7 /* Headers */, + SBP_EA528A5DC6D79AA397B25949B07AE70F /* Sources */, + FBP_935BCDE6C86D2D59A945DC1E6886D7C3 /* Frameworks */, + SSBP_C8F56E533BE956498E644805330168EB /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + TD_BBB2D0EDFD9EF8193F1864D1F3D5F97A /* PBXTargetDependency */, + ); + name = Framework_macOS; + productName = Framework_macOS; + productReference = FR_099E2C49D4A0B799E78B39C47FBEADF7 /* Framework.framework */; + productType = "com.apple.product-type.framework"; + }; + NT_9F72C903B42E1AA3B88F97B917231B15 /* Framework2_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_0562279D56EF60E8CCC0973D2C663637 /* Build configuration list for PBXNativeTarget "Framework2_iOS" */; + buildPhases = ( + HBP_D19BC27B3521E3ED15AB860A9AC22D2A /* Headers */, + SBP_84E9A8BE77910B67B3F2DCD5916DC498 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework2_iOS; + productName = Framework2_iOS; + productReference = FR_1EA1EAB0CB9BD96BC550879E58911B12 /* Framework2.framework */; + productType = "com.apple.product-type.framework"; + }; + NT_A3933B4002C44B46F34B238F654D1362 /* Framework2_watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_E92E1636D45B284E44D38EB3EF7C98C9 /* Build configuration list for PBXNativeTarget "Framework2_watchOS" */; + buildPhases = ( + HBP_1A14716AFB45FE3C40861AEC5BFC7160 /* Headers */, + SBP_48868408A19D9BBE4A58CA4FAE00C0D4 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework2_watchOS; + productName = Framework2_watchOS; + productReference = FR_A0DA89632C14F8DF99F15196E6EBB7D5 /* Framework2.framework */; + productType = "com.apple.product-type.framework"; + }; + NT_B91A6EACD6F5192FECA2E95FD531D0CA /* App_macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_D72660834ED9ED4EB0E973ABC256E014 /* Build configuration list for PBXNativeTarget "App_macOS" */; + buildPhases = ( + SBP_7EE428F1F0444ACB29B3C5259C04FF6D /* Sources */, + RBP_BA57258FD71062047F5503B4B160FE15 /* Resources */, + CFBP_CC737A6BF6243B189B109606B0C4B5A2 /* CopyFiles */, + FBP_4E773D46F6F726BBC0032C576D02FCB7 /* Frameworks */, + CFBP_CB2355266C8BAA9C97863011F3DE05A2 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + TD_B8F32B4B3CC431FE0EC1C4E7D096E3AC /* PBXTargetDependency */, + TD_35F382102AABCCCEFADCBC201E5B1CE1 /* PBXTargetDependency */, + TD_C762D8FBA80775A921AA5B50422E9349 /* PBXTargetDependency */, + ); + name = App_macOS; + productName = App_macOS; + productReference = FR_640ADF15D2B92FDC35556B2E0934C21C /* App_macOS.app */; + productType = "com.apple.product-type.application"; + }; + NT_BEB0891E36797FE2214A0A9D516D408D /* App_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_C7673A8886407721BA5BFA1B18F184D4 /* Build configuration list for PBXNativeTarget "App_iOS" */; + buildPhases = ( + SBP_77EF8BC7FC3D693C9C0C1CB51984F3E2 /* Sources */, + RBP_85DF5DDC76E0E2A78CAFC9A3EC508232 /* Resources */, + CFBP_D7E07645BC437C4DFBB212DFC4F3B09E /* CopyFiles */, + SSBP_7F8DED07519BA4B70C40A9A755844874 /* Carthage */, + FBP_18D4325BBE506E88E1C742F57AECB0CD /* Frameworks */, + CFBP_1C40B0777F31334440F91C2DB34EF404 /* Embed Frameworks */, + CFBP_961F46C30E720E886AEFD11D45DDA199 /* Embed Watch Content */, + SSBP_062CBBF024005F57EECA660F9C7B0C7D /* Strip Unused Architectures from Frameworks */, + SSBP_376C0662E4E8416C049A50660864798B /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + TD_0C5CE0308CB64DB986A853307CCF8A95 /* PBXTargetDependency */, + TD_94E481CDF62CDA1E9B37D1DA08E5A5AF /* PBXTargetDependency */, + TD_4013C738E59E1CA40B4A982AF74E8604 /* PBXTargetDependency */, + TD_266243C3BBC1C83485E1B43C0FFC3626 /* PBXTargetDependency */, + TD_743D7CD7BB700A16A02A7A4A1E02D845 /* PBXTargetDependency */, + ); + name = App_iOS; + productName = App_iOS; + productReference = FR_89162821C7F86126DC7F165E93E0DD23 /* App_iOS.app */; + productType = "com.apple.product-type.application"; + }; + NT_D4BAEEEC88124103C8DFF41FCE206DCE /* App_iOS_UITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_DB66C428B606518C825ECFF73A5EF059 /* Build configuration list for PBXNativeTarget "App_iOS_UITests" */; + buildPhases = ( + SBP_3848ADAF2343866973E57344A1054BE3 /* Sources */, + CFBP_3BE6FE084D6BE913354F37B1DD9A8D92 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + TD_98EB63C93477EA15558367FBAB5797CE /* PBXTargetDependency */, + ); + name = App_iOS_UITests; + productName = App_iOS_UITests; + productReference = FR_257D977B4221AB25C1EC0ACD6128A89B /* App_iOS_UITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + NT_D4C3E345E90AF9F6CBE8CF226FCFBCD6 /* StaticLibrary_ObjC_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_91682ADED17A2C81A700A67F5D70BA1F /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_tvOS" */; + buildPhases = ( + CFBP_CC1EF1963551F7E08925519982C248B9 /* CopyFiles */, + SBP_645418A0FA6E3F5727685DE191C6B793 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StaticLibrary_ObjC_tvOS; + productName = StaticLibrary_ObjC_tvOS; + productReference = FR_5A840A83C22F13EBFE051C061E549F95 /* StaticLibrary_ObjC.a */; + productType = "com.apple.product-type.library.static"; + }; + NT_FA652FEB38562C3A5C93D5EC7ED09776 /* Framework_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = CL_11BB9F4DF26D98C0A2C8E1668356269F /* Build configuration list for PBXNativeTarget "Framework_tvOS" */; + buildPhases = ( + HBP_9DD85101234CF2E78A49044D618D1D80 /* Headers */, + SBP_9DB756A33A199E4D91CE6E6E2A5A706C /* Sources */, + FBP_1BDCD6E0245ED2400E6FE9AC9C334DE4 /* Frameworks */, + SSBP_1B2C6BA1C514471EF42FB7E03ACD8C83 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + TD_79BA73EB5832255541811162BB2B0218 /* PBXTargetDependency */, + ); + name = Framework_tvOS; + productName = Framework_tvOS; + productReference = FR_D5FDE9E6362055E854CE1D3980716A4C /* Framework.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - P_8448771205358 /* Project object */ = { + P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0930; + LastUpgradeCheck = 1000; TargetAttributes = { - AT_445731917037 = { + AT_D40C01B2BAD29EDEA392714DFB69FE8F = { CUSTOM = value; }; - NT_123503999387 = { - TestTargetID = NT_825232110500; - }; - NT_480982116789 = { + NT_B91A6EACD6F5192FECA2E95FD531D0CA = { ProvisioningStyle = Automatic; }; - NT_825232110500 = { + NT_BEB0891E36797FE2214A0A9D516D408D = { ProvisioningStyle = Automatic; }; + NT_D4BAEEEC88124103C8DFF41FCE206DCE = { + TestTargetID = NT_BEB0891E36797FE2214A0A9D516D408D; + }; }; }; - buildConfigurationList = CL_844877120535 /* Build configuration list for PBXProject "Project" */; + buildConfigurationList = CL_85167C2DED9F1F2F7D5162C1DD252426 /* Build configuration list for PBXProject "Project" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; @@ -1163,115 +1381,103 @@ Base, en, ); - mainGroup = G_8448771205358; + mainGroup = G_CBE9DB02095FA0DF8A7ECE76A4BD81A4; projectDirPath = ""; projectRoot = ""; targets = ( - NT_825232110500 /* App_iOS */, - NT_783122899910 /* App_iOS_Tests */, - NT_123503999387 /* App_iOS_UITests */, - NT_480982116789 /* App_macOS */, - NT_324671077936 /* App_watchOS */, - NT_507023492251 /* App_watchOS Extension */, - NT_472296042419 /* Framework_iOS */, - NT_525119120469 /* Framework_macOS */, - NT_662315837182 /* Framework_tvOS */, - NT_438704538506 /* Framework_watchOS */, - LT_479264660374 /* Legacy */, - NT_399755008402 /* StaticLibrary_ObjC */, - NT_437179166843 /* StaticLibrary_Swift */, - AT_445731917037 /* SuperTarget */, - NT_376569054786 /* XPC Service */, - NT_935153865209 /* iMessageApp */, - NT_618687462494 /* iMessageExtension */, + NT_BEB0891E36797FE2214A0A9D516D408D /* App_iOS */, + NT_193BAF154270D1C21E269EDF2A1BD3F6 /* App_iOS_Tests */, + NT_D4BAEEEC88124103C8DFF41FCE206DCE /* App_iOS_UITests */, + NT_B91A6EACD6F5192FECA2E95FD531D0CA /* App_macOS */, + NT_38A9FE87056942A2746E0FF025B52A91 /* App_watchOS */, + NT_5245AB6D3B3CFBC95AEBADF6E0C593B8 /* App_watchOS Extension */, + NT_9F72C903B42E1AA3B88F97B917231B15 /* Framework2_iOS */, + NT_87DF09E78830E7EB3C00B6134A2D5A5D /* Framework2_macOS */, + NT_66B6A18138FD1FB5ECF3FC67B20FF3D3 /* Framework2_tvOS */, + NT_A3933B4002C44B46F34B238F654D1362 /* Framework2_watchOS */, + NT_7D108AE86BED8C9CCF52C2646FA4C5DE /* Framework_iOS */, + NT_9D53AF351F8DAE25354F2391248DFCCA /* Framework_macOS */, + NT_FA652FEB38562C3A5C93D5EC7ED09776 /* Framework_tvOS */, + NT_6A7B08EB167FD3A759C339FDBED7E019 /* Framework_watchOS */, + LT_5A51AFB390A610885D62F601DE321E4E /* Legacy */, + NT_6AEE12F93D449E249F5348BBF35D3053 /* StaticLibrary_ObjC_iOS */, + NT_15609BCEEB00CBCC4C42110EB0366A6F /* StaticLibrary_ObjC_macOS */, + NT_D4C3E345E90AF9F6CBE8CF226FCFBCD6 /* StaticLibrary_ObjC_tvOS */, + NT_34A020E43FBBD797051205235CD82B70 /* StaticLibrary_ObjC_watchOS */, + NT_2940463C85DCD0660288786BC66F2C4C /* StaticLibrary_Swift */, + AT_D40C01B2BAD29EDEA392714DFB69FE8F /* SuperTarget */, + NT_23509FD082D1F788E6D6431F509B11AF /* XPC Service */, + NT_6BD068FAAC6AA35C090C48147B94EC6E /* iMessageApp */, + NT_6A4FC6EE80FB2821AB96D51C3BC8966E /* iMessageExtension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - RBP_32467107793 /* Resources */ = { + RBP_1BFB64F249645ABF48C3CCDF8D5FA094 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_268392110450 /* Assets.xcassets in Resources */, - BF_612351978356 /* Interface.storyboard in Resources */, + BF_FA5F3C87A2571E0F39637D118B6C6F8F /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - RBP_50702349225 /* Resources */ = { + RBP_5623703FDC4F6DF4679D8BAF27518F2F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_237760701422 /* Assets.xcassets in Resources */, + BF_ABA4EA32A6DB022806126D9C1418BBA3 /* Assets.xcassets in Resources */, + BF_19C973A29D9994B1E0655B1AFC5528AD /* Interface.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - RBP_61868746249 /* Resources */ = { + RBP_85DF5DDC76E0E2A78CAFC9A3EC508232 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_182635022050 /* Assets.xcassets in Resources */, - BF_828878846239 /* MainInterface.storyboard in Resources */, + BF_EBC45940911A4942BA04AE1285BF3802 /* Assets.xcassets in Resources */, + BF_B57F9691AD12CA8AE5528A2BAB9E4A43 /* LaunchScreen.storyboard in Resources */, + BF_AC2CE59D56846478FDFBB376FF9F9DC0 /* Localizable.strings in Resources */, + BF_65835F9276FF0DB8E27D098367F9D03C /* Localizable.stringsdict in Resources */, + BF_47FBEFEA08B9642C1F711EDA77FC8C89 /* LocalizedStoryboard.storyboard in Resources */, + BF_47A75C8A7EF15658238E254C846C5C6B /* Main.storyboard in Resources */, + BF_A8A5905BCA8872B2D7B0EF6326B33077 /* MyBundle.bundle in Resources */, + BF_149B8FD8F114C531F675E01FBE814609 /* ResourceFolder in Resources */, + BF_E2D02DDEDD7DC21831F50A6EAA71E528 /* StandaloneAssets.xcassets in Resources */, + BF_F3D57DA3E1F8A539BDD72E02A8C23FC6 /* iMessageApp.app in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - RBP_82523211050 /* Resources */ = { + RBP_9291220ECDCB98B69BB31C3E875042EC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_279581961655 /* Assets.xcassets in Resources */, - BF_538515166673 /* LaunchScreen.storyboard in Resources */, - BF_211435872001 /* Localizable.strings in Resources */, - BF_314868376788 /* Localizable.stringsdict in Resources */, - BF_186245454304 /* LocalizedStoryboard.storyboard in Resources */, - BF_280535243540 /* Main.storyboard in Resources */, - BF_284620660317 /* MyBundle.bundle in Resources */, - BF_721498080533 /* ResourceFolder in Resources */, - BF_860391087135 /* StandaloneAssets.xcassets in Resources */, - BF_647038614509 /* iMessageApp.app in Resources */, + BF_9D9B97D239384F4CE6E73852E027B787 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - RBP_93515386520 /* Resources */ = { + RBP_A5B7C086E8F07F5FEE9B99375E375819 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_334321520545 /* Assets.xcassets in Resources */, + BF_D6588CD7B83034816FFD3A7DB10DAD78 /* Assets.xcassets in Resources */, + BF_EA0063B4FC2A0980A746D35A8DF71CED /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + RBP_BA57258FD71062047F5503B4B160FE15 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_51D370314B5DA8E002A908021E459F50 /* Assets.xcassets in Resources */, + BF_52C8E2C5962601534CE6F00B88FDB048 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - SSBP_2467869845 /* MyScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = MyScript; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"You ran a script\"\n"; - }; - SSBP_3886691194 /* MyScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = MyScript; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"You ran a script\"\n"; - }; - SSBP_5106020372 /* Strip Unused Architectures from Frameworks */ = { + SSBP_062CBBF024005F57EECA660F9C7B0C7D /* Strip Unused Architectures from Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1285,7 +1491,49 @@ shellPath = /bin/sh; shellScript = "################################################################################\n#\n# Copyright 2015 Realm Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n################################################################################\n\n# This script strips all non-valid architectures from dynamic libraries in\n# the application's `Frameworks` directory.\n#\n# The following environment variables are required:\n#\n# BUILT_PRODUCTS_DIR\n# FRAMEWORKS_FOLDER_PATH\n# VALID_ARCHS\n# EXPANDED_CODE_SIGN_IDENTITY\n\n\n# Signs a framework with the provided identity\ncode_sign() {\n # Use the current code_sign_identitiy\n echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n echo \"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1\"\n /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"\n}\n\n# Set working directory to product’s embedded frameworks\ncd \"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nif [ \"$ACTION\" = \"install\" ]; then\n echo \"Copy .bcsymbolmap files to .xcarchive\"\n find . -name '*.bcsymbolmap' -type f -exec mv {} \"${CONFIGURATION_BUILD_DIR}\" \\;\nelse\n # Delete *.bcsymbolmap files from framework bundle unless archiving\n find . -name '*.bcsymbolmap' -type f -exec rm -rf \"{}\" +\\;\nfi\n\necho \"Stripping frameworks\"\n\nfor file in $(find . -type f -perm +111); do\n # Skip non-dynamic libraries\n if ! [[ \"$(file \"$file\")\" == *\"dynamically linked shared library\"* ]]; then\n continue\n fi\n # Get architectures for current file\n archs=\"$(lipo -info \"${file}\" | rev | cut -d ':' -f1 | rev)\"\n stripped=\"\"\n for arch in $archs; do\n if ! [[ \"${VALID_ARCHS}\" == *\"$arch\"* ]]; then\n # Strip non-valid architectures in-place\n lipo -remove \"$arch\" -output \"$file\" \"$file\" || exit 1\n stripped=\"$stripped $arch\"\n fi\n done\n if [[ \"$stripped\" != \"\" ]]; then\n echo \"Stripped $file of architectures:$stripped\"\n if [ \"${CODE_SIGNING_REQUIRED}\" == \"YES\" ]; then\n code_sign \"${file}\"\n fi\n fi\ndone\n"; }; - SSBP_5390042403 /* Copy Swift Objective-C Interface Header */ = { + SSBP_13B42B84708A6ABC082BE00176F5DCB2 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; + }; + SSBP_1B2C6BA1C514471EF42FB7E03ACD8C83 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; + }; + SSBP_376C0662E4E8416C049A50660864798B /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script!\"\n"; + }; + SSBP_4A83147402B05D3C84D21F0487315914 /* Copy Swift Objective-C Interface Header */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1301,67 +1549,39 @@ shellPath = /bin/sh; shellScript = "ditto \"${SCRIPT_INPUT_FILE_0}\" \"${SCRIPT_OUTPUT_FILE_0}\"\n"; }; - SSBP_5954948530 /* Carthage */ = { + SSBP_7F147E7ED45BAAE2186975B7FF9EB08A /* Carthage */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "$(SRCROOT)/Carthage/Build/watchOS/Alamofire.framework", + "$(SRCROOT)/Carthage/Build/watchOS/Result.framework", ); name = Carthage; outputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Alamofire.framework", + "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "carthage copy-frameworks\n"; }; - SSBP_6331376344 /* MyScript */ = { + SSBP_7F8DED07519BA4B70C40A9A755844874 /* Carthage */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - ); - name = MyScript; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"You ran a script\"\n"; - }; - SSBP_8106229290 /* Carthage */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework", + "$(SRCROOT)/Carthage/Build/iOS/Result.framework", ); name = Carthage; outputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Alamofire.framework", + "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "carthage copy-frameworks\n"; }; - SSBP_8255377629 /* MyScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = MyScript; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"You ran a script\"\n"; - }; - SSBP_8280041834 /* MyScript */ = { + SSBP_831D7D5A30B0F736E1E92F7B5CF9428F /* MyScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1375,7 +1595,7 @@ shellPath = /bin/sh; shellScript = "echo \"do the thing\""; }; - SSBP_8706434794 /* MyScript */ = { + SSBP_B07F447D73408EA48C54A8E7F5B8D575 /* MyScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1387,137 +1607,209 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"You ran a script!\"\n"; + shellScript = "echo \"You ran a script\"\n"; + }; + SSBP_C8F56E533BE956498E644805330168EB /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - SBP_12350399938 /* Sources */ = { + SBP_0CB30551A2D40126958D8D6DAF6922E2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_167705969896 /* TestProjectUITests.swift in Sources */, + BF_E6B3BA0A3A687598FB5CCDF0524E1B10 /* FrameworkFile.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_32467107793 /* Sources */ = { + SBP_110D7B4160D965B7964619BF78E01DE2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_76825DD9B3B10103CDAB9D235BDF6A91 /* MessagesViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_20DDAC7BCD11ECA8B08695FE5D7314A9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_37656905478 /* Sources */ = { + SBP_3848ADAF2343866973E57344A1054BE3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_855988705556 /* XPC_Service.m in Sources */, - BF_304637845091 /* main.m in Sources */, + BF_1EC32E6544284999188A140FB5FC6E67 /* TestProjectUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_39975500840 /* Sources */ = { + SBP_3DD17ED231CE07543581040F32049525 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_632297340262 /* StaticLibrary_ObjC.m in Sources */, + BF_DBF3047DCE71CB2E7B9AC7367F44F8DB /* StaticLibrary.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_43717916684 /* Sources */ = { + SBP_48868408A19D9BBE4A58CA4FAE00C0D4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_212221512596 /* StaticLibrary.swift in Sources */, + BF_5C6407EDAC3D88B020BCB46724DC1D14 /* FrameworkFile.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_43870453850 /* Sources */ = { + SBP_49F3C650EA105D1EF50817673A8DB33A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_624802436672 /* FrameworkFile.swift in Sources */, + BF_A29F8B04C9DD9ADE1EF5AFDAAA0130D2 /* ExtensionDelegate.swift in Sources */, + BF_5336CD16DBDB1654D75AA91B922DEAD6 /* InterfaceController.swift in Sources */, + BF_CD062A97959629BD672893FDAE89A1E9 /* NotificationController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_47229604241 /* Sources */ = { + SBP_52AE5DCFB4487297D6889C7F014AD281 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_456457948943 /* FrameworkFile.swift in Sources */, + BF_77C9BB7BED4F5970D02E69312259FE09 /* StaticLibrary_ObjC.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_47926466037 /* Sources */ = { + SBP_645418A0FA6E3F5727685DE191C6B793 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_D0676C98017B6FDD96A733CB851645DE /* StaticLibrary_ObjC.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_669CBAFD2D7234A2BEDCEAA4949ED575 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_FA28229372AB6236883309181258AF26 /* XPC_Service.m in Sources */, + BF_FD13F69A90FB1D5676B97A8C77D710B4 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_70B2F11AAC526FDB99D68212C2C92CE6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_B2B4B15D6F7B242DBDA39939111282F9 /* TestProjectTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_77EF8BC7FC3D693C9C0C1CB51984F3E2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_021628792D80050372F6E56A6C3D0561 /* AppDelegate.swift in Sources */, + BF_9A74AED05E2F61530BFA0F7D23AF0112 /* Model.xcdatamodeld in Sources */, + BF_FF7EBDFA4462D2983743C84CE99D9714 /* MoreUnder.swift in Sources */, + BF_47FF83A37355E90F93C0F5B2CFBCE317 /* Standalone.swift in Sources */, + BF_F12E44D8E7F617E8A5FD8E1A342E5FAD /* ViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_7EE428F1F0444ACB29B3C5259C04FF6D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_81711FB79375EB743254B809B4E246E0 /* AppDelegate.swift in Sources */, + BF_F7AC9F45ED37FCD5A749FD6F5F4518AF /* Standalone.swift in Sources */, + BF_98DEE7FD578AA439550E0023A2ECE8D0 /* ViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_84E9A8BE77910B67B3F2DCD5916DC498 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_3080067722B357BFC053D89CCDBF5397 /* FrameworkFile.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_8990272D7DD45CFBDAB18690861BD4E8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_8610CB66872BC72C1690EBD8D102FBC0 /* FrameworkFile.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_924258C7A9F27B13508604CAF625E0D3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_E228A4D3997297780216722D71AC9FE5 /* StaticLibrary_ObjC.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_9DB756A33A199E4D91CE6E6E2A5A706C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF_729EB1C88A5E43B2342099D81B301F4D /* FrameworkFile.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + SBP_C18D008976BE0EFD3D3A3C68FB79D271 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_48098211678 /* Sources */ = { + SBP_C469AFC0C383156AF5C80EBBC089D9FC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_704149935229 /* Standalone.swift in Sources */, + BF_3811C1771AF5342AD8F9FEB63A3465B5 /* FrameworkFile.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_50702349225 /* Sources */ = { + SBP_D6209A702C851D0CFD1CC2B225986D45 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_206432481076 /* ExtensionDelegate.swift in Sources */, - BF_138356261076 /* InterfaceController.swift in Sources */, - BF_830383951771 /* NotificationController.swift in Sources */, + BF_C9D24A56926211130F4E25B5D9972B58 /* StaticLibrary_ObjC.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_52511912046 /* Sources */ = { + SBP_DB9B8E1504ED9DD92AE41067C53B5082 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_901390118565 /* FrameworkFile.swift in Sources */, + BF_D3D64E2595369BBDEF03E07543AE2779 /* FrameworkFile.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_61868746249 /* Sources */ = { + SBP_EA528A5DC6D79AA397B25949B07AE70F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF_703054643820 /* MessagesViewController.swift in Sources */, + BF_4D56F3F4D081A77C11325B96DD34D8E1 /* FrameworkFile.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - SBP_66231583718 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF_243071719122 /* FrameworkFile.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - SBP_78312289991 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF_360196406184 /* TestProjectTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - SBP_82523211050 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF_892119987440 /* AppDelegate.swift in Sources */, - BF_670499288392 /* Model.xcdatamodeld in Sources */, - BF_503484983186 /* MoreUnder.swift in Sources */, - BF_561304997165 /* Standalone.swift in Sources */, - BF_331192862207 /* ViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - SBP_93515386520 /* Sources */ = { + SBP_ED63FCA00BD617EFF125ECDF9D24FAD8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -1527,157 +1819,1042 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - TD_109724965966 /* PBXTargetDependency */ = { + TD_0C5CE0308CB64DB986A853307CCF8A95 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_472296042419 /* Framework_iOS */; - targetProxy = CIP_10972496596 /* PBXContainerItemProxy */; + target = NT_38A9FE87056942A2746E0FF025B52A91 /* App_watchOS */; + targetProxy = CIP_6D60DD975DE7829AEA72BD4098DE13E6 /* PBXContainerItemProxy */; }; - TD_193291182921 /* PBXTargetDependency */ = { + TD_117F878FC368C83443CEC1707531F7F2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_507023492251 /* App_watchOS Extension */; - targetProxy = CIP_19329118292 /* PBXContainerItemProxy */; + target = NT_6AEE12F93D449E249F5348BBF35D3053 /* StaticLibrary_ObjC_iOS */; + targetProxy = CIP_1F8C8F9FAC75236BB2F60C3BCAE41C55 /* PBXContainerItemProxy */; }; - TD_208010900457 /* PBXTargetDependency */ = { + TD_205ABD699FA8E05C47D73E8EB2D0F9EF /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_825232110500 /* App_iOS */; - targetProxy = CIP_20801090045 /* PBXContainerItemProxy */; + target = NT_34A020E43FBBD797051205235CD82B70 /* StaticLibrary_ObjC_watchOS */; + targetProxy = CIP_47399FDE0885501C87782313489C95A3 /* PBXContainerItemProxy */; }; - TD_235580504123 /* PBXTargetDependency */ = { + TD_266243C3BBC1C83485E1B43C0FFC3626 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_525119120469 /* Framework_macOS */; - targetProxy = CIP_23558050412 /* PBXContainerItemProxy */; + target = NT_6AEE12F93D449E249F5348BBF35D3053 /* StaticLibrary_ObjC_iOS */; + targetProxy = CIP_1AEF07B9F6A9BC9605E82F26AE7BFE15 /* PBXContainerItemProxy */; }; - TD_288560876254 /* PBXTargetDependency */ = { + TD_2A43F973A3E1CF675A967054BA52074B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_935153865209 /* iMessageApp */; - targetProxy = CIP_28856087625 /* PBXContainerItemProxy */; + target = NT_5245AB6D3B3CFBC95AEBADF6E0C593B8 /* App_watchOS Extension */; + targetProxy = CIP_5F2FD3F0AED59431B4F98D7238CAA733 /* PBXContainerItemProxy */; }; - TD_317921131342 /* PBXTargetDependency */ = { + TD_35F382102AABCCCEFADCBC201E5B1CE1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_618687462494 /* iMessageExtension */; - targetProxy = CIP_31792113134 /* PBXContainerItemProxy */; + target = NT_15609BCEEB00CBCC4C42110EB0366A6F /* StaticLibrary_ObjC_macOS */; + targetProxy = CIP_64ED071F49DC88F8192387D7A18827F1 /* PBXContainerItemProxy */; }; - TD_337103940101 /* PBXTargetDependency */ = { + TD_4013C738E59E1CA40B4A982AF74E8604 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_399755008402 /* StaticLibrary_ObjC */; - targetProxy = CIP_33710394010 /* PBXContainerItemProxy */; + target = NT_7D108AE86BED8C9CCF52C2646FA4C5DE /* Framework_iOS */; + targetProxy = CIP_DC690C90FF2F615A1EB93D9803F8D905 /* PBXContainerItemProxy */; }; - TD_629038784927 /* PBXTargetDependency */ = { + TD_402541000CCC58970431E41C3D928AB8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_399755008402 /* StaticLibrary_ObjC */; - targetProxy = CIP_62903878492 /* PBXContainerItemProxy */; + target = NT_BEB0891E36797FE2214A0A9D516D408D /* App_iOS */; + targetProxy = CIP_73A78E804E93B79E9ED934358CDD7D9D /* PBXContainerItemProxy */; }; - TD_667455552356 /* PBXTargetDependency */ = { + TD_743D7CD7BB700A16A02A7A4A1E02D845 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_399755008402 /* StaticLibrary_ObjC */; - targetProxy = CIP_66745555235 /* PBXContainerItemProxy */; + target = NT_6BD068FAAC6AA35C090C48147B94EC6E /* iMessageApp */; + targetProxy = CIP_5E9F76628F77E820EB9AA60A282D8691 /* PBXContainerItemProxy */; }; - TD_676191581124 /* PBXTargetDependency */ = { + TD_79BA73EB5832255541811162BB2B0218 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_825232110500 /* App_iOS */; - targetProxy = CIP_67619158112 /* PBXContainerItemProxy */; + target = NT_D4C3E345E90AF9F6CBE8CF226FCFBCD6 /* StaticLibrary_ObjC_tvOS */; + targetProxy = CIP_1C3D8F2BF099A773651CF8A195466469 /* PBXContainerItemProxy */; }; - TD_721522128177 /* PBXTargetDependency */ = { + TD_846DB03B9778D6C8E81FE52A5A212420 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_399755008402 /* StaticLibrary_ObjC */; - targetProxy = CIP_72152212817 /* PBXContainerItemProxy */; + target = NT_6A4FC6EE80FB2821AB96D51C3BC8966E /* iMessageExtension */; + targetProxy = CIP_B5B71FB9D5064D7E05E9E44827A87775 /* PBXContainerItemProxy */; }; - TD_743784992411 /* PBXTargetDependency */ = { + TD_94E481CDF62CDA1E9B37D1DA08E5A5AF /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_376569054786 /* XPC Service */; - targetProxy = CIP_74378499241 /* PBXContainerItemProxy */; + target = NT_9F72C903B42E1AA3B88F97B917231B15 /* Framework2_iOS */; + targetProxy = CIP_862C50E687ABB75CCDF71F1157709A4D /* PBXContainerItemProxy */; }; - TD_747418473860 /* PBXTargetDependency */ = { + TD_98EB63C93477EA15558367FBAB5797CE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_472296042419 /* Framework_iOS */; - targetProxy = CIP_74741847386 /* PBXContainerItemProxy */; + target = NT_BEB0891E36797FE2214A0A9D516D408D /* App_iOS */; + targetProxy = CIP_291A38592460740F400A80DE5DBA9679 /* PBXContainerItemProxy */; }; - TD_784412347908 /* PBXTargetDependency */ = { + TD_B8AB4064784522A5F3760CB1372D1BCD /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_399755008402 /* StaticLibrary_ObjC */; - targetProxy = CIP_78441234790 /* PBXContainerItemProxy */; + target = NT_BEB0891E36797FE2214A0A9D516D408D /* App_iOS */; + targetProxy = CIP_4FA1F11884BC4F5DBDFAC1FBEC60AFC1 /* PBXContainerItemProxy */; }; - TD_824101787753 /* PBXTargetDependency */ = { + TD_B8F32B4B3CC431FE0EC1C4E7D096E3AC /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_324671077936 /* App_watchOS */; - targetProxy = CIP_82410178775 /* PBXContainerItemProxy */; + target = NT_9D53AF351F8DAE25354F2391248DFCCA /* Framework_macOS */; + targetProxy = CIP_CA46A507405C3CBD7579D2C9A3F8719E /* PBXContainerItemProxy */; }; - TD_887143865471 /* PBXTargetDependency */ = { + TD_BBB2D0EDFD9EF8193F1864D1F3D5F97A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_825232110500 /* App_iOS */; - targetProxy = CIP_88714386547 /* PBXContainerItemProxy */; + target = NT_15609BCEEB00CBCC4C42110EB0366A6F /* StaticLibrary_ObjC_macOS */; + targetProxy = CIP_C82ED1EBAD4D7218ED9694EB7BF4DE74 /* PBXContainerItemProxy */; }; - TD_957476409477 /* PBXTargetDependency */ = { + TD_C762D8FBA80775A921AA5B50422E9349 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = NT_399755008402 /* StaticLibrary_ObjC */; - targetProxy = CIP_95747640947 /* PBXContainerItemProxy */; + target = NT_23509FD082D1F788E6D6431F509B11AF /* XPC Service */; + targetProxy = CIP_BAAD03920C86C2839C3C93FDA5568ECE /* PBXContainerItemProxy */; + }; + TD_D056799E80FFF41247BAE692D01142F0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = NT_7D108AE86BED8C9CCF52C2646FA4C5DE /* Framework_iOS */; + targetProxy = CIP_A760C88E6F24D3F06081AEBDEB8AE54B /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - VG_118219888726 /* LocalizedStoryboard.storyboard */ = { + VG_06DC429EEFBBA25BC3EE1AA1B4062C10 /* MainInterface.storyboard */ = { isa = PBXVariantGroup; children = ( - FR_118219888726 /* Base */, - FR_500792082643 /* en */, - ); - name = LocalizedStoryboard.storyboard; - sourceTree = ""; - }; - VG_201160695646 /* MainInterface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - FR_201160695646 /* Base */, + FR_7C8280C3C5E1D43BBB12A5F0156A8305 /* Base */, ); name = MainInterface.storyboard; sourceTree = ""; }; - VG_256263906698 /* LaunchScreen.storyboard */ = { + VG_14B7B5469AA17939993A2B25E775D391 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - FR_256263906698 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - VG_264279911176 /* Interface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - FR_264279911176 /* Base */, - ); - name = Interface.storyboard; - sourceTree = ""; - }; - VG_473000061463 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - FR_473000061463 /* Base */, - FR_771029596306 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - VG_609193904586 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - FR_609193904586 /* Base */, + FR_7532DD7B78451A5040048474AC4FBCCC /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - VG_746876637628 /* Localizable.stringsdict */ = { + VG_30676EBEE9BE54AA26CAE69BE744CAE8 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - FR_746876637628 /* Base */, - FR_602633703434 /* en */, + FR_C5682A1371F91CBD1254C115F0439F12 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + VG_6542B94EE7DA40CD30BC54DED26C61C7 /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FR_2649A01C17A7301DD72EA826604ED8AA /* Base */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; + VG_BE436BDD64E90EFB600D47AC69B49DD3 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + FR_62ECE5A3D0F25415CB50A28226B91EBE /* Base */, + FR_11E95FCD1DEB0C8A01A053518C1DAA8E /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + VG_C247AA37E9057916EDDC65C7B55E2F38 /* Localizable.stringsdict */ = { + isa = PBXVariantGroup; + children = ( + FR_4B58A01ABBE8E0A56B7B5A539C9BF5C7 /* Base */, + FR_BCEF8D29C9B93D3160D8D76DD368C8AD /* en */, ); name = Localizable.stringsdict; sourceTree = ""; }; + VG_F256536BB07CF3E64C4DD934F75BED9C /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FR_C73B96CEEE97DE429C638EBD9C2F3D2B /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + VG_FE6D89DA2D7E7F58340D566590FF221C /* LocalizedStoryboard.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FR_A51DE87AC269BC36016F9CAC32B4ECB2 /* Base */, + FR_35B9B5E8A2ED60FBB9CED8AE515B16B5 /* en */, + ); + name = LocalizedStoryboard.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - BC_108053643718 /* Test Debug */ = { + BC_0198386D4EF48A4C053820EEEE1936CB /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Test Debug"; + }; + BC_0271561C28AF4A74C6924A2187BC8487 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + BC_032D44BB36CD1AC13FFFAC654631D432 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_057931652E9069AFF23BA573B6564BE5 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Debug"; + }; + BC_079D311B8C64F17C816583A1A4D84F42 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = App_macOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; + SDKROOT = macosx; + }; + name = "Staging Release"; + }; + BC_0B1CBABAB9579A064729249F5E1B7B84 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_0B57E3E0E8C194293ABFEEF97F104F30 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + BC_0D53E4051E21792867D5FA4A11B751AB /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-tvOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + }; + name = "Production Release"; + }; + BC_0D96F61E117D6A8D2353B0E7CB445AEA /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + BC_0E087681CE92CC2069F9E562ECC9FD23 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + MY_SETTING = hello; + }; + name = "Staging Debug"; + }; + BC_0E104167F96EA087A23DFBE2430D5612 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-watchOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Production Debug"; + }; + BC_11CBEB05340DE3C8F396B359A9144039 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "XPC Service/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + SDKROOT = macosx; + }; + name = "Staging Release"; + }; + BC_120D6C5C7E4D1D6566CBD71E11C3DF37 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + BC_1603C1C58A4D6AE1BD0707D13D2C8F44 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + BC_161B10E65E0BE143A17EADFA5EE88B3D /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = App_iOS/App.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "\"Vendor\"", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.project.app; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Debug"; + }; + BC_16E1FCDA9DB6E70091B54603E4E6F58B /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = App_watchOS/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Test Release"; + }; + BC_1841B61F3F85EC24C4AACBC5C025BD08 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + MY_SETTING = hello; + }; + name = "Production Debug"; + }; + BC_19CBA184C0BDC24CE3657C025A8FC279 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = App_iOS; + }; + name = "Staging Release"; + }; + BC_19E3B21D0DA59BAF1B99899A35858D52 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_ID_SUFFIX = .test; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = "Test Release"; + }; + BC_1CF7F7BC6E19981DCBBFE6FE2D9FCB62 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = App_iOS/App.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "\"Vendor\"", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.project.app; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Release"; + }; + BC_1D9A30F2A4E9057FD8A7101D4AA4F47D /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-iOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Debug"; + }; + BC_209579D4C144FB697FDD46843485CC6A /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = "Production Debug"; + }; + BC_22D59B57A805B62A266F803CCDD49C26 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-macOS"; + PRODUCT_NAME = Framework2; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + BC_24042033AF9D3DEDAD53ACAF1C2BB0B2 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-tvOS"; + PRODUCT_NAME = Framework2; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + BC_27A94FA771ABEE02868BCED0690C89E1 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-macOS"; + PRODUCT_NAME = Framework2; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + BC_291E5C210DD53C3B3A4C6057C2B9652A /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = App_iOS; + }; + name = "Production Release"; + }; + BC_2D532F03F57D7D107FDAC3EF23DBFBFE /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Debug"; + }; + BC_2DB4D72679A12506C6A8B4728F130B7D /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Release"; + }; + BC_2F352436A75D33C6D3337012367BE90C /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; + INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Release"; + }; + BC_3134697E7D6C32A5C4376C581C189D6B /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-iOS"; + PRODUCT_NAME = Framework2; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + BC_313481FFED1411A2B5969B70EBA94383 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-tvOS"; + PRODUCT_NAME = Framework2; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_3CCE54849732E01493DDDB7D86E033D4 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = App_watchOS/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Staging Debug"; + }; + BC_3D9C1A83637AB10D5FFC5D4F8331091E /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; + INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Debug"; + }; + BC_42C4FEAD23C2FE1A906F4D37F43182AB /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = App_watchOS/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Production Release"; + }; + BC_4346300D78CE0EC28B467470E8C4DB2E /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-iOS"; + PRODUCT_NAME = Framework2; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + BC_46EDEC047C02E1E271BADF861EFB2F8D /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-tvOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + }; + name = "Test Release"; + }; + BC_4AC83F754F5BB02C3019E8AE2303E966 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Production Release"; + }; + BC_4F7A9BAD8AB16D47ECA510689FB5F899 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "XPC Service/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + SDKROOT = macosx; + }; + name = "Staging Debug"; + }; + BC_50C3D866E3B57D83181A8F04E553F557 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = IMessage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Debug"; + }; + BC_53BBB90244275C55B50604E0DC26809E /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-macOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = "Staging Debug"; + }; + BC_541CCB32267A890B3BABCE62FFE461E2 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Release"; + }; + BC_54F3754420D0F7418AB42235B1D71751 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-iOS"; + PRODUCT_NAME = Framework2; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_56B4C0BD8630088AECC29D1D7064530F /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-watchOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Staging Debug"; + }; + BC_57D3973CA01D421550D834AFA79D2B4B /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + MY_SETTING = hello; + }; + name = "Test Release"; + }; + BC_58D5B708B08789E2DFD4D60A906AAA6E /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + BC_5901F7B4A1799821B3061B5EA7C4A033 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Debug"; + }; + BC_5951C33138E508D3E6CA672980D5F2B6 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = IMessage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Debug"; + }; + BC_5996DB19FBFE69C54C671E0624798C4B /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Debug"; + }; + BC_5A05C344BCA2E54DFF945E68ECC21064 /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -1702,54 +2879,7 @@ }; name = "Test Debug"; }; - BC_122527152613 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - MY_SETTING = hello; - }; - name = "Test Release"; - }; - BC_128103534773 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - "\"Vendor\"", - ); - INFOPLIST_FILE = App_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.project.app; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Release"; - }; - BC_128566007109 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = App_watchOS/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = "Staging Release"; - }; - BC_129177384103 /* Test Release */ = { + BC_5B12F047BB0206FED25C955314A29B18 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1757,37 +2887,9 @@ SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Test Release"; + name = "Production Release"; }; - BC_167564962969 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; - INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Release"; - }; - BC_210307580165 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Release"; - }; - BC_210338877784 /* Test Release */ = { + BC_5BC104FB79C437B79CC9D676B3B964D2 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -1798,48 +2900,162 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/watchOS", ); INFOPLIST_FILE = Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + BC_5CA18B8A4079FC28EF3A05BDC5E4D501 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; }; - name = "Test Release"; + name = "Staging Debug"; }; - BC_213267780961 /* Production Debug */ = { + BC_5CBE4F01DBB084436375039EFEDDE6E4 /* Production Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "XPC Service/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-macOS"; + PRODUCT_NAME = StaticLibrary_ObjC; SDKROOT = macosx; + SKIP_INSTALL = YES; }; name = "Production Debug"; }; - BC_240587562436 /* Test Debug */ = { + BC_5D33E2C3F29594425D03B339108871CF /* Production Debug */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", ); - INFOPLIST_FILE = App_iOS_Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_5D7B920759B10537602230A4B5520551 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-macOS"; + PRODUCT_NAME = Framework2; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + BC_606DC3CBE672B2D9CA4B68FF6F55762D /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; SDKROOT = iphoneos; + SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; + name = "Production Debug"; + }; + BC_6396C78E99C21A774B9819DC09D88BD7 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Staging Debug"; + }; + BC_63E4D52E21696EFA858D20EA01500612 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-macOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; name = "Test Debug"; }; - BC_242096321611 /* Production Release */ = { + BC_656BA4FF26F3FB2ECFA5F81D7E133C94 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-macOS"; + PRODUCT_NAME = Framework2; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_679AB0D3CA0237CCB4B711609C0CB16A /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; + INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Release"; + }; + BC_6851DF4113AFF271AA5DD6D587181A03 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1884,24 +3100,13 @@ GCC_WARN_UNUSED_VARIABLE = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; VALIDATE_PRODUCT = YES; WATCHOS_DEPLOYMENT_TARGET = 4.0; }; name = "Production Release"; }; - BC_249152711841 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = IMessage/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Release"; - }; - BC_257261481133 /* Staging Release */ = { + BC_689C05D134F6C4AB2A86666C7C2D1E8F /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; @@ -1909,67 +3114,27 @@ "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); - INFOPLIST_FILE = App_iOS_UITests/Info.plist; + INFOPLIST_FILE = App_iOS_Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = App_iOS; - }; - name = "Staging Release"; - }; - BC_264139320591 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Release"; - }; - BC_264159662496 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = App_watchOS/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = "Test Release"; - }; - BC_265230327262 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - "\"Vendor\"", - ); - INFOPLIST_FILE = App_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.project.app; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = "Staging Release"; }; - BC_275347760107 /* Production Debug */ = { + BC_69E8021CB05224B9CAC27F6AFA1763CA /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-tvOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + }; + name = "Staging Debug"; + }; + BC_6A4D0B334934E5E4901A4164AD2DF70A /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -1980,53 +3145,21 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", + "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; PRODUCT_NAME = Framework; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Production Debug"; - }; - BC_275754663824 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = IMessage/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; SDKROOT = iphoneos; + SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; }; name = "Staging Release"; }; - BC_280651168996 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Vendor/SomeXPCService.xpc/Contents/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; - SDKROOT = macosx; - }; - name = "Production Debug"; - }; - BC_282993554784 /* Production Release */ = { + BC_6D1ED651D660692438EF3196506DC5AD /* Test Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -2049,37 +3182,82 @@ SKIP_INSTALL = YES; VERSIONING_SYSTEM = "apple-generic"; }; - name = "Production Release"; + name = "Test Release"; }; - BC_296138297674 /* Test Release */ = { + BC_6EDDF7399F4EE2E8226F9D006C31ACB1 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-watchOS"; + PRODUCT_NAME = StaticLibrary_ObjC; SDKROOT = watchos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; }; - name = "Test Release"; + name = "Production Release"; }; - BC_301490151478 /* Staging Debug */ = { + BC_71D19FC08A12CCAB1A85C7A5320A451A /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { - INFOPLIST_FILE = IMessage/Info.plist; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_724E9BA97FC0605F596460587FFD4C61 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_7477F8344D6D7313C39D897C1864F1B7 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; + INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Staging Debug"; + name = "Test Release"; }; - BC_309031681908 /* Test Debug */ = { + BC_7527094FD7492E6A964EC95E7378EF22 /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; @@ -2091,81 +3269,84 @@ }; name = "Test Debug"; }; - BC_313103118526 /* Staging Debug */ = { + BC_791A2E3F88BE34E647BEE192E06BBA74 /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; - PRODUCT_NAME = Framework; - SDKROOT = iphoneos; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-tvOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = appletvos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Staging Debug"; - }; - BC_334821934458 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - MY_SETTING = hello; - }; - name = "Production Release"; - }; - BC_351179072988 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; - PRODUCT_NAME = Framework; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; + TARGETED_DEVICE_FAMILY = 3; }; name = "Test Debug"; }; - BC_355674198163 /* Production Debug */ = { + BC_7A2C8B05671807E16D816BD7F0436418 /* Test Release */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_UITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; + INFOPLIST_FILE = IMessage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = App_iOS; + }; + name = "Test Release"; + }; + BC_7BA9BA11D163D5F132FE6FFBA4DA1AB8 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Release"; + }; + BC_7D0687E6BFF4B05D03341A00447B5070 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-iOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Release"; + }; + BC_80331E927C4BB7E48B375DB00FD90281 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = App_macOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; + SDKROOT = macosx; }; name = "Production Debug"; }; - BC_368555321779 /* Production Release */ = { + BC_80FA279C7B3455A79612ECAB12C9E8F6 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "XPC Service/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + SDKROOT = macosx; + }; + name = "Test Release"; + }; + BC_833320F190FC427049CDF16E1B1AF316 /* Test Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; @@ -2179,16 +3360,9 @@ SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Production Release"; + name = "Test Release"; }; - BC_370290618113 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - MY_SETTING = hello; - }; - name = "Production Debug"; - }; - BC_380703106572 /* Test Release */ = { + BC_83922E2AEA387FB9ABF402C3F401DBA1 /* Test Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -2197,15 +3371,80 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-watchOS"; + PRODUCT_NAME = Framework2; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + BC_8433EE3901A89DD2CDDE9F61906433E5 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-macOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = "Test Release"; + }; + BC_853248A59437336C149C6DD8E6E4A208 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", + "$(PROJECT_DIR)/Carthage/Build/watchOS", ); + INFOPLIST_FILE = App_watchOS/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Production Debug"; + }; + BC_85A9D050B594B6F44602E90470E75818 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-watchOS"; + PRODUCT_NAME = Framework2; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + BC_8624FCCF5B865B80E0B21BA20FA0FAC5 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; - PRODUCT_NAME = Framework; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-tvOS"; + PRODUCT_NAME = Framework2; SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; @@ -2213,7 +3452,27 @@ }; name = "Test Release"; }; - BC_381577484690 /* Production Release */ = { + BC_865AB65A39A201C7BF448737D287EF85 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-watchOS"; + PRODUCT_NAME = Framework2; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + BC_874C935D654D12F1F106CBEFBC4D2074 /* Staging Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -2224,20 +3483,166 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", + "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; PRODUCT_NAME = Framework; - SDKROOT = watchos; + SDKROOT = iphoneos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; + name = "Staging Debug"; + }; + BC_8895B9B729A8000331A682AF912CA229 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Debug"; + }; + BC_88D810589CFF611B0D20C0CB47822274 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-tvOS"; + PRODUCT_NAME = Framework2; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + BC_89C8C1848F2559C9E46F22CB83CDB25A /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-iOS"; + PRODUCT_NAME = Framework2; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + BC_904676A8DD86F548E50090FAA97FD9E1 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + MY_SETTING = hello; + }; name = "Production Release"; }; - BC_397339763951 /* Staging Debug */ = { + BC_9081CEAEC2FCC555B0BFC28B4EEDF0D6 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-macOS"; + PRODUCT_NAME = Framework2; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + BC_917ABD477C99455FF6BE1A89107FDEC9 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + BC_919006DE8A7D104D16D1D4C0AB2CC241 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = App_watchOS/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Staging Release"; + }; + BC_9360F45D8F5B06962ACEBF423299C71B /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-tvOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + }; + name = "Staging Release"; + }; + BC_93685F04BC9D8657E5D7B62B22E043AF /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = IMessage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Release"; + }; + BC_96931434222054E6D7469B6B4EC67E87 /* Staging Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -2292,12 +3697,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; WATCHOS_DEPLOYMENT_TARGET = 4.0; }; name = "Staging Debug"; }; - BC_424897564588 /* Staging Debug */ = { + BC_98CCC502104C412E1F48BB2F610EA45E /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2306,60 +3711,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Staging Debug"; + name = "Staging Release"; }; - BC_437463937945 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_UITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = App_iOS; - }; - name = "Production Release"; - }; - BC_439666751882 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - MY_SETTING = hello; - }; - name = "Staging Debug"; - }; - BC_444705348320 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Debug"; - }; - BC_447998896881 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_UITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = App_iOS; - }; - name = "Test Debug"; - }; - BC_456712168038 /* Production Debug */ = { + BC_9B4D15D591EA1FDE03F33A0EE5B01DAB /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2368,87 +3722,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Production Debug"; - }; - BC_464603633927 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Release"; - }; - BC_467730755629 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; name = "Production Release"; }; - BC_470682595853 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = App_watchOS/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = "Production Release"; - }; - BC_474716674004 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_UITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = App_iOS; - }; - name = "Test Release"; - }; - BC_480688547948 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - "\"Vendor\"", - ); - INFOPLIST_FILE = App_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.project.app; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Debug"; - }; - BC_488246438798 /* Production Debug */ = { + BC_9CAC5683B65F9EA32F4A78810EAE488B /* Staging Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; @@ -2458,58 +3734,26 @@ SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Production Debug"; + name = "Staging Debug"; }; - BC_493052431451 /* Production Release */ = { + BC_9CDD286FAE4CE2FC296246C95A178023 /* Production Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; + BUNDLE_LOADER = "$(TEST_HOST)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", + "$(PROJECT_DIR)/Carthage/Build/iOS", ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; - PRODUCT_NAME = Framework; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Production Release"; - }; - BC_499325041919 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; - PRODUCT_NAME = Framework; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; + INFOPLIST_FILE = App_iOS_UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = App_iOS; }; name = "Production Debug"; }; - BC_504862512837 /* Production Debug */ = { + BC_9EA5ADC667D6445EB2976A3CA508E70D /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; @@ -2524,20 +3768,9 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; }; - name = "Production Debug"; + name = "Staging Release"; }; - BC_507219048168 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = IMessage/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Debug"; - }; - BC_517306343059 /* Staging Release */ = { + BC_9F1E5E527BE355504381023DED9562C9 /* Staging Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -2548,72 +3781,31 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/watchOS", ); INFOPLIST_FILE = Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; PRODUCT_NAME = Framework; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Staging Release"; - }; - BC_525459892506 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = App_watchOS/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; SDKROOT = watchos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + BC_9F549905032A4927CF6B843899EF5775 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "XPC Service/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + SDKROOT = macosx; }; name = "Production Debug"; }; - BC_530755208334 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - "\"Vendor\"", - ); - INFOPLIST_FILE = App_iOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.project.app; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Release"; - }; - BC_530814251927 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Debug"; - }; - BC_533481109982 /* Staging Debug */ = { + BC_A3FC5819178DDC45D4D2249ECCCA158D /* Staging Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -2638,52 +3830,7 @@ }; name = "Staging Debug"; }; - BC_563308786207 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; - PRODUCT_NAME = Framework; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Staging Debug"; - }; - BC_563702409464 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Vendor/SomeXPCService.xpc/Contents/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; - SDKROOT = macosx; - }; - name = "Staging Debug"; - }; - BC_568886047790 /* Production Debug */ = { + BC_A46551B496D75A9F6D5FF83C2308DC79 /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; @@ -2697,498 +3844,9 @@ SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Production Debug"; - }; - BC_568928282286 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = App_watchOS/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; name = "Test Debug"; }; - BC_570828727916 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Release"; - }; - BC_575374366235 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_ID_SUFFIX = .test; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - VALIDATE_PRODUCT = YES; - WATCHOS_DEPLOYMENT_TARGET = 4.0; - }; - name = "Test Release"; - }; - BC_592419322448 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Release"; - }; - BC_594849660073 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; - PRODUCT_NAME = Framework; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Production Release"; - }; - BC_609023497374 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; - INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Release"; - }; - BC_609604761299 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "XPC Service/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; - SDKROOT = macosx; - }; - name = "Staging Release"; - }; - BC_609753632568 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = IMessage/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Release"; - }; - BC_612244244384 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - MY_SETTING = hello; - }; - name = "Test Debug"; - }; - BC_622471558373 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; - PRODUCT_NAME = Framework; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Production Debug"; - }; - BC_627109222781 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Vendor/SomeXPCService.xpc/Contents/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; - SDKROOT = macosx; - }; - name = "Production Release"; - }; - BC_629891546665 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Debug"; - }; - BC_634896623305 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = App_watchOS/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = "Staging Debug"; - }; - BC_644737893954 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Debug"; - }; - BC_645651856160 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Release"; - }; - BC_655752097950 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; - PRODUCT_NAME = Framework; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 3; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Test Debug"; - }; - BC_667304541586 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "XPC Service/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; - SDKROOT = macosx; - }; - name = "Test Debug"; - }; - BC_669628489596 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-Swift"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Release"; - }; - BC_685135820012 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; - PRODUCT_NAME = Framework; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Test Release"; - }; - BC_697789525657 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - }; - name = "Staging Release"; - }; - BC_702596407424 /* Production Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - }; - name = "Production Release"; - }; - BC_704315531994 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = IMessage/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Debug"; - }; - BC_705279564212 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; - PRODUCT_NAME = Framework; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Production Debug"; - }; - BC_707904794064 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Vendor/SomeXPCService.xpc/Contents/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; - SDKROOT = macosx; - }; - name = "Test Release"; - }; - BC_709947688544 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - WATCHOS_DEPLOYMENT_TARGET = 4.0; - }; - name = "Production Debug"; - }; - BC_724654958001 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Staging Debug"; - }; - BC_730521266150 /* Staging Release */ = { + BC_A61B5D8B6C38C2B4C738A48343FB4CDA /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -3234,43 +3892,30 @@ GCC_WARN_UNUSED_VARIABLE = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; VALIDATE_PRODUCT = YES; WATCHOS_DEPLOYMENT_TARGET = 4.0; }; name = "Staging Release"; }; - BC_741359447852 /* Test Release */ = { + BC_ACF9A90E6BEFB16076EE5B78A3711D41 /* Test Release */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; - PRODUCT_NAME = Framework; - SDKROOT = macosx; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-watchOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = watchos; SKIP_INSTALL = YES; - VERSIONING_SYSTEM = "apple-generic"; + TARGETED_DEVICE_FAMILY = 4; }; name = "Test Release"; }; - BC_749393271654 /* Test Debug */ = { + BC_AE11EA7D0985D3AD750BDB7F362B6726 /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_ENTITLEMENTS = App_iOS/App.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", @@ -3288,7 +3933,7 @@ }; name = "Test Debug"; }; - BC_760168680599 /* Staging Release */ = { + BC_B0011E28621230A66DBE3070C59108D4 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -3311,46 +3956,37 @@ TARGETED_DEVICE_FAMILY = 3; VERSIONING_SYSTEM = "apple-generic"; }; - name = "Staging Release"; + name = "Production Release"; }; - BC_765441740976 /* Staging Release */ = { + BC_B19AA9EDCE45F13CA00B669DADF86395 /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; - PRODUCT_NAME = Framework; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Staging Release"; - }; - BC_766399414659 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; - INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; + INFOPLIST_FILE = IMessage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; - name = "Staging Debug"; + name = "Test Debug"; }; - BC_769258280401 /* Staging Debug */ = { + BC_B2819DF0E90F3F3341B2B3A828778827 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Production Debug"; + }; + BC_B290BF236EBF078304DB54D0CE99B85A /* Test Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; @@ -3365,20 +4001,220 @@ TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = App_iOS; }; - name = "Staging Debug"; + name = "Test Debug"; }; - BC_776042221288 /* Staging Release */ = { + BC_B2EA5B6CE006C3C8DB5A6AC3A2C78E59 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + MY_SETTING = hello; + }; + name = "Test Debug"; + }; + BC_B3B360DE1D00D5D3DE54D0467886EEDD /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-watchOS"; + PRODUCT_NAME = Framework2; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_B3CC7B17DDF2C081536FC92CF25981BD /* Production Debug */ = { isa = XCBuildConfiguration; buildSettings = { LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-iOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Debug"; + }; + BC_B44CB3772859FEECDAFDCD4B2FFA2E26 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-macOS"; + PRODUCT_NAME = Framework2; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_B52BB5E51BF8953D7DA1F42BA3803D2E /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = App_macOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; + SDKROOT = macosx; + }; + name = "Test Debug"; + }; + BC_B6F81B24E04D91DFE5F36AAF99FCFA5D /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-iOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Debug"; + }; + BC_BBA77AE6DA089F82907B6DFC338A6F37 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_BC88A6EBF48BB9B821C5B8001678AC2E /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-iOS"; + PRODUCT_NAME = StaticLibrary_ObjC; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = "Staging Release"; }; - BC_790711614758 /* Staging Release */ = { + BC_BFFBE0C278E007152F06241181A3457E /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-tvOS"; + PRODUCT_NAME = Framework2; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_C07EA83764F4BDE5F0059DC49805D92B /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + MY_SETTING = hello; + }; + name = "Staging Release"; + }; + BC_C38327E8FC090ADC83AA700666F26B0E /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-tvOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + }; + name = "Production Debug"; + }; + BC_C507150F28216FCF1029C0C97677DBE5 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = App_macOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; + SDKROOT = macosx; + }; + name = "Test Release"; + }; + BC_C5288877BBCE2FA6BA4D3FACBFF3BA7F /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = App_macOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; + SDKROOT = macosx; + }; + name = "Production Release"; + }; + BC_C60CBFC5B28D2B8906EAF4D4D3C81597 /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -3402,38 +4238,13 @@ }; name = "Staging Release"; }; - BC_793714544511 /* Test Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = App_iOS_Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Release"; - }; - BC_799591451484 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Debug"; - }; - BC_799916603316 /* Production Debug */ = { + BC_C7D3757F2E3D9743FDC0CA97F807919C /* Production Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_ENTITLEMENTS = App_iOS/App.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", @@ -3451,17 +4262,7 @@ }; name = "Production Debug"; }; - BC_805283956103 /* Production Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.Legacy; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Production Debug"; - }; - BC_823301630526 /* Test Release */ = { + BC_C9DCD449062A9160795D3701B9D2286E /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; @@ -3470,9 +4271,255 @@ PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; SDKROOT = macosx; }; + name = "Production Release"; + }; + BC_CD673788A57DF4BFEB50B4F1581C742E /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = IMessage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Release"; + }; + BC_CECBF50DBAC4771C31C83814C20D07B2 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = App_iOS/App.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "\"Vendor\"", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.project.app; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; name = "Test Release"; }; - BC_823840129404 /* Test Debug */ = { + BC_D02EB4360B13F2E445DB48AD85FDFCE6 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + BC_D4F031939A239C28219748EFD83D30AA /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = "XPC Service/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + SDKROOT = macosx; + }; + name = "Test Debug"; + }; + BC_D4FC53C776F8F2638D1D294F70517658 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-watchOS"; + PRODUCT_NAME = Framework2; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + BC_DA0BB134B708A4D257F250D3FA757711 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-iOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Release"; + }; + BC_DA5027F5182F7A40FB94FD282B57BC3E /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = App_iOS/App.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "\"Vendor\"", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.project.app; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Release"; + }; + BC_DD94802386549D49D781D0BF313007D4 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-iOS"; + PRODUCT_NAME = Framework2; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + BC_DF27A9642DF4C47995FB0B0F4F6C2A98 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-tvOS"; + PRODUCT_NAME = Framework2; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + BC_E254C909463A5ADF59BD226772066ADA /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = App_iOS; + }; + name = "Test Release"; + }; + BC_E52BEBA72F64BEC8F09733B49F7BA392 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Release"; + }; + BC_E6F51B0AAB0A7B33D902BD20A14E355C /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Debug"; + }; + BC_E8AE376BBD8C86CFB51C9D5A490FDDBE /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS_UITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-UITests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = App_iOS; + }; + name = "Staging Debug"; + }; + BC_E90B182AC1AF70BB78598DADECF9254B /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-watchOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Test Debug"; + }; + BC_E9A1D87B4DB80BCC61D6B5F59D81865D /* Test Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; @@ -3487,34 +4534,117 @@ SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; }; + name = "Test Release"; + }; + BC_F1A1A29B491BDE527B8095C7420311D9 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = App_watchOS/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; name = "Test Debug"; }; - BC_825545455794 /* Staging Debug */ = { + BC_F7D27DC0894036434C159F86616307EF /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-watchOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = "Staging Release"; + }; + BC_F81BA31D0E5421AC0DDFB2D799C84E2E /* Staging Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "XPC Service/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-macOS"; + PRODUCT_NAME = StaticLibrary_ObjC; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = "Staging Release"; + }; + BC_F947CECE4A424652DB631A640F423950 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = App_macOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; SDKROOT = macosx; }; name = "Staging Debug"; }; - BC_831819337335 /* Production Release */ = { + BC_F9F3A5E30D3C940B7D85E1AE59A6B3D8 /* Production Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; - INFOPLIST_FILE = "IMessage MessagesExtension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.iMessageApp.extension; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-iOS"; + PRODUCT_NAME = Framework2; SDKROOT = iphoneos; + SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; }; - name = "Production Release"; + name = "Production Debug"; }; - BC_832100796021 /* Test Debug */ = { + BC_FAA6D28DC24848759E58A2552BD37359 /* Production Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FR_660690926982 /* config.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + BC_FBF3614A1E9EDDE43929E81FDBD8B4B8 /* Test Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FR_22A431E337CB22CE70E39135206EDE27 /* config.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; BUNDLE_ID_SUFFIX = .test; @@ -3568,381 +4698,367 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; WATCHOS_DEPLOYMENT_TARGET = 4.0; }; name = "Test Debug"; }; - BC_835911551172 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; - PRODUCT_NAME = Framework; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Test Debug"; - }; - BC_851086512031 /* Staging Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - MY_SETTING = hello; - }; - name = "Staging Release"; - }; - BC_864485046941 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/watchOS", - ); - INFOPLIST_FILE = "App_watchOS Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.app.watch.extension; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - }; - name = "Staging Debug"; - }; - BC_866329197584 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Test Debug"; - }; - BC_866352849045 /* Test Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Vendor/SomeXPCService.xpc/Contents/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; - SDKROOT = macosx; - }; - name = "Test Debug"; - }; - BC_879000441352 /* Staging Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Framework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; - PRODUCT_NAME = Framework; - SDKROOT = macosx; - SKIP_INSTALL = YES; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Staging Debug"; - }; - BC_906683798476 /* Production Release */ = { + BC_FF1009503385A37130A5A131E70F0B18 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "XPC Service/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.project.XPCService; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.StaticLibrary-ObjC-macOS"; + PRODUCT_NAME = StaticLibrary_ObjC; SDKROOT = macosx; + SKIP_INSTALL = YES; }; name = "Production Release"; }; - BC_914036878229 /* Staging Release */ = { + BC_FF3600FA7FDB235869A6CB7BBDBD8C86 /* Production Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/Mac", - ); - INFOPLIST_FILE = Vendor/SomeXPCService.xpc/Contents/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-macOS"; - SDKROOT = macosx; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework2-watchOS"; + PRODUCT_NAME = Framework2; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; }; - name = "Staging Release"; + name = "Production Release"; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - CL_123503999387 /* Build configuration list for PBXNativeTarget "App_iOS_UITests" */ = { + CL_0562279D56EF60E8CCC0973D2C663637 /* Build configuration list for PBXNativeTarget "Framework2_iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_355674198163 /* Production Debug */, - BC_437463937945 /* Production Release */, - BC_769258280401 /* Staging Debug */, - BC_257261481133 /* Staging Release */, - BC_447998896881 /* Test Debug */, - BC_474716674004 /* Test Release */, + BC_F9F3A5E30D3C940B7D85E1AE59A6B3D8 /* Production Debug */, + BC_4346300D78CE0EC28B467470E8C4DB2E /* Production Release */, + BC_DD94802386549D49D781D0BF313007D4 /* Staging Debug */, + BC_89C8C1848F2559C9E46F22CB83CDB25A /* Staging Release */, + BC_54F3754420D0F7418AB42235B1D71751 /* Test Debug */, + BC_3134697E7D6C32A5C4376C581C189D6B /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_324671077936 /* Build configuration list for PBXNativeTarget "App_watchOS" */ = { + CL_11BB9F4DF26D98C0A2C8E1668356269F /* Build configuration list for PBXNativeTarget "Framework_tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_525459892506 /* Production Debug */, - BC_470682595853 /* Production Release */, - BC_634896623305 /* Staging Debug */, - BC_128566007109 /* Staging Release */, - BC_568928282286 /* Test Debug */, - BC_264159662496 /* Test Release */, + BC_032D44BB36CD1AC13FFFAC654631D432 /* Production Debug */, + BC_B0011E28621230A66DBE3070C59108D4 /* Production Release */, + BC_A3FC5819178DDC45D4D2249ECCCA158D /* Staging Debug */, + BC_0B57E3E0E8C194293ABFEEF97F104F30 /* Staging Release */, + BC_0B1CBABAB9579A064729249F5E1B7B84 /* Test Debug */, + BC_1603C1C58A4D6AE1BD0707D13D2C8F44 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_376569054786 /* Build configuration list for PBXNativeTarget "XPC Service" */ = { + CL_159255858B3EEC02844A3059326A6B93 /* Build configuration list for PBXNativeTarget "StaticLibrary_Swift" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_213267780961 /* Production Debug */, - BC_906683798476 /* Production Release */, - BC_825545455794 /* Staging Debug */, - BC_609604761299 /* Staging Release */, - BC_667304541586 /* Test Debug */, - BC_823301630526 /* Test Release */, + BC_606DC3CBE672B2D9CA4B68FF6F55762D /* Production Debug */, + BC_9B4D15D591EA1FDE03F33A0EE5B01DAB /* Production Release */, + BC_5CA18B8A4079FC28EF3A05BDC5E4D501 /* Staging Debug */, + BC_98CCC502104C412E1F48BB2F610EA45E /* Staging Release */, + BC_5996DB19FBFE69C54C671E0624798C4B /* Test Debug */, + BC_541CCB32267A890B3BABCE62FFE461E2 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_399755008402 /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC" */ = { + CL_289609080F2D20D506C8A587BC92807B /* Build configuration list for PBXNativeTarget "Framework2_macOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_629891546665 /* Production Debug */, - BC_592419322448 /* Production Release */, - BC_724654958001 /* Staging Debug */, - BC_776042221288 /* Staging Release */, - BC_866329197584 /* Test Debug */, - BC_464603633927 /* Test Release */, + BC_656BA4FF26F3FB2ECFA5F81D7E133C94 /* Production Debug */, + BC_5D7B920759B10537602230A4B5520551 /* Production Release */, + BC_27A94FA771ABEE02868BCED0690C89E1 /* Staging Debug */, + BC_9081CEAEC2FCC555B0BFC28B4EEDF0D6 /* Staging Release */, + BC_B44CB3772859FEECDAFDCD4B2FFA2E26 /* Test Debug */, + BC_22D59B57A805B62A266F803CCDD49C26 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_437179166843 /* Build configuration list for PBXNativeTarget "StaticLibrary_Swift" */ = { + CL_2E30D27084B352548CCAA3500158519B /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_watchOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_456712168038 /* Production Debug */, - BC_570828727916 /* Production Release */, - BC_424897564588 /* Staging Debug */, - BC_669628489596 /* Staging Release */, - BC_530814251927 /* Test Debug */, - BC_264139320591 /* Test Release */, + BC_0E104167F96EA087A23DFBE2430D5612 /* Production Debug */, + BC_6EDDF7399F4EE2E8226F9D006C31ACB1 /* Production Release */, + BC_56B4C0BD8630088AECC29D1D7064530F /* Staging Debug */, + BC_F7D27DC0894036434C159F86616307EF /* Staging Release */, + BC_E90B182AC1AF70BB78598DADECF9254B /* Test Debug */, + BC_ACF9A90E6BEFB16076EE5B78A3711D41 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_438704538506 /* Build configuration list for PBXNativeTarget "Framework_watchOS" */ = { + CL_333C6C3162FB671343E806257FB2A411 /* Build configuration list for PBXNativeTarget "App_watchOS Extension" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_499325041919 /* Production Debug */, - BC_381577484690 /* Production Release */, - BC_563308786207 /* Staging Debug */, - BC_790711614758 /* Staging Release */, - BC_835911551172 /* Test Debug */, - BC_685135820012 /* Test Release */, + BC_B2819DF0E90F3F3341B2B3A828778827 /* Production Debug */, + BC_4AC83F754F5BB02C3019E8AE2303E966 /* Production Release */, + BC_6396C78E99C21A774B9819DC09D88BD7 /* Staging Debug */, + BC_9EA5ADC667D6445EB2976A3CA508E70D /* Staging Release */, + BC_0198386D4EF48A4C053820EEEE1936CB /* Test Debug */, + BC_E9A1D87B4DB80BCC61D6B5F59D81865D /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_445731917037 /* Build configuration list for PBXAggregateTarget "SuperTarget" */ = { + CL_3ABBEC1A6EFC98F40894F5E4769650EF /* Build configuration list for PBXNativeTarget "iMessageExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_370290618113 /* Production Debug */, - BC_334821934458 /* Production Release */, - BC_439666751882 /* Staging Debug */, - BC_851086512031 /* Staging Release */, - BC_612244244384 /* Test Debug */, - BC_122527152613 /* Test Release */, + BC_3D9C1A83637AB10D5FFC5D4F8331091E /* Production Debug */, + BC_679AB0D3CA0237CCB4B711609C0CB16A /* Production Release */, + BC_9CAC5683B65F9EA32F4A78810EAE488B /* Staging Debug */, + BC_2F352436A75D33C6D3337012367BE90C /* Staging Release */, + BC_7527094FD7492E6A964EC95E7378EF22 /* Test Debug */, + BC_7477F8344D6D7313C39D897C1864F1B7 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_472296042419 /* Build configuration list for PBXNativeTarget "Framework_iOS" */ = { + CL_3BB54CFB2F2EFE7302C0B0709BD0AE04 /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_macOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_622471558373 /* Production Debug */, - BC_594849660073 /* Production Release */, - BC_313103118526 /* Staging Debug */, - BC_517306343059 /* Staging Release */, - BC_351179072988 /* Test Debug */, - BC_210338877784 /* Test Release */, + BC_5CBE4F01DBB084436375039EFEDDE6E4 /* Production Debug */, + BC_FF1009503385A37130A5A131E70F0B18 /* Production Release */, + BC_53BBB90244275C55B50604E0DC26809E /* Staging Debug */, + BC_F81BA31D0E5421AC0DDFB2D799C84E2E /* Staging Release */, + BC_63E4D52E21696EFA858D20EA01500612 /* Test Debug */, + BC_8433EE3901A89DD2CDDE9F61906433E5 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_479264660374 /* Build configuration list for PBXLegacyTarget "Legacy" */ = { + CL_674C71F7D7B679C67A944F0110840758 /* Build configuration list for PBXNativeTarget "Framework_watchOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_805283956103 /* Production Debug */, - BC_467730755629 /* Production Release */, - BC_444705348320 /* Staging Debug */, - BC_645651856160 /* Staging Release */, - BC_799591451484 /* Test Debug */, - BC_129177384103 /* Test Release */, + BC_FAA6D28DC24848759E58A2552BD37359 /* Production Debug */, + BC_5BC104FB79C437B79CC9D676B3B964D2 /* Production Release */, + BC_9F1E5E527BE355504381023DED9562C9 /* Staging Debug */, + BC_C60CBFC5B28D2B8906EAF4D4D3C81597 /* Staging Release */, + BC_BBA77AE6DA089F82907B6DFC338A6F37 /* Test Debug */, + BC_0271561C28AF4A74C6924A2187BC8487 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_480982116789 /* Build configuration list for PBXNativeTarget "App_macOS" */ = { + CL_6993244897DFCCF1F61A6136FDBE3C01 /* Build configuration list for PBXNativeTarget "XPC Service" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_280651168996 /* Production Debug */, - BC_627109222781 /* Production Release */, - BC_563702409464 /* Staging Debug */, - BC_914036878229 /* Staging Release */, - BC_866352849045 /* Test Debug */, - BC_707904794064 /* Test Release */, + BC_9F549905032A4927CF6B843899EF5775 /* Production Debug */, + BC_C9DCD449062A9160795D3701B9D2286E /* Production Release */, + BC_4F7A9BAD8AB16D47ECA510689FB5F899 /* Staging Debug */, + BC_11CBEB05340DE3C8F396B359A9144039 /* Staging Release */, + BC_D4F031939A239C28219748EFD83D30AA /* Test Debug */, + BC_80FA279C7B3455A79612ECAB12C9E8F6 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_507023492251 /* Build configuration list for PBXNativeTarget "App_watchOS Extension" */ = { + CL_7A3206BF9A92D4552AE40D148897BB3E /* Build configuration list for PBXNativeTarget "Framework_macOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_504862512837 /* Production Debug */, - BC_702596407424 /* Production Release */, - BC_864485046941 /* Staging Debug */, - BC_697789525657 /* Staging Release */, - BC_823840129404 /* Test Debug */, - BC_296138297674 /* Test Release */, + BC_5D33E2C3F29594425D03B339108871CF /* Production Debug */, + BC_58D5B708B08789E2DFD4D60A906AAA6E /* Production Release */, + BC_120D6C5C7E4D1D6566CBD71E11C3DF37 /* Staging Debug */, + BC_0D96F61E117D6A8D2353B0E7CB445AEA /* Staging Release */, + BC_5A05C344BCA2E54DFF945E68ECC21064 /* Test Debug */, + BC_6D1ED651D660692438EF3196506DC5AD /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; }; - CL_525119120469 /* Build configuration list for PBXNativeTarget "Framework_macOS" */ = { + CL_85167C2DED9F1F2F7D5162C1DD252426 /* Build configuration list for PBXProject "Project" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_705279564212 /* Production Debug */, - BC_282993554784 /* Production Release */, - BC_879000441352 /* Staging Debug */, - BC_765441740976 /* Staging Release */, - BC_108053643718 /* Test Debug */, - BC_741359447852 /* Test Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = ""; - }; - CL_618687462494 /* Build configuration list for PBXNativeTarget "iMessageExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC_488246438798 /* Production Debug */, - BC_831819337335 /* Production Release */, - BC_766399414659 /* Staging Debug */, - BC_167564962969 /* Staging Release */, - BC_309031681908 /* Test Debug */, - BC_609023497374 /* Test Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = ""; - }; - CL_662315837182 /* Build configuration list for PBXNativeTarget "Framework_tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC_275347760107 /* Production Debug */, - BC_493052431451 /* Production Release */, - BC_533481109982 /* Staging Debug */, - BC_760168680599 /* Staging Release */, - BC_655752097950 /* Test Debug */, - BC_380703106572 /* Test Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = ""; - }; - CL_783122899910 /* Build configuration list for PBXNativeTarget "App_iOS_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC_568886047790 /* Production Debug */, - BC_368555321779 /* Production Release */, - BC_644737893954 /* Staging Debug */, - BC_210307580165 /* Staging Release */, - BC_240587562436 /* Test Debug */, - BC_793714544511 /* Test Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = ""; - }; - CL_825232110500 /* Build configuration list for PBXNativeTarget "App_iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC_799916603316 /* Production Debug */, - BC_128103534773 /* Production Release */, - BC_480688547948 /* Staging Debug */, - BC_265230327262 /* Staging Release */, - BC_749393271654 /* Test Debug */, - BC_530755208334 /* Test Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = ""; - }; - CL_844877120535 /* Build configuration list for PBXProject "Project" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC_709947688544 /* Production Debug */, - BC_242096321611 /* Production Release */, - BC_397339763951 /* Staging Debug */, - BC_730521266150 /* Staging Release */, - BC_832100796021 /* Test Debug */, - BC_575374366235 /* Test Release */, + BC_209579D4C144FB697FDD46843485CC6A /* Production Debug */, + BC_6851DF4113AFF271AA5DD6D587181A03 /* Production Release */, + BC_96931434222054E6D7469B6B4EC67E87 /* Staging Debug */, + BC_A61B5D8B6C38C2B4C738A48343FB4CDA /* Staging Release */, + BC_FBF3614A1E9EDDE43929E81FDBD8B4B8 /* Test Debug */, + BC_19E3B21D0DA59BAF1B99899A35858D52 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Production Debug"; }; - CL_935153865209 /* Build configuration list for PBXNativeTarget "iMessageApp" */ = { + CL_89763567DCA601C83E4C78A9917D81AD /* Build configuration list for PBXNativeTarget "App_iOS_Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( - BC_507219048168 /* Production Debug */, - BC_609753632568 /* Production Release */, - BC_301490151478 /* Staging Debug */, - BC_275754663824 /* Staging Release */, - BC_704315531994 /* Test Debug */, - BC_249152711841 /* Test Release */, + BC_5901F7B4A1799821B3061B5EA7C4A033 /* Production Debug */, + BC_E52BEBA72F64BEC8F09733B49F7BA392 /* Production Release */, + BC_E6F51B0AAB0A7B33D902BD20A14E355C /* Staging Debug */, + BC_689C05D134F6C4AB2A86666C7C2D1E8F /* Staging Release */, + BC_A46551B496D75A9F6D5FF83C2308DC79 /* Test Debug */, + BC_833320F190FC427049CDF16E1B1AF316 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_91682ADED17A2C81A700A67F5D70BA1F /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_C38327E8FC090ADC83AA700666F26B0E /* Production Debug */, + BC_0D53E4051E21792867D5FA4A11B751AB /* Production Release */, + BC_69E8021CB05224B9CAC27F6AFA1763CA /* Staging Debug */, + BC_9360F45D8F5B06962ACEBF423299C71B /* Staging Release */, + BC_791A2E3F88BE34E647BEE192E06BBA74 /* Test Debug */, + BC_46EDEC047C02E1E271BADF861EFB2F8D /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_9FEF3E411E281B1820B2B067FC1C1B85 /* Build configuration list for PBXNativeTarget "Framework_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_724E9BA97FC0605F596460587FFD4C61 /* Production Debug */, + BC_D02EB4360B13F2E445DB48AD85FDFCE6 /* Production Release */, + BC_874C935D654D12F1F106CBEFBC4D2074 /* Staging Debug */, + BC_6A4D0B334934E5E4901A4164AD2DF70A /* Staging Release */, + BC_71D19FC08A12CCAB1A85C7A5320A451A /* Test Debug */, + BC_917ABD477C99455FF6BE1A89107FDEC9 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_A55E6C4018D2631D41C660DBF2113765 /* Build configuration list for PBXNativeTarget "Framework2_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_BFFBE0C278E007152F06241181A3457E /* Production Debug */, + BC_24042033AF9D3DEDAD53ACAF1C2BB0B2 /* Production Release */, + BC_88D810589CFF611B0D20C0CB47822274 /* Staging Debug */, + BC_DF27A9642DF4C47995FB0B0F4F6C2A98 /* Staging Release */, + BC_313481FFED1411A2B5969B70EBA94383 /* Test Debug */, + BC_8624FCCF5B865B80E0B21BA20FA0FAC5 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_AA475AE6741D5744A91627E7FAF4C986 /* Build configuration list for PBXNativeTarget "iMessageApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_50C3D866E3B57D83181A8F04E553F557 /* Production Debug */, + BC_CD673788A57DF4BFEB50B4F1581C742E /* Production Release */, + BC_5951C33138E508D3E6CA672980D5F2B6 /* Staging Debug */, + BC_93685F04BC9D8657E5D7B62B22E043AF /* Staging Release */, + BC_B19AA9EDCE45F13CA00B669DADF86395 /* Test Debug */, + BC_7A2C8B05671807E16D816BD7F0436418 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_B523BC91AF70F483BF998E2BA8DD6669 /* Build configuration list for PBXAggregateTarget "SuperTarget" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_1841B61F3F85EC24C4AACBC5C025BD08 /* Production Debug */, + BC_904676A8DD86F548E50090FAA97FD9E1 /* Production Release */, + BC_0E087681CE92CC2069F9E562ECC9FD23 /* Staging Debug */, + BC_C07EA83764F4BDE5F0059DC49805D92B /* Staging Release */, + BC_B2EA5B6CE006C3C8DB5A6AC3A2C78E59 /* Test Debug */, + BC_57D3973CA01D421550D834AFA79D2B4B /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_C50D7BB75115E8561A0975DE1B65E088 /* Build configuration list for PBXNativeTarget "App_watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_853248A59437336C149C6DD8E6E4A208 /* Production Debug */, + BC_42C4FEAD23C2FE1A906F4D37F43182AB /* Production Release */, + BC_3CCE54849732E01493DDDB7D86E033D4 /* Staging Debug */, + BC_919006DE8A7D104D16D1D4C0AB2CC241 /* Staging Release */, + BC_F1A1A29B491BDE527B8095C7420311D9 /* Test Debug */, + BC_16E1FCDA9DB6E70091B54603E4E6F58B /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_C7673A8886407721BA5BFA1B18F184D4 /* Build configuration list for PBXNativeTarget "App_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_C7D3757F2E3D9743FDC0CA97F807919C /* Production Debug */, + BC_1CF7F7BC6E19981DCBBFE6FE2D9FCB62 /* Production Release */, + BC_161B10E65E0BE143A17EADFA5EE88B3D /* Staging Debug */, + BC_DA5027F5182F7A40FB94FD282B57BC3E /* Staging Release */, + BC_AE11EA7D0985D3AD750BDB7F362B6726 /* Test Debug */, + BC_CECBF50DBAC4771C31C83814C20D07B2 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_D72660834ED9ED4EB0E973ABC256E014 /* Build configuration list for PBXNativeTarget "App_macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_80331E927C4BB7E48B375DB00FD90281 /* Production Debug */, + BC_C5288877BBCE2FA6BA4D3FACBFF3BA7F /* Production Release */, + BC_F947CECE4A424652DB631A640F423950 /* Staging Debug */, + BC_079D311B8C64F17C816583A1A4D84F42 /* Staging Release */, + BC_B52BB5E51BF8953D7DA1F42BA3803D2E /* Test Debug */, + BC_C507150F28216FCF1029C0C97677DBE5 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_DB66C428B606518C825ECFF73A5EF059 /* Build configuration list for PBXNativeTarget "App_iOS_UITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_9CDD286FAE4CE2FC296246C95A178023 /* Production Debug */, + BC_291E5C210DD53C3B3A4C6057C2B9652A /* Production Release */, + BC_E8AE376BBD8C86CFB51C9D5A490FDDBE /* Staging Debug */, + BC_19CBA184C0BDC24CE3657C025A8FC279 /* Staging Release */, + BC_B290BF236EBF078304DB54D0CE99B85A /* Test Debug */, + BC_E254C909463A5ADF59BD226772066ADA /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_E92E1636D45B284E44D38EB3EF7C98C9 /* Build configuration list for PBXNativeTarget "Framework2_watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_B3B360DE1D00D5D3DE54D0467886EEDD /* Production Debug */, + BC_FF3600FA7FDB235869A6CB7BBDBD8C86 /* Production Release */, + BC_85A9D050B594B6F44602E90470E75818 /* Staging Debug */, + BC_865AB65A39A201C7BF448737D287EF85 /* Staging Release */, + BC_D4FC53C776F8F2638D1D294F70517658 /* Test Debug */, + BC_83922E2AEA387FB9ABF402C3F401DBA1 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_F6ECF2D45799DBBB48DE9AE80AC280AA /* Build configuration list for PBXNativeTarget "StaticLibrary_ObjC_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_B3CC7B17DDF2C081536FC92CF25981BD /* Production Debug */, + BC_7D0687E6BFF4B05D03341A00447B5070 /* Production Release */, + BC_B6F81B24E04D91DFE5F36AAF99FCFA5D /* Staging Debug */, + BC_BC88A6EBF48BB9B821C5B8001678AC2E /* Staging Release */, + BC_1D9A30F2A4E9057FD8A7101D4AA4F47D /* Test Debug */, + BC_DA0BB134B708A4D257F250D3FA757711 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + CL_F8A83116F913B5DD0538C3680E08BDDB /* Build configuration list for PBXLegacyTarget "Legacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BC_057931652E9069AFF23BA573B6564BE5 /* Production Debug */, + BC_5B12F047BB0206FED25C955314A29B18 /* Production Release */, + BC_8895B9B729A8000331A682AF912CA229 /* Staging Debug */, + BC_2DB4D72679A12506C6A8B4728F130B7D /* Staging Release */, + BC_2D532F03F57D7D107FDAC3EF23DBFBFE /* Test Debug */, + BC_7BA9BA11D163D5F132FE6FFBA4DA1AB8 /* Test Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = ""; @@ -3950,19 +5066,19 @@ /* End XCConfigurationList section */ /* Begin XCVersionGroup section */ - VG_229021855709 /* Model.xcdatamodeld */ = { + VG_EB676136B9F946373D4796800CC00AD4 /* Model.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - FR_796781152159 /* Model 2.xcdatamodel */, - FR_263408310401 /* Model 3.xcdatamodel */, - FR_570918052822 /* Model.xcdatamodel */, + FR_347062562C9C212A082B1326BBCDC71B /* Model 2.xcdatamodel */, + FR_6643E0FE8DD9AAC71691A739070C6833 /* Model 3.xcdatamodel */, + FR_58A974F0E117C1384FD1B5147E524659 /* Model.xcdatamodel */, ); - currentVersion = FR_796781152159 /* Model 2.xcdatamodel */; + currentVersion = FR_347062562C9C212A082B1326BBCDC71B /* Model 2.xcdatamodel */; path = Model.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; /* End XCVersionGroup section */ }; - rootObject = P_8448771205358 /* Project object */; + rootObject = P_88EC38DC1E39C9039D2FA49EDC2FA124 /* Project object */; } diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_Scheme.xcscheme b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_Scheme.xcscheme new file mode 100644 index 00000000..4fb7309b --- /dev/null +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_Scheme.xcscheme @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS Production.xcscheme similarity index 91% rename from Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme rename to Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS Production.xcscheme index 7ab45029..0d8babba 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS Production.xcscheme @@ -1,6 +1,6 @@ @@ -33,7 +33,7 @@ skipped = "NO"> @@ -43,7 +43,7 @@ skipped = "NO"> @@ -53,21 +53,21 @@ - - + + @@ -86,21 +86,21 @@ runnableDebuggingMode = "0"> - - + + @@ -115,21 +115,21 @@ runnableDebuggingMode = "0"> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS Test.xcscheme b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS Test.xcscheme new file mode 100644 index 00000000..0978b814 --- /dev/null +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS Test.xcscheme @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_watchOS.xcscheme b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_watchOS.xcscheme index e90239d7..fa84f4f3 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_watchOS.xcscheme +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_watchOS.xcscheme @@ -1,6 +1,6 @@ @@ -32,7 +32,7 @@ @@ -57,7 +57,7 @@ runnableDebuggingMode = "0"> @@ -78,7 +78,7 @@ runnableDebuggingMode = "0"> diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/Framework.xcscheme b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/Framework.xcscheme index 7cd199b6..6901dafc 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/Framework.xcscheme +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/Framework.xcscheme @@ -1,6 +1,6 @@ @@ -32,7 +32,7 @@ buildForAnalyzing = "YES"> @@ -44,18 +44,21 @@ buildConfiguration = "Production Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + codeCoverageEnabled = "YES" shouldUseLaunchSchemeArgsEnv = "YES"> + + @@ -72,7 +75,7 @@ @@ -101,7 +104,7 @@ runnableDebuggingMode = "0"> diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/iMessageApp.xcscheme b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/iMessageApp.xcscheme index 5715467e..2ea9c044 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/iMessageApp.xcscheme +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/iMessageApp.xcscheme @@ -1,6 +1,6 @@ @@ -32,7 +32,7 @@ @@ -57,7 +57,7 @@ runnableDebuggingMode = "0"> @@ -78,7 +78,7 @@ runnableDebuggingMode = "0"> diff --git a/Tests/Fixtures/TestProject/build.sh b/Tests/Fixtures/TestProject/build.sh new file mode 100755 index 00000000..ad36f73a --- /dev/null +++ b/Tests/Fixtures/TestProject/build.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +carthage bootstrap --cache-builds +echo " +Building iOS app" +xcodebuild -project Project.xcodeproj -scheme "App_iOS Test" -configuration "Test Debug" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO | xcpretty +echo " +Building macOS app" +xcodebuild -project Project.xcodeproj -scheme "App_macOS" -configuration "Test Debug" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO | xcpretty diff --git a/Tests/Fixtures/TestProject/project.yml b/Tests/Fixtures/TestProject/project.yml index c95cf784..0f6111cc 100644 --- a/Tests/Fixtures/TestProject/project.yml +++ b/Tests/Fixtures/TestProject/project.yml @@ -26,18 +26,33 @@ targets: App_macOS: type: application platform: macOS + info: + path: App_macOS/Info.plist + properties: + LSMinimumSystemVersion: $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile: Main + NSPrincipalClass: NSApplication + CFBundleIconFile: "" + CustomSetting: $CUSTOM_SETTING attributes: ProvisioningStyle: Automatic sources: + - path: App_macOS - path: StandaloneFiles/Standalone.swift - path: Vendor/SomeXPCService.xpc dependencies: - target: Framework_macOS - target: XPC Service + - sdk: Contacts.framework + - sdk: libc++.tbd App_iOS: type: application platform: iOS + entitlements: + path: App_iOS/App.entitlements + properties: + com.apple.security.application-groups: group.com.app attributes: ProvisioningStyle: Automatic sources: @@ -70,16 +85,23 @@ targets: PRODUCT_BUNDLE_IDENTIFIER: com.project.app dependencies: - target: Framework_iOS - - target: StaticLibrary_ObjC - - carthage: Alamofire + - target: StaticLibrary_ObjC_iOS + - carthage: Result + - target: Framework2_iOS + weak: true - target: App_watchOS - target: iMessageApp - framework: Vendor/SomeFramework.framework + - sdk: Contacts.framework scheme: testTargets: - App_iOS_Tests - App_iOS_UITests gatherCoverageData: true + configVariants: + - Test + - Staging + - Production commandLineArguments: MyEnabledArgument: true MyDisabledArgument: false @@ -111,7 +133,8 @@ targets: settings: PRODUCT_BUNDLE_IDENTIFIER: com.project.app.watch.extension dependencies: - - carthage: Alamofire + - carthage: Result + link: false iMessageApp: type: application.messages @@ -130,7 +153,7 @@ targets: StaticLibrary_ObjC: type: library.static - platform: iOS + platform: [iOS, tvOS, watchOS, macOS] sources: StaticLibrary_ObjC StaticLibrary_Swift: @@ -153,8 +176,17 @@ targets: - name: MyScript path: scripts/script.sh dependencies: - - carthage: Alamofire - - target: StaticLibrary_ObjC + - carthage: Result + - target: StaticLibrary_ObjC_$platform + + Framework2: + type: framework + platform: [iOS, tvOS, watchOS, macOS] + sources: + - path: Framework + excludes: + - "*.xcodeproj" + App_iOS_Tests: type: bundle.unit-test platform: iOS @@ -188,6 +220,19 @@ schemes: commandLineArguments: argument: YES argument.with.dot: YES + test: + gatherCoverageData: true + App_Scheme: + build: + targets: + App_iOS: all + test: + gatherCoverageData: true + targets: + - App_iOS_UITests + - name: App_iOS_Tests + parallelizable: true + randomExecutionOrder: true targetTemplates: MyTemplate: scheme: {} diff --git a/Tests/PerformanceTests/PerformanceTests.swift b/Tests/PerformanceTests/PerformanceTests.swift new file mode 100644 index 00000000..8fff4947 --- /dev/null +++ b/Tests/PerformanceTests/PerformanceTests.swift @@ -0,0 +1,60 @@ +import Foundation +import PathKit +import ProjectSpec +import XcodeGenKit +import xcodeproj +import XCTest + +class GeneratedPerformanceTests: XCTestCase { + + let basePath = Path.temporary + "XcodeGenPeformanceTests" + + func testGeneration() throws { + let project = try Project.testProject(basePath: basePath) + measure { + let generator = ProjectGenerator(project: project) + _ = try! generator.generateXcodeProject() + } + } + + func testWriting() throws { + let project = try Project.testProject(basePath: basePath) + let generator = ProjectGenerator(project: project) + let xcodeProject = try generator.generateXcodeProject() + measure { + xcodeProject.pbxproj.invalidateUUIDs() + try! xcodeProject.write(path: project.defaultProjectPath) + } + } +} + +let fixturePath = Path(#file).parent().parent() + "Fixtures" + +class FixturePerformanceTests: XCTestCase { + + let specPath = fixturePath + "TestProject/project.yml" + + func testFixtureDecoding() throws { + measure { + _ = try! Project(path: specPath) + } + } + + func testFixtureGeneration() throws { + let project = try Project(path: specPath) + measure { + let generator = ProjectGenerator(project: project) + _ = try! generator.generateXcodeProject() + } + } + + func testFixtureWriting() throws { + let project = try Project(path: specPath) + let generator = ProjectGenerator(project: project) + let xcodeProject = try generator.generateXcodeProject() + measure { + xcodeProject.pbxproj.invalidateUUIDs() + try! xcodeProject.write(path: project.defaultProjectPath) + } + } +} diff --git a/Tests/PerformanceTests/TestProject.swift b/Tests/PerformanceTests/TestProject.swift new file mode 100644 index 00000000..21c24fb5 --- /dev/null +++ b/Tests/PerformanceTests/TestProject.swift @@ -0,0 +1,177 @@ +import Foundation +import PathKit +import ProjectSpec +import xcodeproj + +extension Project { + + static func testProject(basePath: Path, createSources: Bool = true) throws -> Project { + + if createSources { + try? basePath.delete() + try basePath.mkpath() + } + + var paths: [Path] = [] + var targets: [Target] = [] + let scheme = TargetScheme( + testTargets: [], + configVariants: ["Test", "Staging", "Prod"], + gatherCoverageData: true, + commandLineArguments: [ + "--command": true, + "--command2": false, + ], + environmentVariables: [ + XCScheme.EnvironmentVariable(variable: "ENV", value: "HELLO", enabled: true), + XCScheme.EnvironmentVariable(variable: "ENV2", value: "HELLO", enabled: false), + ], + preActions: [Scheme.ExecutionAction(name: "run", script: "script")], + postActions: [Scheme.ExecutionAction(name: "run", script: "script")] + ) + for platform in Platform.all { + let appTarget = Target( + name: "App_\(platform)", + type: .application, + platform: platform, + sources: [TargetSource(path: "App_\(platform)")], + dependencies: [ + Dependency(type: .target, reference: "Framework_\(platform)"), + Dependency(type: .target, reference: "Framework2_\(platform)"), + Dependency(type: .carthage, reference: "Alamofire"), + Dependency(type: .carthage, reference: "BrightFutures"), + ], + scheme: scheme + ) + targets.append(appTarget) + if createSources { + paths += try createTargetSources(path: basePath, target: appTarget) + } + + let testTarget = Target( + name: "App_Test_\(platform)", + type: .unitTestBundle, + platform: platform, + sources: [TargetSource(path: "App_Test_\(platform)")], + dependencies: [ + Dependency(type: .target, reference: "App_\(platform)"), + Dependency(type: .target, reference: "Framework_\(platform)"), + Dependency(type: .target, reference: "Framework2_\(platform)"), + ], + scheme: scheme + ) + targets.append(testTarget) + if createSources { + paths += try createTargetSources(path: basePath, target: testTarget) + } + + let frameworkTarget = Target( + name: "Framework_\(platform)", + type: .framework, + platform: platform, + sources: [ + TargetSource(path: "Framework_\(platform)"), + ], + dependencies: [ + Dependency(type: .carthage, reference: "Alamofire"), + ], + scheme: scheme + ) + targets.append(frameworkTarget) + if createSources { + paths += try createTargetSources(path: basePath, target: frameworkTarget) + } + + let frameworkTarget2 = Target( + name: "Framework2_\(platform)", + type: .framework, + platform: platform, + sources: [TargetSource(path: "Framework2_\(platform)")], + dependencies: [ + Dependency(type: .target, reference: "Framework_\(platform)"), + Dependency(type: .carthage, reference: "Alamofire"), + Dependency(type: .carthage, reference: "BrightFutures"), + ], + scheme: scheme + ) + targets.append(frameworkTarget2) + if createSources { + paths += try createTargetSources(path: basePath, target: frameworkTarget2) + } + } + if createSources { + let files = paths.filter { $0.isFile } + let directories = paths.filter { $0.isDirectory } + print("Generated \(files.count) files and \(directories.count) directories") + } + + return Project( + basePath: basePath, + name: "Project", + configs: [ + Config(name: "Debug Test", type: .debug), + Config(name: "Release Test", type: .release), + Config(name: "Debug Staging", type: .debug), + Config(name: "Release Staging", type: .release), + Config(name: "Debug Production", type: .debug), + Config(name: "Release Production", type: .release), + ], + targets: targets, + aggregateTargets: [], + settings: [:], + settingGroups: [:], + schemes: [], + options: SpecOptions(), + fileGroups: [], + configFiles: [:], + attributes: [:] + ) + } + + fileprivate static func createTargetSources(path: Path, target: Target) throws -> [Path] { + let levels = 3 + let directoriesPerLevel = 1 + let swiftFilesPerDirectory = 5 + let objFilesPerDirectory = 2 + let resourcesPerDirectory = 2 + var paths: [Path] = [] + + func createDirectory(_ path: Path, depth: Int = 0) throws { + try path.mkpath() + paths.append(path) + + for swiftFile in 1 ... swiftFilesPerDirectory { + let file = path + "file_\(swiftFile).swift" + try file.write("") + paths.append(file) + } + + for resourceFile in 1 ... resourcesPerDirectory { + let file = path + "file_\(resourceFile).png" + try file.write("") + paths.append(file) + } + + for objFile in 1 ... objFilesPerDirectory { + let header = path + "file_\(objFile).h" + try header.write("") + paths.append(header) + + let implementation = path + "file_\(objFile).m" + try implementation.write("") + paths.append(implementation) + } + + if depth < levels - 1 { + for directory in 1 ... directoriesPerLevel { + try createDirectory(path + "directory_\(directory)", depth: depth + 1) + } + } + } + + for source in target.sources { + try createDirectory(path + source.path) + } + return paths + } +} diff --git a/Tests/XcodeGenKitTests/GeneratorHelpers.swift b/Tests/XcodeGenKitTests/GeneratorHelpers.swift index 11157fca..a579686b 100644 --- a/Tests/XcodeGenKitTests/GeneratorHelpers.swift +++ b/Tests/XcodeGenKitTests/GeneratorHelpers.swift @@ -2,7 +2,7 @@ import PathKit import ProjectSpec import Spectre import XcodeGenKit -import xcproj +import xcodeproj import XCTest import Yams @@ -10,6 +10,7 @@ extension Project { func generateXcodeProject(file: String = #file, line: Int = #line) throws -> XcodeProj { return try doThrowing(file: file, line: line) { + try validate() let generator = ProjectGenerator(project: self) return try generator.generateXcodeProject() } @@ -32,12 +33,15 @@ extension PBXProj { let mainGroup = try getMainGroup() func validateGroup(_ group: PBXGroup) throws { - let hasDuplicatedChildren = group.children.count != Set(group.children).count - if hasDuplicatedChildren { - throw failure("Group \"\(group.nameOrPath)\" has duplicated children:\n - \(group.children.sorted().joined(separator: "\n - "))") + + // check for duplicte children + let dictionary = Dictionary(grouping: group.children) { $0.hashValue } + let mostChildren = dictionary.sorted { $0.value.count > $1.value.count } + if let first = mostChildren.first, first.value.count > 1 { + throw failure("Group \"\(group.nameOrPath)\" has duplicated children:\n - \(group.children.map { $0.nameOrPath }.joined(separator: "\n - "))") } for child in group.children { - if let group = objects.groups.getReference(child) { + if let group = child as? PBXGroup { try validateGroup(group) } } diff --git a/Tests/XcodeGenKitTests/ProjectFixtureTests.swift b/Tests/XcodeGenKitTests/ProjectFixtureTests.swift index b66e50b3..3f125a77 100644 --- a/Tests/XcodeGenKitTests/ProjectFixtureTests.swift +++ b/Tests/XcodeGenKitTests/ProjectFixtureTests.swift @@ -2,81 +2,25 @@ import PathKit import ProjectSpec import Spectre import XcodeGenKit -import xcproj +import xcodeproj import XCTest class ProjectFixtureTests: XCTestCase { func testProjectFixture() { describe { - var xcodeProject: XcodeProj? - $0.it("generates") { - xcodeProject = try generateXcodeProject(specPath: fixturePath + "TestProject/project.yml", projectPath: fixturePath + "TestProject/Project.xcodeproj") - } - - $0.it("generates variant group") { - guard let xcodeProject = xcodeProject else { return } - - func getFileReferences(_ path: String) -> [ObjectReference] { - return xcodeProject.pbxproj.objects.fileReferences.objectReferences.filter { $0.object.path == path } - } - - func getVariableGroups(_ name: String?) -> [PBXVariantGroup] { - return xcodeProject.pbxproj.objects.variantGroups.referenceValues.filter { $0.name == name } - } - - let resourceName = "LocalizedStoryboard.storyboard" - let baseResource = "Base.lproj/LocalizedStoryboard.storyboard" - let localizedResource = "en.lproj/LocalizedStoryboard.strings" - - guard let variableGroup = getVariableGroups(resourceName).first else { throw failure("Couldn't find the variable group") } - - do { - let refs = getFileReferences(baseResource) - try expect(refs.count) == 1 - try expect(variableGroup.children.filter { $0 == refs.first?.reference }.count) == 1 - } - - do { - let refs = getFileReferences(localizedResource) - try expect(refs.count) == 1 - try expect(variableGroup.children.filter { $0 == refs.first?.reference }.count) == 1 - } - } - - $0.it("generates scheme execution actions") { - guard let xcodeProject = xcodeProject else { return } - - let frameworkScheme = xcodeProject.sharedData?.schemes.first { $0.name == "Framework" } - try expect(frameworkScheme?.buildAction?.preActions.first?.scriptText) == "echo Starting Framework Build" - try expect(frameworkScheme?.buildAction?.preActions.first?.title) == "Run Script" - try expect(frameworkScheme?.buildAction?.preActions.first?.environmentBuildable?.blueprintName) == "Framework_iOS" - try expect(frameworkScheme?.buildAction?.preActions.first?.environmentBuildable?.buildableName) == "Framework.framework" + try generateXcodeProject(specPath: fixturePath + "TestProject/project.yml") } } } } -fileprivate func generateXcodeProject(specPath: Path, projectPath: Path, file: String = #file, line: Int = #line) throws -> XcodeProj { +fileprivate func generateXcodeProject(specPath: Path, file: String = #file, line: Int = #line) throws { let project = try Project(path: specPath) let generator = ProjectGenerator(project: project) + let writer = FileWriter(project: project) let xcodeProject = try generator.generateXcodeProject() - let oldProject = try XcodeProj(path: projectPath) - let pbxProjPath = projectPath + XcodeProj.pbxprojPath(projectPath) - let oldProjectString: String = try pbxProjPath.read() - try xcodeProject.write(path: projectPath, override: true) - let newProjectString: String = try pbxProjPath.read() - - let newProject = try XcodeProj(path: projectPath) - let stringDiff = newProjectString != oldProjectString - if newProject != oldProject || stringDiff { - var message = "\(projectPath.string) has changed. If change is legitimate commit the change and run test again" - if stringDiff { - message += ":\n\n\(pbxProjPath):\n\(prettyFirstDifferenceBetweenStrings(oldProjectString, newProjectString))" - } - throw failure(message, file: file, line: line) - } - - return newProject + try writer.writeXcodeProject(xcodeProject) + try writer.writePlists() } diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 5432f203..3dd7158f 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -2,7 +2,7 @@ import PathKit import ProjectSpec import Spectre import XcodeGenKit -import xcproj +import xcodeproj import XCTest import Yams @@ -21,6 +21,12 @@ fileprivate let framework = Target( settings: Settings(buildSettings: ["SETTING_2": "VALUE"]) ) +fileprivate let optionalFramework = Target( + name: "MyOptionalFramework", + type: .framework, + platform: .iOS +) + fileprivate let uiTest = Target( name: "MyAppUITests", type: .uiTestBundle, @@ -29,7 +35,7 @@ fileprivate let uiTest = Target( dependencies: [Dependency(type: .target, reference: "MyApp")] ) -fileprivate let targets = [app, framework, uiTest] +fileprivate let targets = [app, framework, optionalFramework, uiTest] class ProjectGeneratorTests: XCTestCase { @@ -41,11 +47,9 @@ class ProjectGeneratorTests: XCTestCase { let options = SpecOptions(bundleIdPrefix: "com.test") let project = Project(basePath: "", name: "test", targets: [framework], options: options) let pbxProj = try project.generatePbxProj() - guard let target = pbxProj.objects.nativeTargets.first?.value, + guard let target = pbxProj.nativeTargets.first, let buildConfigList = target.buildConfigurationList, - let buildConfigs = pbxProj.objects.configurationLists.getReference(buildConfigList), - let buildConfigReference = buildConfigs.buildConfigurations.first, - let buildConfig = pbxProj.objects.buildConfigurations.getReference(buildConfigReference) else { + let buildConfig = buildConfigList.buildConfigurations.first else { throw failure("Build Config not found") } try expect(buildConfig.buildSettings["PRODUCT_BUNDLE_IDENTIFIER"] as? String) == "com.test.MyFramework" @@ -55,15 +59,15 @@ class ProjectGeneratorTests: XCTestCase { let options = SpecOptions(settingPresets: .none) let project = Project(basePath: "", name: "test", targets: [framework], options: options) let pbxProj = try project.generatePbxProj() - let allSettings = pbxProj.objects.buildConfigurations.referenceValues.reduce([:]) { $0.merged($1.buildSettings) }.keys.sorted() - try expect(allSettings) == ["SETTING_2"] + let allSettings = pbxProj.buildConfigurations.reduce([:]) { $0.merged($1.buildSettings) }.keys.sorted() + try expect(allSettings) == ["SDKROOT", "SETTING_2"] } $0.it("generates development language") { let options = SpecOptions(developmentLanguage: "de") let project = Project(basePath: "", name: "test", options: options) let pbxProj = try project.generatePbxProj() - guard let pbxProject = pbxProj.objects.projects.first?.value else { + guard let pbxProject = pbxProj.projects.first else { throw failure("Could't find PBXProject") } try expect(pbxProject.developmentRegion) == "de" @@ -92,8 +96,8 @@ class ProjectGeneratorTests: XCTestCase { let project = Project(basePath: "", name: "test", configs: [Config(name: "Aconfig"), Config(name: "Bconfig")], targets: [framework], options: options) let pbxProject = try project.generatePbxProj() - guard let projectConfigListReference = pbxProject.objects.projects.values.first?.buildConfigurationList, - let defaultConfigurationName = pbxProject.objects.configurationLists[projectConfigListReference]?.defaultConfigurationName + guard let projectConfigList = pbxProject.projects.first?.buildConfigurationList, + let defaultConfigurationName = projectConfigList.defaultConfigurationName else { throw failure("Default configuration name not found") } @@ -109,7 +113,7 @@ class ProjectGeneratorTests: XCTestCase { $0.it("generates config defaults") { let project = Project(basePath: "", name: "test") let pbxProj = try project.generatePbxProj() - let configs = pbxProj.objects.buildConfigurations.referenceValues + let configs = pbxProj.buildConfigurations try expect(configs.count) == 2 try expect(configs).contains(name: "Debug") try expect(configs).contains(name: "Release") @@ -122,7 +126,7 @@ class ProjectGeneratorTests: XCTestCase { configs: [Config(name: "config1"), Config(name: "config2")] ) let pbxProj = try project.generatePbxProj() - let configs = pbxProj.objects.buildConfigurations.referenceValues + let configs = pbxProj.buildConfigurations try expect(configs.count) == 2 try expect(configs).contains(name: "config1") try expect(configs).contains(name: "config2") @@ -135,7 +139,7 @@ class ProjectGeneratorTests: XCTestCase { configs: [Config(name: "config")] ) let pbxProj = try project.generatePbxProj() - guard let config = pbxProj.objects.buildConfigurations.first?.value else { + guard let config = pbxProj.buildConfigurations.first else { throw failure("configuration not found") } try expect(config.buildSettings.isEmpty).to.beTrue() @@ -150,6 +154,7 @@ class ProjectGeneratorTests: XCTestCase { let targetDebugSettings = project.getTargetBuildSettings(target: target, config: config) var buildSettings = BuildSettings() + buildSettings += ["SDKROOT": "iphoneos"] buildSettings += SettingsPresetFile.base.getBuildSettings() buildSettings += SettingsPresetFile.config(.debug).getBuildSettings() @@ -184,6 +189,23 @@ class ProjectGeneratorTests: XCTestCase { try expect(buildSettings["SETTING1"] as? String) == "VALUE1" try expect(buildSettings["SETTING2"] as? String) == "VALUE2" } + + $0.it("sets project SDKROOT if there is only a single platform") { + var project = Project( + basePath: "", + name: "test", + targets: [ + Target(name: "1", type: .application, platform: .iOS), + Target(name: "2", type: .framework, platform: .iOS), + ] + ) + var buildSettings = project.getProjectBuildSettings(config: project.configs.first!) + try expect(buildSettings["SDKROOT"] as? String) == "iphoneos" + + project.targets.append(Target(name: "3", type: .application, platform: .tvOS)) + buildSettings = project.getProjectBuildSettings(config: project.configs.first!) + try expect(buildSettings["SDKROOT"]).beNil() + } } } @@ -198,8 +220,8 @@ class ProjectGeneratorTests: XCTestCase { $0.it("generates aggregate targets") { let pbxProject = try project.generatePbxProj() - let nativeTargets = pbxProject.objects.nativeTargets.referenceValues - let aggregateTargets = pbxProject.objects.aggregateTargets.referenceValues + let nativeTargets = pbxProject.nativeTargets.sorted { $0.name < $1.name } + let aggregateTargets = pbxProject.aggregateTargets.sorted { $0.name < $1.name } try expect(nativeTargets.count) == 4 try expect(aggregateTargets.count) == 2 @@ -216,8 +238,7 @@ class ProjectGeneratorTests: XCTestCase { let target2 = nativeTargets.first { $0.name == "Other2" } try expect(target2?.dependencies.count) == 2 - let targetDependencies = pbxProject.objects.targetDependencies.referenceValues - try expect(targetDependencies.count) == 7 + try expect(pbxProject.targetDependencies.count) == 7 } } } @@ -229,11 +250,12 @@ class ProjectGeneratorTests: XCTestCase { $0.it("generates targets") { let pbxProject = try project.generatePbxProj() - let nativeTargets = pbxProject.objects.nativeTargets.referenceValues - try expect(nativeTargets.count) == 3 + let nativeTargets = pbxProject.nativeTargets + try expect(nativeTargets.count) == 4 try expect(nativeTargets.contains { $0.name == app.name }).beTrue() try expect(nativeTargets.contains { $0.name == framework.name }).beTrue() try expect(nativeTargets.contains { $0.name == uiTest.name }).beTrue() + try expect(nativeTargets.contains { $0.name == optionalFramework.name }).beTrue() } $0.it("generates target attributes") { @@ -243,25 +265,25 @@ class ProjectGeneratorTests: XCTestCase { var testTargetWithAttributes = uiTest testTargetWithAttributes.settings.buildSettings["CODE_SIGN_STYLE"] = "Manual" - let project = Project(basePath: "", name: "test", targets: [appTargetWithAttributes, framework, testTargetWithAttributes]) + let project = Project(basePath: "", name: "test", targets: [appTargetWithAttributes, framework, optionalFramework, testTargetWithAttributes]) let pbxProject = try project.generatePbxProj() - guard let targetAttributes = pbxProject.objects.projects.referenceValues.first?.attributes["TargetAttributes"] as? [String: [String: Any]] else { + guard let targetAttributes = pbxProject.projects.first?.targetAttributes else { throw failure("Couldn't find Project TargetAttributes") } - guard let appTarget = pbxProject.objects.targets(named: app.name).first else { + guard let appTarget = pbxProject.targets(named: app.name).first else { throw failure("Couldn't find App Target") } - guard let uiTestTarget = pbxProject.objects.targets(named: uiTest.name).first else { + guard let uiTestTarget = pbxProject.targets(named: uiTest.name).first else { throw failure("Couldn't find UITest Target") } - try expect(targetAttributes[uiTestTarget.reference]?["TestTargetID"] as? String) == appTarget.reference - try expect(targetAttributes[uiTestTarget.reference]?["ProvisioningStyle"] as? String) == "Manual" - try expect(targetAttributes[appTarget.reference]?["ProvisioningStyle"] as? String) == "Automatic" - try expect(targetAttributes[appTarget.reference]?["DevelopmentTeam"] as? String) == "123" + try expect((targetAttributes[uiTestTarget]?["TestTargetID"] as? PBXNativeTarget)?.name) == app.name + try expect(targetAttributes[uiTestTarget]?["ProvisioningStyle"] as? String) == "Manual" + try expect(targetAttributes[appTarget]?["ProvisioningStyle"] as? String) == "Automatic" + try expect(targetAttributes[appTarget]?["DevelopmentTeam"] as? String) == "123" } $0.it("generates platform version") { @@ -270,16 +292,14 @@ class ProjectGeneratorTests: XCTestCase { let pbxProject = try project.generatePbxProj() - guard let projectConfigListReference = pbxProject.objects.projects.values.first?.buildConfigurationList, - let projectConfigReference = pbxProject.objects.configurationLists[projectConfigListReference]?.buildConfigurations.first, - let projectConfig = pbxProject.objects.buildConfigurations[projectConfigReference] + guard let projectConfigList = pbxProject.projects.first?.buildConfigurationList, + let projectConfig = projectConfigList.buildConfigurations.first else { throw failure("Couldn't find Project config") } - guard let targetConfigListReference = pbxProject.objects.nativeTargets.referenceValues.first?.buildConfigurationList, - let targetConfigReference = pbxProject.objects.configurationLists[targetConfigListReference]?.buildConfigurations.first, - let targetConfig = pbxProject.objects.buildConfigurations[targetConfigReference] + guard let targetConfigList = pbxProject.nativeTargets.first?.buildConfigurationList, + let targetConfig = targetConfigList.buildConfigurations.first else { throw failure("Couldn't find Target config") } @@ -296,14 +316,14 @@ class ProjectGeneratorTests: XCTestCase { $0.it("generates dependencies") { let pbxProject = try project.generatePbxProj() - let nativeTargets = pbxProject.objects.nativeTargets.objectReferences - let dependencies = pbxProject.objects.targetDependencies.objectReferences + let nativeTargets = pbxProject.nativeTargets + let dependencies = pbxProject.targetDependencies.sorted { $0.target?.name ?? "" < $1.target?.name ?? "" } try expect(dependencies.count) == 2 - let appTarget = nativeTargets.first { $0.object.name == app.name } - let frameworkTarget = nativeTargets.first { $0.object.name == framework.name } + let appTarget = nativeTargets.first { $0.name == app.name } + let frameworkTarget = nativeTargets.first { $0.name == framework.name } - try expect(dependencies).contains { $0.object.target == appTarget?.reference } - try expect(dependencies).contains { $0.object.target == frameworkTarget?.reference } + try expect(dependencies).contains { $0.target == appTarget } + try expect(dependencies).contains { $0.target == frameworkTarget } } $0.it("generates targets with correct transitive embeds") { @@ -543,20 +563,21 @@ class ProjectGeneratorTests: XCTestCase { let pbxProject = try project.generatePbxProj() for target in targets { - guard let nativeTarget = pbxProject.objects.nativeTargets.referenceValues.first(where: { $0.name == target.name }) else { + guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == target.name }) else { throw failure("PBXNativeTarget for \(target) not found") } let buildPhases = nativeTarget.buildPhases - let resourcesPhases = pbxProject.objects.resourcesBuildPhases.objectReferences.filter { buildPhases.contains($0.reference) } - let frameworkPhases = pbxProject.objects.frameworksBuildPhases.objectReferences.filter { buildPhases.contains($0.reference) } - let copyFilesPhases = pbxProject.objects.copyFilesBuildPhases.objectReferences.filter { buildPhases.contains($0.reference) } + let resourcesPhases = pbxProject.resourcesBuildPhases.filter { buildPhases.contains($0) } + let frameworkPhases = pbxProject.frameworksBuildPhases.filter { buildPhases.contains($0) } + let copyFilesPhases = pbxProject.copyFilesBuildPhases.filter { buildPhases.contains($0) } // ensure only the right resources are copies, no more, no less let expectedResourceFiles = expectedResourceFiles[target.name]! try expect(resourcesPhases.count) == (expectedResourceFiles.isEmpty ? 0 : 1) if !expectedResourceFiles.isEmpty { - let resourceFiles = resourcesPhases[0].object.files - .compactMap { pbxProject.objects.buildFiles[$0]?.fileRef.flatMap { pbxProject.objects.fileReferences[$0]?.nameOrPath } } + let resourceFiles = resourcesPhases[0].files + .compactMap { $0.file } + .map { $0.nameOrPath } try expect(Set(resourceFiles)) == expectedResourceFiles } @@ -564,8 +585,8 @@ class ProjectGeneratorTests: XCTestCase { let expectedLinkedFiles = expectedLinkedFiles[target.name]! try expect(frameworkPhases.count) == (expectedLinkedFiles.isEmpty ? 0 : 1) if !expectedLinkedFiles.isEmpty { - let linkFrameworks = frameworkPhases[0].object.files - .compactMap { pbxProject.objects.buildFiles[$0]?.fileRef.flatMap { pbxProject.objects.fileReferences[$0]?.nameOrPath } } + let linkFrameworks = frameworkPhases[0].files + .compactMap { $0.file?.nameOrPath } try expect(Set(linkFrameworks)) == expectedLinkedFiles } @@ -573,8 +594,8 @@ class ProjectGeneratorTests: XCTestCase { let expectedEmbeddedFrameworks = expectedEmbeddedFrameworks[target.name]! try expect(copyFilesPhases.count) == (expectedEmbeddedFrameworks.isEmpty ? 0 : 1) if !expectedEmbeddedFrameworks.isEmpty { - let copyFiles = copyFilesPhases[0].object.files - .compactMap { pbxProject.objects.buildFiles[$0]?.fileRef.flatMap { pbxProject.objects.fileReferences[$0]?.nameOrPath } } + let copyFiles = copyFilesPhases[0].files + .compactMap { $0.file?.nameOrPath } try expect(Set(copyFiles)) == expectedEmbeddedFrameworks } } @@ -641,11 +662,9 @@ class ProjectGeneratorTests: XCTestCase { let pbxProj = try project.generatePbxProj() func buildSettings(for target: Target) throws -> BuildSettings { - guard let nativeTarget = pbxProj.objects.targets(named: target.name).first?.object, + guard let nativeTarget = pbxProj.targets(named: target.name).first, let buildConfigList = nativeTarget.buildConfigurationList, - let buildConfigs = pbxProj.objects.configurationLists.getReference(buildConfigList), - let buildConfigReference = buildConfigs.buildConfigurations.first, - let buildConfig = pbxProj.objects.buildConfigurations.getReference(buildConfigReference) else { + let buildConfig = buildConfigList.buildConfigurations.first else { throw failure("XCBuildConfiguration not found for Target \(target.name.quoted)") } @@ -699,16 +718,15 @@ class ProjectGeneratorTests: XCTestCase { let pbxProject = try project.generatePbxProj() func scriptBuildPhases(target: Target) throws -> [PBXShellScriptBuildPhase] { - guard let nativeTarget = pbxProject.objects.nativeTargets.referenceValues.first(where: { $0.name == target.name }) else { + guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == target.name }) else { throw failure("PBXNativeTarget for \(target) not found") } let buildPhases = nativeTarget.buildPhases - let scriptPhases = pbxProject.objects.shellScriptBuildPhases.objectReferences.filter({ buildPhases.contains($0.reference) }).map { $0.object } + let scriptPhases = buildPhases.compactMap { $0 as? PBXShellScriptBuildPhase } return scriptPhases } let expectedScriptPhase = PBXShellScriptBuildPhase( - files: [], name: "Copy Swift Objective-C Interface Header", inputPaths: ["$(DERIVED_SOURCES_DIR)/$(SWIFT_OBJC_INTERFACE_HEADER_NAME)"], outputPaths: ["$(BUILT_PRODUCTS_DIR)/include/$(PRODUCT_MODULE_NAME)/$(SWIFT_OBJC_INTERFACE_HEADER_NAME)"], @@ -728,25 +746,20 @@ class ProjectGeneratorTests: XCTestCase { scriptSpec.targets[0].postBuildScripts = [BuildScript(script: .script("script3"))] let pbxProject = try scriptSpec.generatePbxProj() - guard let nativeTarget = pbxProject.objects.nativeTargets.referenceValues + guard let nativeTarget = pbxProject.nativeTargets .first(where: { $0.buildPhases.count >= 3 }) else { throw failure("Target with build phases not found") } let buildPhases = nativeTarget.buildPhases - let scripts = pbxProject.objects.shellScriptBuildPhases.objectReferences - let script1 = scripts[0] - let script2 = scripts[1] - let script3 = scripts[2] + let scripts = pbxProject.shellScriptBuildPhases try expect(scripts.count) == 3 - try expect(buildPhases.contains(script1.reference)) == true - try expect(buildPhases.contains(script2.reference)) == true - try expect(buildPhases.contains(script3.reference)) == true - - let scriptTexts = Set(["script1", "script2", "script3"]) - try expect(scriptTexts.contains(script1.object.shellScript!)) == true - try expect(scriptTexts.contains(script2.object.shellScript!)) == true - try expect(scriptTexts.contains(script3.object.shellScript!)) == true + let script1 = scripts.first { $0.shellScript == "script1" }! + let script2 = scripts.first { $0.shellScript == "script2" }! + let script3 = scripts.first { $0.shellScript == "script3" }! + try expect(buildPhases.contains(script1)) == true + try expect(buildPhases.contains(script2)) == true + try expect(buildPhases.contains(script3)) == true } $0.it("generates targets with cylical dependencies") { @@ -788,7 +801,7 @@ class ProjectGeneratorTests: XCTestCase { ] let pbxProject = try scriptSpec.generatePbxProj() - let buildRules = pbxProject.objects.buildRules.referenceValues + let buildRules = pbxProject.buildRules try expect(buildRules.count) == 2 let first = buildRules.first { $0.name == "My Rule" }! let second = buildRules.first { $0.name != "My Rule" }! @@ -810,178 +823,64 @@ class ProjectGeneratorTests: XCTestCase { try expect(second.outputFiles) == [] try expect(second.outputFilesCompilerFlags) == [] } - } - } - func testSchemes() { - describe { - - let buildTarget = Scheme.BuildTarget(target: app.name) - $0.it("generates scheme") { - let preAction = Scheme.ExecutionAction(name: "Script", script: "echo Starting", settingsTarget: app.name) - let scheme = Scheme( - name: "MyScheme", - build: Scheme.Build(targets: [buildTarget], preActions: [preAction]) + $0.it("generates dependency build file settings") { + let app = Target( + name: "MyApp", + type: .application, + platform: .iOS, + dependencies: [ + Dependency(type: .target, reference: "MyFramework"), + Dependency(type: .target, reference: "MyOptionalFramework", weakLink: true), + ] ) - let project = Project( - basePath: "", - name: "test", - targets: [app, framework], - schemes: [scheme] - ) - let xcodeProject = try project.generateXcodeProject() - guard let target = xcodeProject.pbxproj.objects.nativeTargets.objectReferences - .first(where: { $0.object.name == app.name }) else { - throw failure("Target not found") - } - guard let xcscheme = xcodeProject.sharedData?.schemes.first else { - throw failure("Scheme not found") - } - try expect(scheme.name) == "MyScheme" - try expect(xcscheme.buildAction?.buildImplicitDependencies) == true - try expect(xcscheme.buildAction?.parallelizeBuild) == true - try expect(xcscheme.buildAction?.preActions.first?.title) == "Script" - try expect(xcscheme.buildAction?.preActions.first?.scriptText) == "echo Starting" - try expect(xcscheme.buildAction?.preActions.first?.environmentBuildable?.buildableName) == "MyApp.app" - try expect(xcscheme.buildAction?.preActions.first?.environmentBuildable?.blueprintName) == "MyApp" - guard let buildActionEntry = xcscheme.buildAction?.buildActionEntries.first else { - throw failure("Build Action entry not found") - } - try expect(buildActionEntry.buildFor) == BuildType.all - let buildableReferences: [XCScheme.BuildableReference] = [ - buildActionEntry.buildableReference, - xcscheme.launchAction?.buildableProductRunnable?.buildableReference, - xcscheme.profileAction?.buildableProductRunnable?.buildableReference, - xcscheme.testAction?.macroExpansion, - ].compactMap { $0 } + let project = Project(basePath: "", name: "test", targets: [app, framework, optionalFramework, uiTest]) + let pbxProject = try project.generatePbxProj() - for buildableReference in buildableReferences { - try expect(buildableReference.blueprintIdentifier) == target.reference - try expect(buildableReference.blueprintName) == target.object.name - try expect(buildableReference.buildableName) == "\(target.object.name).\(target.object.productType!.fileExtension!)" + guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == app.name }) else { + throw failure("PBXNativeTarget for \(app.name) not found") } + let frameworkPhases = nativeTarget.buildPhases.compactMap { $0 as? PBXFrameworksBuildPhase } - try expect(xcscheme.launchAction?.buildConfiguration) == "Debug" - try expect(xcscheme.testAction?.buildConfiguration) == "Debug" - try expect(xcscheme.profileAction?.buildConfiguration) == "Release" - try expect(xcscheme.analyzeAction?.buildConfiguration) == "Debug" - try expect(xcscheme.archiveAction?.buildConfiguration) == "Release" + let frameworkBuildFiles = frameworkPhases[0].files + let buildFileSettings = frameworkBuildFiles.map { $0.settings } + + try expect(frameworkBuildFiles.count) == 2 + try expect(buildFileSettings.compactMap({ $0 }).count) == 1 + try expect(buildFileSettings.compactMap({ $0?["ATTRIBUTES"] }).count) == 1 + try expect(buildFileSettings.compactMap({ $0?["ATTRIBUTES"] as? [String] }).first) == ["Weak"] } - $0.it("sets environment variables for a scheme") { - let runVariables: [XCScheme.EnvironmentVariable] = [ - XCScheme.EnvironmentVariable(variable: "RUN_ENV", value: "ENABLED", enabled: true), - XCScheme.EnvironmentVariable(variable: "OTHER_RUN_ENV", value: "DISABLED", enabled: false), - ] + $0.it("generates info.plist") { + let plist = Plist(path: "Info.plist", attributes: ["UISupportedInterfaceOrientations": ["UIInterfaceOrientationPortrait", "UIInterfaceOrientationLandscapeLeft"]]) + let tempPath = Path.temporary + "info" + let project = Project(basePath: tempPath, name: "", targets: [Target(name: "", type: .application, platform: .iOS, info: plist)]) + let pbxProject = try project.generatePbxProj() + let writer = FileWriter(project: project) + try writer.writePlists() - let scheme = Scheme( - name: "EnvironmentVariablesScheme", - build: Scheme.Build(targets: [buildTarget]), - run: Scheme.Run(config: "Debug", environmentVariables: runVariables), - test: Scheme.Test(config: "Debug"), - profile: Scheme.Profile(config: "Debug") - ) - let project = Project( - basePath: "", - name: "test", - targets: [app, framework], - schemes: [scheme] - ) - let xcodeProject = try project.generateXcodeProject() - - guard let xcscheme = xcodeProject.sharedData?.schemes.first else { - throw failure("Scheme not found") + guard let targetConfig = pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first else { + throw failure("Couldn't find Target config") } - try expect( - xcodeProject.pbxproj.objects.nativeTargets.objectReferences - .contains(where: { $0.object.name == app.name }) - ).beTrue() - try expect(xcscheme.launchAction?.environmentVariables) == runVariables - try expect(xcscheme.testAction?.environmentVariables).to.beNil() - try expect(xcscheme.profileAction?.environmentVariables).to.beNil() - } + try expect(targetConfig.buildSettings["INFOPLIST_FILE"] as? String) == plist.path - $0.it("generates target schemes from config variant") { - let configVariants = ["Test", "Production"] - var target = app - target.scheme = TargetScheme(configVariants: configVariants) - let configs: [Config] = [ - Config(name: "Test Debug", type: .debug), - Config(name: "Production Debug", type: .debug), - Config(name: "Test Release", type: .release), - Config(name: "Production Release", type: .release), - ] + let infoPlistFile = tempPath + plist.path + let data: Data = try infoPlistFile.read() + let infoPlist = try PropertyListSerialization.propertyList(from: data, options: [], format: nil) as! [String: Any] + var expectedInfoPlist: [String: Any] = [:] + expectedInfoPlist["CFBundleIdentifier"] = "$(PRODUCT_BUNDLE_IDENTIFIER)" + expectedInfoPlist["CFBundleInfoDictionaryVersion"] = "6.0" + expectedInfoPlist["CFBundleExecutable"] = "$(EXECUTABLE_NAME)" + expectedInfoPlist["CFBundleName"] = "$(PRODUCT_NAME)" + expectedInfoPlist["CFBundleDevelopmentRegion"] = "$(DEVELOPMENT_LANGUAGE)" + expectedInfoPlist["CFBundleShortVersionString"] = "1.0" + expectedInfoPlist["CFBundleVersion"] = "1" + expectedInfoPlist["CFBundlePackageType"] = "APPL" + expectedInfoPlist["UISupportedInterfaceOrientations"] = ["UIInterfaceOrientationPortrait", "UIInterfaceOrientationLandscapeLeft"] - let project = Project(basePath: "", name: "test", configs: configs, targets: [target, framework]) - let xcodeProject = try project.generateXcodeProject() - - try expect(xcodeProject.sharedData?.schemes.count) == 2 - - guard let nativeTarget = xcodeProject.pbxproj.objects.nativeTargets.objectReferences - .first(where: { $0.object.name == app.name }) else { - throw failure("Target not found") - } - guard let xcscheme = xcodeProject.sharedData?.schemes - .first(where: { $0.name == "\(target.name) Test" }) else { - throw failure("Scheme not found") - } - guard let buildActionEntry = xcscheme.buildAction?.buildActionEntries.first else { - throw failure("Build Action entry not found") - } - try expect(buildActionEntry.buildableReference.blueprintIdentifier) == nativeTarget.reference - - try expect(xcscheme.launchAction?.buildConfiguration) == "Test Debug" - try expect(xcscheme.testAction?.buildConfiguration) == "Test Debug" - try expect(xcscheme.profileAction?.buildConfiguration) == "Test Release" - try expect(xcscheme.analyzeAction?.buildConfiguration) == "Test Debug" - try expect(xcscheme.archiveAction?.buildConfiguration) == "Test Release" - } - - $0.it("generates environment variables for target schemes") { - let variables: [XCScheme.EnvironmentVariable] = [XCScheme.EnvironmentVariable(variable: "env", value: "var", enabled: false)] - var target = app - target.scheme = TargetScheme(environmentVariables: variables) - - let project = Project(basePath: "", name: "test", targets: [target, framework]) - let xcodeProject = try project.generateXcodeProject() - - try expect(xcodeProject.sharedData?.schemes.count) == 1 - - guard let xcscheme = xcodeProject.sharedData?.schemes.first else { - throw failure("Scheme not found") - } - - try expect(xcscheme.launchAction?.environmentVariables) == variables - try expect(xcscheme.testAction?.environmentVariables) == variables - try expect(xcscheme.profileAction?.environmentVariables) == variables - } - - $0.it("generates pre and post actions for target schemes") { - var target = app - target.scheme = TargetScheme( - preActions: [.init(name: "Run", script: "do")], - postActions: [.init(name: "Run2", script: "post", settingsTarget: "MyApp")] - ) - - let project = Project(basePath: "", name: "test", targets: [target, framework]) - let xcodeProject = try project.generateXcodeProject() - - try expect(xcodeProject.sharedData?.schemes.count) == 1 - - guard let xcscheme = xcodeProject.sharedData?.schemes.first else { - throw failure("Scheme not found") - } - - try expect(xcscheme.launchAction?.preActions.count) == 1 - try expect(xcscheme.launchAction?.preActions.first?.title) == "Run" - try expect(xcscheme.launchAction?.preActions.first?.scriptText) == "do" - - try expect(xcscheme.testAction?.postActions.count) == 1 - try expect(xcscheme.testAction?.postActions.first?.title) == "Run2" - try expect(xcscheme.testAction?.postActions.first?.scriptText) == "post" - try expect(xcscheme.testAction?.postActions.first?.environmentBuildable?.blueprintName) == "MyApp" + try expect(NSDictionary(dictionary: expectedInfoPlist).isEqual(to: infoPlist)).beTrue() } } } diff --git a/Tests/XcodeGenKitTests/ProjectSpecTests.swift b/Tests/XcodeGenKitTests/ProjectSpecTests.swift index 26887288..74e14896 100644 --- a/Tests/XcodeGenKitTests/ProjectSpecTests.swift +++ b/Tests/XcodeGenKitTests/ProjectSpecTests.swift @@ -2,7 +2,7 @@ import PathKit import ProjectSpec import Spectre import XcodeGenKit -import xcproj +import xcodeproj import XCTest class ProjectSpecTests: XCTestCase { @@ -176,6 +176,20 @@ class ProjectSpecTests: XCTestCase { try expectValidationError(project, .invalidTargetSchemeConfigVariant(target: "target1", configVariant: "invalidVariant", configType: .debug)) } + $0.it("fails with invalid sdk dependency") { + var project = baseProject + project.targets = [ + Target( + name: "target1", + type: .application, + platform: .iOS, + dependencies: [Dependency(type: .sdk, reference: "invalidDependency")] + ), + ] + + try expectValidationError(project, .invalidSDKDependency(target: "target1", dependency: "invalidDependency")) + } + $0.it("fails with invalid scheme") { var project = baseProject project.schemes = [Scheme( @@ -207,6 +221,14 @@ class ProjectSpecTests: XCTestCase { try expectValidationError(project, .missingDefaultConfig(configName: "foo")) } + $0.it("validates config settings format") { + var project = baseProject + project.configs = Config.defaultConfigs + project.settings.buildSettings = ["Debug": ["SETTING": "VALUE"], "Release": ["SETTING": "VALUE"]] + + try expectValidationError(project, .invalidPerConfigSettings) + } + $0.it("allows custom scheme for aggregated target") { var project = baseProject let buildScript = BuildScript(script: .path(#file), name: "buildScript1") diff --git a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift new file mode 100644 index 00000000..b617a5e0 --- /dev/null +++ b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift @@ -0,0 +1,206 @@ +import PathKit +import ProjectSpec +import Spectre +import XcodeGenKit +import xcodeproj +import XCTest +import Yams + +fileprivate let app = Target( + name: "MyApp", + type: .application, + platform: .iOS, + dependencies: [Dependency(type: .target, reference: "MyFramework")] +) + +fileprivate let framework = Target( + name: "MyFramework", + type: .framework, + platform: .iOS +) + +fileprivate let optionalFramework = Target( + name: "MyOptionalFramework", + type: .framework, + platform: .iOS +) + +fileprivate let uiTest = Target( + name: "MyAppUITests", + type: .uiTestBundle, + platform: .iOS, + dependencies: [Dependency(type: .target, reference: "MyApp")] +) + +class SchemeGeneratorTests: XCTestCase { + + func testSchemes() { + describe { + + let buildTarget = Scheme.BuildTarget(target: app.name) + $0.it("generates scheme") { + let preAction = Scheme.ExecutionAction(name: "Script", script: "echo Starting", settingsTarget: app.name) + let scheme = Scheme( + name: "MyScheme", + build: Scheme.Build(targets: [buildTarget], preActions: [preAction]) + ) + let project = Project( + basePath: "", + name: "test", + targets: [app, framework], + schemes: [scheme] + ) + let xcodeProject = try project.generateXcodeProject() + guard let target = xcodeProject.pbxproj.nativeTargets + .first(where: { $0.name == app.name }) else { + throw failure("Target not found") + } + guard let xcscheme = xcodeProject.sharedData?.schemes.first else { + throw failure("Scheme not found") + } + try expect(scheme.name) == "MyScheme" + try expect(xcscheme.buildAction?.buildImplicitDependencies) == true + try expect(xcscheme.buildAction?.parallelizeBuild) == true + try expect(xcscheme.buildAction?.preActions.first?.title) == "Script" + try expect(xcscheme.buildAction?.preActions.first?.scriptText) == "echo Starting" + try expect(xcscheme.buildAction?.preActions.first?.environmentBuildable?.buildableName) == "MyApp.app" + try expect(xcscheme.buildAction?.preActions.first?.environmentBuildable?.blueprintName) == "MyApp" + guard let buildActionEntry = xcscheme.buildAction?.buildActionEntries.first else { + throw failure("Build Action entry not found") + } + try expect(buildActionEntry.buildFor) == BuildType.all + + let buildableReferences: [XCScheme.BuildableReference] = [ + buildActionEntry.buildableReference, + xcscheme.launchAction?.buildableProductRunnable?.buildableReference, + xcscheme.profileAction?.buildableProductRunnable?.buildableReference, + xcscheme.testAction?.macroExpansion, + ].compactMap { $0 } + + for buildableReference in buildableReferences { + // FIXME: try expect(buildableReference.blueprintIdentifier) == target.reference + try expect(buildableReference.blueprintName) == target.name + try expect(buildableReference.buildableName) == "\(target.name).\(target.productType!.fileExtension!)" + } + + try expect(xcscheme.launchAction?.buildConfiguration) == "Debug" + try expect(xcscheme.testAction?.buildConfiguration) == "Debug" + try expect(xcscheme.profileAction?.buildConfiguration) == "Release" + try expect(xcscheme.analyzeAction?.buildConfiguration) == "Debug" + try expect(xcscheme.archiveAction?.buildConfiguration) == "Release" + } + + $0.it("sets environment variables for a scheme") { + let runVariables: [XCScheme.EnvironmentVariable] = [ + XCScheme.EnvironmentVariable(variable: "RUN_ENV", value: "ENABLED", enabled: true), + XCScheme.EnvironmentVariable(variable: "OTHER_RUN_ENV", value: "DISABLED", enabled: false), + ] + + let scheme = Scheme( + name: "EnvironmentVariablesScheme", + build: Scheme.Build(targets: [buildTarget]), + run: Scheme.Run(config: "Debug", environmentVariables: runVariables), + test: Scheme.Test(config: "Debug"), + profile: Scheme.Profile(config: "Debug") + ) + let project = Project( + basePath: "", + name: "test", + targets: [app, framework], + schemes: [scheme] + ) + let xcodeProject = try project.generateXcodeProject() + + guard let xcscheme = xcodeProject.sharedData?.schemes.first else { + throw failure("Scheme not found") + } + + try expect( + xcodeProject.pbxproj.nativeTargets + .contains(where: { $0.name == app.name }) + ).beTrue() + try expect(xcscheme.launchAction?.environmentVariables) == runVariables + try expect(xcscheme.testAction?.environmentVariables).to.beNil() + try expect(xcscheme.profileAction?.environmentVariables).to.beNil() + } + + $0.it("generates target schemes from config variant") { + let configVariants = ["Test", "Production"] + var target = app + target.scheme = TargetScheme(configVariants: configVariants) + let configs: [Config] = [ + Config(name: "Test Debug", type: .debug), + Config(name: "Production Debug", type: .debug), + Config(name: "Test Release", type: .release), + Config(name: "Production Release", type: .release), + ] + + let project = Project(basePath: "", name: "test", configs: configs, targets: [target, framework]) + let xcodeProject = try project.generateXcodeProject() + + try expect(xcodeProject.sharedData?.schemes.count) == 2 + + guard let xcscheme = xcodeProject.sharedData?.schemes + .first(where: { $0.name == "\(target.name) Test" }) else { + throw failure("Scheme not found") + } + guard let buildActionEntry = xcscheme.buildAction?.buildActionEntries.first else { + throw failure("Build Action entry not found") + } + + try expect(buildActionEntry.buildableReference.blueprintIdentifier.count > 0) == true + + try expect(xcscheme.launchAction?.buildConfiguration) == "Test Debug" + try expect(xcscheme.testAction?.buildConfiguration) == "Test Debug" + try expect(xcscheme.profileAction?.buildConfiguration) == "Test Release" + try expect(xcscheme.analyzeAction?.buildConfiguration) == "Test Debug" + try expect(xcscheme.archiveAction?.buildConfiguration) == "Test Release" + } + + $0.it("generates environment variables for target schemes") { + let variables: [XCScheme.EnvironmentVariable] = [XCScheme.EnvironmentVariable(variable: "env", value: "var", enabled: false)] + var target = app + target.scheme = TargetScheme(environmentVariables: variables) + + let project = Project(basePath: "", name: "test", targets: [target, framework]) + let xcodeProject = try project.generateXcodeProject() + + try expect(xcodeProject.sharedData?.schemes.count) == 1 + + guard let xcscheme = xcodeProject.sharedData?.schemes.first else { + throw failure("Scheme not found") + } + + try expect(xcscheme.launchAction?.environmentVariables) == variables + try expect(xcscheme.testAction?.environmentVariables) == variables + try expect(xcscheme.profileAction?.environmentVariables) == variables + } + + $0.it("generates pre and post actions for target schemes") { + var target = app + target.scheme = TargetScheme( + preActions: [.init(name: "Run", script: "do")], + postActions: [.init(name: "Run2", script: "post", settingsTarget: "MyApp")] + ) + + let project = Project(basePath: "", name: "test", targets: [target, framework]) + let xcodeProject = try project.generateXcodeProject() + + try expect(xcodeProject.sharedData?.schemes.count) == 1 + + guard let xcscheme = xcodeProject.sharedData?.schemes.first else { + throw failure("Scheme not found") + } + + try expect(xcscheme.launchAction?.preActions.count) == 1 + try expect(xcscheme.launchAction?.preActions.first?.title) == "Run" + try expect(xcscheme.launchAction?.preActions.first?.scriptText) == "do" + + try expect(xcscheme.testAction?.postActions.count) == 1 + try expect(xcscheme.testAction?.postActions.first?.title) == "Run2" + try expect(xcscheme.testAction?.postActions.first?.scriptText) == "post" + try expect(xcscheme.testAction?.postActions.first?.environmentBuildable?.blueprintName) == "MyApp" + } + } + } +} diff --git a/Tests/XcodeGenKitTests/SourceGeneratorTests.swift b/Tests/XcodeGenKitTests/SourceGeneratorTests.swift index b382ab9c..69c152cc 100644 --- a/Tests/XcodeGenKitTests/SourceGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SourceGeneratorTests.swift @@ -2,7 +2,7 @@ import PathKit import ProjectSpec import Spectre import XcodeGenKit -import xcproj +import xcodeproj import XCTest import Yams @@ -85,14 +85,16 @@ class SourceGeneratorTests: XCTestCase { let project = Project(basePath: directoryPath, name: "Test", targets: [target]) let pbxProj = try project.generatePbxProj() try pbxProj.expectFile(paths: ["Sources", "Bar.swift"], buildPhase: .sources) - let buildPhase = pbxProj.objects.copyFilesBuildPhases.referenceValues.first + let buildPhase = pbxProj.copyFilesBuildPhases.first try expect(buildPhase?.dstSubfolderSpec) == .frameworks let fileReference = pbxProj.getFileReference( paths: ["Sources", "Foo.framework"], names: ["Sources", "Foo.framework"] - )?.reference ?? "" - let buildFile = pbxProj.objects.buildFiles.objectReferences - .first(where: { $0.object.fileRef == fileReference })?.reference ?? "" + ) + guard let buildFile = pbxProj.buildFiles + .first(where: { $0.file == fileReference }) else { + throw failure("Cant find build file") + } try expect(buildPhase?.files.count) == 1 try expect(buildPhase?.files.contains(buildFile)) == true } @@ -112,16 +114,58 @@ class SourceGeneratorTests: XCTestCase { let project = Project(basePath: directoryPath, name: "Test", targets: [target]) let pbxProj = try project.generatePbxProj() - guard let fileReference = pbxProj.objects.fileReferences.first(where: { $0.value.nameOrPath == "model2.xcdatamodel" }) else { + guard let fileReference = pbxProj.fileReferences.first(where: { $0.nameOrPath == "model2.xcdatamodel" }) else { throw failure("Couldn't find model file reference") } - guard let versionGroup = pbxProj.objects.versionGroups.values.first else { + guard let versionGroup = pbxProj.versionGroups.first else { throw failure("Couldn't find version group") } - try expect(versionGroup.currentVersion) == fileReference.key + try expect(versionGroup.currentVersion) == fileReference try expect(versionGroup.children.count) == 3 try expect(versionGroup.path) == "model.xcdatamodeld" - try expect(fileReference.value.path) == "model2.xcdatamodel" + try expect(fileReference.path) == "model2.xcdatamodel" + } + + $0.it("generates variant groups") { + let directories = """ + Sources: + Base.lproj: + - LocalizedStoryboard.storyboard + en.lproj: + - LocalizedStoryboard.strings + """ + try createDirectories(directories) + + let target = Target(name: "Test", type: .application, platform: .iOS, sources: ["Sources"]) + let project = Project(basePath: directoryPath, name: "Test", targets: [target]) + + let pbxProj = try project.generatePbxProj() + + func getFileReferences(_ path: String) -> [PBXFileReference] { + return pbxProj.fileReferences.filter { $0.path == path } + } + + func getVariableGroups(_ name: String?) -> [PBXVariantGroup] { + return pbxProj.variantGroups.filter { $0.name == name } + } + + let resourceName = "LocalizedStoryboard.storyboard" + let baseResource = "Base.lproj/LocalizedStoryboard.storyboard" + let localizedResource = "en.lproj/LocalizedStoryboard.strings" + + guard let variableGroup = getVariableGroups(resourceName).first else { throw failure("Couldn't find the variable group") } + + do { + let refs = getFileReferences(baseResource) + try expect(refs.count) == 1 + try expect(variableGroup.children.filter { $0 == refs.first }.count) == 1 + } + + do { + let refs = getFileReferences(localizedResource) + try expect(refs.count) == 1 + try expect(variableGroup.children.filter { $0 == refs.first }.count) == 1 + } } $0.it("handles duplicate names") { @@ -458,9 +502,7 @@ class SourceGeneratorTests: XCTestCase { let pbxProj = try project.generatePbxProj() try pbxProj.expectFile(paths: ["Sources/A", "a.swift"], names: ["A", "a.swift"], buildPhase: .sources) - let sourcesBuildPhase = pbxProj.objects.buildPhases - .first(where: { $0.1.buildPhase == BuildPhase.sources })! - .value + let sourcesBuildPhase = pbxProj.buildPhases.first(where: { $0.buildPhase == BuildPhase.sources })! try expect(sourcesBuildPhase.files.count) == 1 } @@ -480,7 +522,7 @@ class SourceGeneratorTests: XCTestCase { let project = Project(basePath: directoryPath, name: "Test", targets: [target]) let pbxProj = try project.generatePbxProj() - let groups = try pbxProj.getMainGroup().children.compactMap { pbxProj.objects.getFileElement(reference: $0)?.nameOrPath } + let groups = try pbxProj.getMainGroup().children.map { $0.nameOrPath } try expect(groups) == ["A", "P", "S", "Frameworks", "Products"] } @@ -503,8 +545,9 @@ class SourceGeneratorTests: XCTestCase { let project = Project(basePath: directoryPath, name: "Test", targets: [target]) let pbxProj = try project.generatePbxProj() - let group = pbxProj.objects.group(named: "Sources", inGroup: try pbxProj.getMainGroup())!.object - let names = group.children.compactMap { pbxProj.objects.getFileElement(reference: $0)?.nameOrPath } + let mainGroup = try pbxProj.getMainGroup() + let group = mainGroup.children.compactMap { $0 as? PBXGroup }.first { $0.nameOrPath == "Sources" }! + let names = group.children.compactMap { $0.nameOrPath } try expect(names) == [ "1file.a", "10file.a", @@ -532,10 +575,10 @@ extension PBXProj { } if let buildPhase = buildPhase { - let buildFile = objects.buildFiles.objectReferences - .first(where: { $0.object.fileRef == fileReference.reference }) + let buildFile = buildFiles + .first(where: { $0.file === fileReference }) let actualBuildPhase = buildFile - .flatMap { buildFile in objects.buildPhases.referenceValues.first { $0.files.contains(buildFile.reference) } }?.buildPhase + .flatMap { buildFile in buildPhases.first { $0.files.contains(buildFile) } }?.buildPhase var error: String? if let buildPhase = buildPhase.buildPhase { @@ -563,24 +606,20 @@ extension PBXProj { } } - func getFileReference(paths: [String], names: [String], file: String = #file, line: Int = #line) -> ObjectReference? { - guard let project = objects.projects.first?.value else { return nil } - guard let mainGroup = objects.groups.getReference(project.mainGroup) else { return nil } + func getFileReference(paths: [String], names: [String], file: String = #file, line: Int = #line) -> PBXFileReference? { + guard let mainGroup = projects.first?.mainGroup else { return nil } return getFileReference(group: mainGroup, paths: paths, names: names) } func getMainGroup(function: String = #function, file: String = #file, line: Int = #line) throws -> PBXGroup { - guard let project = objects.projects.first?.value else { - throw failure("Couldn't find project", file: file, line: line) - } - guard let mainGroup = objects.groups.getReference(project.mainGroup) else { + guard let mainGroup = projects.first?.mainGroup else { throw failure("Couldn't find main group", file: file, line: line) } return mainGroup } - private func getFileReference(group: PBXGroup, paths: [String], names: [String]) -> ObjectReference? { + private func getFileReference(group: PBXGroup, paths: [String], names: [String]) -> PBXFileReference? { guard !paths.isEmpty else { return nil } let path = paths.first! @@ -588,16 +627,10 @@ extension PBXProj { let restOfPath = Array(paths.dropFirst()) let restOfName = Array(names.dropFirst()) if restOfPath.isEmpty { - let fileReferences: [ObjectReference] = group.children.compactMap { reference in - if let fileReference = self.objects.fileReferences.getReference(reference) { - return ObjectReference(reference: reference, object: fileReference) - } else { - return nil - } - } - return fileReferences.first { $0.object.path == path && $0.object.nameOrPath == name } + let fileReferences: [PBXFileReference] = group.children.compactMap { $0 as? PBXFileReference } + return fileReferences.first { $0.path == path && $0.nameOrPath == name } } else { - let groups = group.children.compactMap { self.objects.groups.getReference($0) } + let groups = group.children.compactMap { $0 as? PBXGroup } guard let group = groups.first(where: { $0.path == path && $0.nameOrPath == name }) else { return nil } return getFileReference(group: group, paths: restOfPath, names: restOfName) } diff --git a/Tests/XcodeGenKitTests/SpecLoadingTests.swift b/Tests/XcodeGenKitTests/SpecLoadingTests.swift index 9f5a414b..565599e7 100644 --- a/Tests/XcodeGenKitTests/SpecLoadingTests.swift +++ b/Tests/XcodeGenKitTests/SpecLoadingTests.swift @@ -3,7 +3,7 @@ import PathKit import ProjectSpec import Spectre import XcodeGenKit -import xcproj +import xcodeproj import XCTest class SpecLoadingTests: XCTestCase { @@ -146,13 +146,47 @@ class SpecLoadingTests: XCTestCase { targetDictionary["dependencies"] = [ ["target": "name", "embed": false], ["carthage": "name"], - ["framework": "path"], + ["framework": "path", "weak": true], + ["sdk": "Contacts.framework"], ] let target = try Target(name: "test", jsonDictionary: targetDictionary) - try expect(target.dependencies.count) == 3 + try expect(target.dependencies.count) == 4 try expect(target.dependencies[0]) == Dependency(type: .target, reference: "name", embed: false) try expect(target.dependencies[1]) == Dependency(type: .carthage, reference: "name") - try expect(target.dependencies[2]) == Dependency(type: .framework, reference: "path") + try expect(target.dependencies[2]) == Dependency(type: .framework, reference: "path", weakLink: true) + try expect(target.dependencies[3]) == Dependency(type: .sdk, reference: "Contacts.framework") + } + + $0.it("parses info plist") { + var targetDictionary = validTarget + targetDictionary["info"] = [ + "path": "Info.plist", + "properties": [ + "CFBundleName": "MyAppName", + "UIBackgroundModes": ["fetch"], + ], + ] + + let target = try Target(name: "", jsonDictionary: targetDictionary) + try expect(target.info) == Plist(path: "Info.plist", attributes: [ + "CFBundleName": "MyAppName", + "UIBackgroundModes": ["fetch"], + ]) + } + + $0.it("parses entitlement plist") { + var targetDictionary = validTarget + targetDictionary["entitlements"] = [ + "path": "app.entitlements", + "properties": [ + "com.apple.security.application-groups": "com.group", + ], + ] + + let target = try Target(name: "", jsonDictionary: targetDictionary) + try expect(target.entitlements) == Plist(path: "app.entitlements", attributes: [ + "com.apple.security.application-groups": "com.group", + ]) } $0.it("parses cross platform targets") { @@ -221,7 +255,7 @@ class SpecLoadingTests: XCTestCase { $0.it("parses target schemes") { var targetDictionary = validTarget targetDictionary["scheme"] = [ - "testTargets": ["t1", "t2"], + "testTargets": ["t1", ["name": "t2"]], "configVariants": ["dev", "app-store"], "commandLineArguments": [ "ENV1": true, @@ -280,6 +314,18 @@ class SpecLoadingTests: XCTestCase { ], ], ], + "test": [ + "config": "debug", + "targets": [ + "Target1", + [ + "name": "Target2", + "parallelizable": true, + "randomExecutionOrder": true, + ], + ], + "gatherCoverageData": true, + ], ] let scheme = try Scheme(name: "Scheme", jsonDictionary: schemeDictionary) let expectedTargets: [Scheme.BuildTarget] = [ @@ -298,6 +344,20 @@ class SpecLoadingTests: XCTestCase { try expect(scheme.build.parallelizeBuild) == false try expect(scheme.build.buildImplicitDependencies) == false + + let expectedTest = Scheme.Test( + config: "debug", + gatherCoverageData: true, + targets: [ + "Target1", + Scheme.Test.TestTarget( + name: "Target2", + randomExecutionOrder: true, + parallelizable: true + ), + ] + ) + try expect(scheme.test) == expectedTest } $0.it("parses schemes variables") { diff --git a/Tests/XcodeGenKitTests/TestHelpers.swift b/Tests/XcodeGenKitTests/TestHelpers.swift index 49b07818..54a7b700 100644 --- a/Tests/XcodeGenKitTests/TestHelpers.swift +++ b/Tests/XcodeGenKitTests/TestHelpers.swift @@ -2,7 +2,7 @@ import Foundation import PathKit import ProjectSpec import Spectre -import xcproj +import xcodeproj import XCTest let fixturePath = Path(#file).parent().parent() + "Fixtures" diff --git a/build-fixtures.sh b/build-fixtures.sh new file mode 100755 index 00000000..f5ca8ebe --- /dev/null +++ b/build-fixtures.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e + +cd Tests/Fixtures/TestProject +./build.sh diff --git a/diff-fixtures.sh b/diff-fixtures.sh new file mode 100755 index 00000000..183a9bdd --- /dev/null +++ b/diff-fixtures.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +if [[ `git status --porcelain Tests/Fixtures/TestProject` ]]; then + echo "" + echo "⚠️ Generated TestProject has changed." + echo "⚠️ If this is a valid change please run the tests and commit the updated TestProject." + echo "" + git --no-pager diff --color=always Tests/Fixtures/TestProject + exit 1 +else + echo "✅ Generated TestProject has not changed." +fi