├── .gitignore ├── Images └── XcodeUsage.png ├── MainFramework ├── Info.plist ├── MainA.h ├── MainA.m ├── MainB.h ├── MainB.m ├── MainC.h ├── MainC.m ├── MainD.h ├── MainD.m ├── MainE.h ├── MainE.m ├── MainF.h ├── MainF.m ├── MainFramework.h ├── MainG.h └── MainG.m ├── README.md ├── SubFrameworks.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── chris.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── SubFrameworks ├── Info.plist ├── SubA.h ├── SubA.m ├── SubB.h ├── SubB.m ├── SubC.h ├── SubC.m └── SubFrameworks.h └── checkRebuilds.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /testDerivedData 2 | /build 3 | -------------------------------------------------------------------------------- /Images/XcodeUsage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liscio/SubFrameworks/2e9f8aec5a27ab160fd4b9ecb890dfd557447ff2/Images/XcodeUsage.png -------------------------------------------------------------------------------- /MainFramework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2019 Christopher Liscio. All rights reserved. 23 | 24 | 25 | -------------------------------------------------------------------------------- /MainFramework/MainA.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainA.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainA : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainA.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainA.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainA.h" 10 | 11 | @implementation MainA 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MainFramework/MainB.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainB.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainB : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainB.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainB.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainB.h" 10 | 11 | @implementation MainB 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MainFramework/MainC.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainC.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainC : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainC.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainC.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainC.h" 10 | 11 | @implementation MainC 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MainFramework/MainD.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainD.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainD : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainD.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainD.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainD.h" 10 | 11 | @implementation MainD 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MainFramework/MainE.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainE.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainE : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainE.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainE.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainE.h" 10 | 11 | @implementation MainE 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MainFramework/MainF.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainF.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainF : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainF.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainF.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainF.h" 10 | 11 | @implementation MainF 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MainFramework/MainFramework.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainFramework.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for MainFramework. 12 | FOUNDATION_EXPORT double MainFrameworkVersionNumber; 13 | 14 | //! Project version string for MainFramework. 15 | FOUNDATION_EXPORT const unsigned char MainFrameworkVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /MainFramework/MainG.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainG.h 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MainG : NSObject 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainFramework/MainG.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainG.m 3 | // MainFramework 4 | // 5 | // Created by Christopher Liscio on 2019-11-16. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "MainG.h" 10 | 11 | @implementation MainG 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A Really Dumb Xcode 11 Build Issue 2 | 3 | > Stick with Objective-C, and you'll get the fastest builds, EVER! 4 | 5 | Yeah, maybe not. 6 | 7 | When I build my app, Xcode 11 appears to stall out completely (dropping from full core usage down to 10-20% CPU) during the Objective-C build phases. 8 | 9 | In contrast, my *massive* Swift targets will happily peg my machine with *all* the cores/threads getting utilized. Swift doesn't get tripped up by this bug at all. 10 | 11 | Xcode CPU Usage 12 | 13 | ## Background 14 | 15 | This project demonstrates a horrible bug in the Xcode 11 build system (which may be happening somewhere as deep as LLVM/clang). 16 | 17 | The bug manifested for me like this: 18 | 19 | 1. Starting with a clean `DerivedData` folder, I can build my app, [Capo](https://supermegaultragroovy.com/products/capo) in about 60 seconds, flat. 20 | 2. Once I clean the build folder using command-shift-K, *all subsequent builds* will take anywhere from *180s* to *500s* (in the very worst case, which I've not seen for a while now.) 21 | 22 | After some back & forth with Apple's engineers, I learned to turn on `clang`'s `-Rmodule-build` flag to see what's going on behind the scenes. It turns out that—for every Objective-C file that is built—framework modules are being re-built unnecessarily. 23 | 24 | ## Instructions 25 | 26 | First, clone this repository: 27 | 28 | ``` 29 | git clone https://github.com/liscio/SubFrameworks 30 | ``` 31 | 32 | ### Command-Line Version (Preferred/Faster) 33 | 34 | Run the included `checkRebuilds.sh` script at the command-line. 35 | 36 | You will see pre-filtered output like this: 37 | 38 | ``` 39 | %%% Building Using Clean DerivedData %%% 40 | 41 | SubFrameworks/SubFrameworks/SubB.h:9:9: remark: building module 'Foundation' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/Foundation-2PSPYZLNW14KI.pcm' [-Rmodule-build] 42 | SubFrameworks/SubFrameworks/SubB.h:9:9: remark: finished building module 'Foundation' [-Rmodule-build] 43 | SubFrameworks/MainFramework/MainE.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 44 | SubFrameworks/MainFramework/MainE.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 45 | 46 | %%% Clean re-build %%% 47 | 48 | SubFrameworks/MainFramework/MainF.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 49 | SubFrameworks/MainFramework/MainF.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 50 | SubFrameworks/MainFramework/MainG.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 51 | SubFrameworks/MainFramework/MainG.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 52 | SubFrameworks/MainFramework/MainC.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 53 | SubFrameworks/MainFramework/MainC.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 54 | SubFrameworks/MainFramework/MainD.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 55 | SubFrameworks/MainFramework/MainD.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 56 | SubFrameworks/MainFramework/MainE.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 57 | SubFrameworks/MainFramework/MainE.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 58 | SubFrameworks/MainFramework/MainA.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 59 | SubFrameworks/MainFramework/MainA.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 60 | SubFrameworks/MainFramework/MainB.h:10:9: remark: building module 'SubFrameworks' as 'SubFrameworks/testDerivedData/ModuleCache.noindex/33MFFE8RLECJA/SubFrameworks-3U5BOV1R8307A.pcm' [-Rmodule-build] 61 | SubFrameworks/MainFramework/MainB.h:10:9: remark: finished building module 'SubFrameworks' [-Rmodule-build] 62 | ``` 63 | 64 | #### What am I looking at here? 65 | 66 | The script starts off by building the `MainFramework` target with a fresh, local `testDerivedData` folder. 67 | 68 | The first block of output demonstrates that Xcode correctly builds modules for `Foundation`, and `SubFrameworks` only once. That is what the output should _always_ look like. 69 | 70 | The second block of output is the result of asking `xcodebuild` to perform a `clean build` action. You'll notice that `Foundation` is not re-built, however `SubFrameworks` is built *for every single `.m` file in the `MainFramework` target. I would have expected to see it _only once_ since we are explicitly triggering its re-build. 71 | 72 | Imagine that `SubFramework` contains your application's (extensive) core logic, and hundreds of source files. Now imagine that a good number of the source files in your main application `#import `. For each of those source files, the `SubFramework` module is *re-compiled* again and again. 73 | 74 | Crazy, right?! 75 | 76 | ### Using Xcode 77 | 78 | You can also reproduce the same result in Xcode 11.x, which is where I spend most of my time working. 79 | 80 | Open the Xcode project, and do the following: 81 | 82 | 1. Choose the MainFramework target 83 | 2. Build the product. You'll see warnings in the output that show which modules are being built. 84 | 3. Press Command-Shift-K to clear the build folder 85 | 4. Build the product again. You'll now see warnings indicating that the SubFramework module is re-built for each source file. 86 | 87 | ## Does the Xcode Version Matter? 88 | 89 | Yes. This bug does not appear to affect Xcode 10.x. All of my installed Xcode 11.x releases (11.0 - 11.3 beta) are affected. 90 | 91 | ## Hey, Apple Folks! 92 | 93 | For anybody that cares to look further into this, this specific issue is tracked by FB7046188. 94 | 95 | What's especially frustrating is that I've been experiencing _terrible build performance_ since April 2018. See also FB5715747, and FB5642600. 96 | 97 | ## Affected Systems 98 | 99 | I have only been able to test this on my iMac Pro, and a 2016 MacBook Pro. Both machines have experienced this bug on Mojave _and_ Catalina. 100 | 101 | -------------------------------------------------------------------------------- /SubFrameworks.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 83060EEB23807D7000FDF0AD /* MainD.h in Headers */ = {isa = PBXBuildFile; fileRef = 83060EE923807D7000FDF0AD /* MainD.h */; }; 11 | 83060EEC23807D7000FDF0AD /* MainD.m in Sources */ = {isa = PBXBuildFile; fileRef = 83060EEA23807D7000FDF0AD /* MainD.m */; }; 12 | 83060EEF23807D7A00FDF0AD /* MainE.h in Headers */ = {isa = PBXBuildFile; fileRef = 83060EED23807D7A00FDF0AD /* MainE.h */; }; 13 | 83060EF023807D7A00FDF0AD /* MainE.m in Sources */ = {isa = PBXBuildFile; fileRef = 83060EEE23807D7A00FDF0AD /* MainE.m */; }; 14 | 83060EF323807D8500FDF0AD /* MainF.h in Headers */ = {isa = PBXBuildFile; fileRef = 83060EF123807D8500FDF0AD /* MainF.h */; }; 15 | 83060EF423807D8500FDF0AD /* MainF.m in Sources */ = {isa = PBXBuildFile; fileRef = 83060EF223807D8500FDF0AD /* MainF.m */; }; 16 | 83060EF723807D8E00FDF0AD /* MainG.h in Headers */ = {isa = PBXBuildFile; fileRef = 83060EF523807D8E00FDF0AD /* MainG.h */; }; 17 | 83060EF823807D8E00FDF0AD /* MainG.m in Sources */ = {isa = PBXBuildFile; fileRef = 83060EF623807D8E00FDF0AD /* MainG.m */; }; 18 | 832EA10F237F5C1600FA1A45 /* SubFrameworks.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA10D237F5C1600FA1A45 /* SubFrameworks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | 832EA117237F5C4500FA1A45 /* SubA.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA115237F5C4500FA1A45 /* SubA.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | 832EA118237F5C4500FA1A45 /* SubA.m in Sources */ = {isa = PBXBuildFile; fileRef = 832EA116237F5C4500FA1A45 /* SubA.m */; }; 21 | 832EA11B237F5C5200FA1A45 /* SubB.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA119237F5C5200FA1A45 /* SubB.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | 832EA11C237F5C5200FA1A45 /* SubB.m in Sources */ = {isa = PBXBuildFile; fileRef = 832EA11A237F5C5200FA1A45 /* SubB.m */; }; 23 | 832EA11F237F5C5E00FA1A45 /* SubC.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA11D237F5C5E00FA1A45 /* SubC.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24 | 832EA120237F5C5E00FA1A45 /* SubC.m in Sources */ = {isa = PBXBuildFile; fileRef = 832EA11E237F5C5E00FA1A45 /* SubC.m */; }; 25 | 832EA12A237F5CA600FA1A45 /* MainFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA128237F5CA600FA1A45 /* MainFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26 | 832EA130237F5CB500FA1A45 /* MainA.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA12E237F5CB500FA1A45 /* MainA.h */; }; 27 | 832EA131237F5CB500FA1A45 /* MainA.m in Sources */ = {isa = PBXBuildFile; fileRef = 832EA12F237F5CB500FA1A45 /* MainA.m */; }; 28 | 832EA134237F5CBD00FA1A45 /* MainB.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA132237F5CBD00FA1A45 /* MainB.h */; }; 29 | 832EA135237F5CBD00FA1A45 /* MainB.m in Sources */ = {isa = PBXBuildFile; fileRef = 832EA133237F5CBD00FA1A45 /* MainB.m */; }; 30 | 832EA138237F5CC700FA1A45 /* MainC.h in Headers */ = {isa = PBXBuildFile; fileRef = 832EA136237F5CC700FA1A45 /* MainC.h */; }; 31 | 832EA139237F5CC700FA1A45 /* MainC.m in Sources */ = {isa = PBXBuildFile; fileRef = 832EA137237F5CC700FA1A45 /* MainC.m */; }; 32 | 832EA13B237F5CD500FA1A45 /* SubFrameworks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 832EA10A237F5C1600FA1A45 /* SubFrameworks.framework */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 83060EE923807D7000FDF0AD /* MainD.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainD.h; sourceTree = ""; }; 37 | 83060EEA23807D7000FDF0AD /* MainD.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainD.m; sourceTree = ""; }; 38 | 83060EED23807D7A00FDF0AD /* MainE.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainE.h; sourceTree = ""; }; 39 | 83060EEE23807D7A00FDF0AD /* MainE.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainE.m; sourceTree = ""; }; 40 | 83060EF123807D8500FDF0AD /* MainF.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainF.h; sourceTree = ""; }; 41 | 83060EF223807D8500FDF0AD /* MainF.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainF.m; sourceTree = ""; }; 42 | 83060EF523807D8E00FDF0AD /* MainG.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainG.h; sourceTree = ""; }; 43 | 83060EF623807D8E00FDF0AD /* MainG.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainG.m; sourceTree = ""; }; 44 | 832EA10A237F5C1600FA1A45 /* SubFrameworks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SubFrameworks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 832EA10D237F5C1600FA1A45 /* SubFrameworks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubFrameworks.h; sourceTree = ""; }; 46 | 832EA10E237F5C1600FA1A45 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | 832EA115237F5C4500FA1A45 /* SubA.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubA.h; sourceTree = ""; }; 48 | 832EA116237F5C4500FA1A45 /* SubA.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SubA.m; sourceTree = ""; }; 49 | 832EA119237F5C5200FA1A45 /* SubB.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubB.h; sourceTree = ""; }; 50 | 832EA11A237F5C5200FA1A45 /* SubB.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SubB.m; sourceTree = ""; }; 51 | 832EA11D237F5C5E00FA1A45 /* SubC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubC.h; sourceTree = ""; }; 52 | 832EA11E237F5C5E00FA1A45 /* SubC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SubC.m; sourceTree = ""; }; 53 | 832EA126237F5CA600FA1A45 /* MainFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MainFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 832EA128237F5CA600FA1A45 /* MainFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainFramework.h; sourceTree = ""; }; 55 | 832EA129237F5CA600FA1A45 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 832EA12E237F5CB500FA1A45 /* MainA.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainA.h; sourceTree = ""; }; 57 | 832EA12F237F5CB500FA1A45 /* MainA.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainA.m; sourceTree = ""; }; 58 | 832EA132237F5CBD00FA1A45 /* MainB.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainB.h; sourceTree = ""; }; 59 | 832EA133237F5CBD00FA1A45 /* MainB.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainB.m; sourceTree = ""; }; 60 | 832EA136237F5CC700FA1A45 /* MainC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainC.h; sourceTree = ""; }; 61 | 832EA137237F5CC700FA1A45 /* MainC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainC.m; sourceTree = ""; }; 62 | /* End PBXFileReference section */ 63 | 64 | /* Begin PBXFrameworksBuildPhase section */ 65 | 832EA107237F5C1600FA1A45 /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | 832EA123237F5CA600FA1A45 /* Frameworks */ = { 73 | isa = PBXFrameworksBuildPhase; 74 | buildActionMask = 2147483647; 75 | files = ( 76 | 832EA13B237F5CD500FA1A45 /* SubFrameworks.framework in Frameworks */, 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | /* End PBXFrameworksBuildPhase section */ 81 | 82 | /* Begin PBXGroup section */ 83 | 832EA100237F5C1600FA1A45 = { 84 | isa = PBXGroup; 85 | children = ( 86 | 832EA10C237F5C1600FA1A45 /* SubFrameworks */, 87 | 832EA127237F5CA600FA1A45 /* MainFramework */, 88 | 832EA10B237F5C1600FA1A45 /* Products */, 89 | 832EA13A237F5CD500FA1A45 /* Frameworks */, 90 | ); 91 | sourceTree = ""; 92 | }; 93 | 832EA10B237F5C1600FA1A45 /* Products */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 832EA10A237F5C1600FA1A45 /* SubFrameworks.framework */, 97 | 832EA126237F5CA600FA1A45 /* MainFramework.framework */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | 832EA10C237F5C1600FA1A45 /* SubFrameworks */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 832EA10D237F5C1600FA1A45 /* SubFrameworks.h */, 106 | 832EA10E237F5C1600FA1A45 /* Info.plist */, 107 | 832EA115237F5C4500FA1A45 /* SubA.h */, 108 | 832EA116237F5C4500FA1A45 /* SubA.m */, 109 | 832EA119237F5C5200FA1A45 /* SubB.h */, 110 | 832EA11A237F5C5200FA1A45 /* SubB.m */, 111 | 832EA11D237F5C5E00FA1A45 /* SubC.h */, 112 | 832EA11E237F5C5E00FA1A45 /* SubC.m */, 113 | ); 114 | path = SubFrameworks; 115 | sourceTree = ""; 116 | }; 117 | 832EA127237F5CA600FA1A45 /* MainFramework */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 832EA128237F5CA600FA1A45 /* MainFramework.h */, 121 | 832EA129237F5CA600FA1A45 /* Info.plist */, 122 | 832EA12E237F5CB500FA1A45 /* MainA.h */, 123 | 832EA12F237F5CB500FA1A45 /* MainA.m */, 124 | 832EA132237F5CBD00FA1A45 /* MainB.h */, 125 | 832EA133237F5CBD00FA1A45 /* MainB.m */, 126 | 832EA136237F5CC700FA1A45 /* MainC.h */, 127 | 832EA137237F5CC700FA1A45 /* MainC.m */, 128 | 83060EE923807D7000FDF0AD /* MainD.h */, 129 | 83060EEA23807D7000FDF0AD /* MainD.m */, 130 | 83060EED23807D7A00FDF0AD /* MainE.h */, 131 | 83060EEE23807D7A00FDF0AD /* MainE.m */, 132 | 83060EF123807D8500FDF0AD /* MainF.h */, 133 | 83060EF223807D8500FDF0AD /* MainF.m */, 134 | 83060EF523807D8E00FDF0AD /* MainG.h */, 135 | 83060EF623807D8E00FDF0AD /* MainG.m */, 136 | ); 137 | path = MainFramework; 138 | sourceTree = ""; 139 | }; 140 | 832EA13A237F5CD500FA1A45 /* Frameworks */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | ); 144 | name = Frameworks; 145 | sourceTree = ""; 146 | }; 147 | /* End PBXGroup section */ 148 | 149 | /* Begin PBXHeadersBuildPhase section */ 150 | 832EA105237F5C1600FA1A45 /* Headers */ = { 151 | isa = PBXHeadersBuildPhase; 152 | buildActionMask = 2147483647; 153 | files = ( 154 | 832EA11B237F5C5200FA1A45 /* SubB.h in Headers */, 155 | 832EA11F237F5C5E00FA1A45 /* SubC.h in Headers */, 156 | 832EA10F237F5C1600FA1A45 /* SubFrameworks.h in Headers */, 157 | 832EA117237F5C4500FA1A45 /* SubA.h in Headers */, 158 | ); 159 | runOnlyForDeploymentPostprocessing = 0; 160 | }; 161 | 832EA121237F5CA600FA1A45 /* Headers */ = { 162 | isa = PBXHeadersBuildPhase; 163 | buildActionMask = 2147483647; 164 | files = ( 165 | 83060EEB23807D7000FDF0AD /* MainD.h in Headers */, 166 | 83060EF723807D8E00FDF0AD /* MainG.h in Headers */, 167 | 832EA134237F5CBD00FA1A45 /* MainB.h in Headers */, 168 | 832EA138237F5CC700FA1A45 /* MainC.h in Headers */, 169 | 83060EEF23807D7A00FDF0AD /* MainE.h in Headers */, 170 | 832EA12A237F5CA600FA1A45 /* MainFramework.h in Headers */, 171 | 83060EF323807D8500FDF0AD /* MainF.h in Headers */, 172 | 832EA130237F5CB500FA1A45 /* MainA.h in Headers */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXHeadersBuildPhase section */ 177 | 178 | /* Begin PBXNativeTarget section */ 179 | 832EA109237F5C1600FA1A45 /* SubFrameworks */ = { 180 | isa = PBXNativeTarget; 181 | buildConfigurationList = 832EA112237F5C1600FA1A45 /* Build configuration list for PBXNativeTarget "SubFrameworks" */; 182 | buildPhases = ( 183 | 832EA105237F5C1600FA1A45 /* Headers */, 184 | 832EA106237F5C1600FA1A45 /* Sources */, 185 | 832EA107237F5C1600FA1A45 /* Frameworks */, 186 | 832EA108237F5C1600FA1A45 /* Resources */, 187 | ); 188 | buildRules = ( 189 | ); 190 | dependencies = ( 191 | ); 192 | name = SubFrameworks; 193 | productName = SubFrameworks; 194 | productReference = 832EA10A237F5C1600FA1A45 /* SubFrameworks.framework */; 195 | productType = "com.apple.product-type.framework"; 196 | }; 197 | 832EA125237F5CA600FA1A45 /* MainFramework */ = { 198 | isa = PBXNativeTarget; 199 | buildConfigurationList = 832EA12B237F5CA600FA1A45 /* Build configuration list for PBXNativeTarget "MainFramework" */; 200 | buildPhases = ( 201 | 832EA121237F5CA600FA1A45 /* Headers */, 202 | 832EA122237F5CA600FA1A45 /* Sources */, 203 | 832EA123237F5CA600FA1A45 /* Frameworks */, 204 | 832EA124237F5CA600FA1A45 /* Resources */, 205 | ); 206 | buildRules = ( 207 | ); 208 | dependencies = ( 209 | ); 210 | name = MainFramework; 211 | productName = MainFramework; 212 | productReference = 832EA126237F5CA600FA1A45 /* MainFramework.framework */; 213 | productType = "com.apple.product-type.framework"; 214 | }; 215 | /* End PBXNativeTarget section */ 216 | 217 | /* Begin PBXProject section */ 218 | 832EA101237F5C1600FA1A45 /* Project object */ = { 219 | isa = PBXProject; 220 | attributes = { 221 | LastUpgradeCheck = 1120; 222 | ORGANIZATIONNAME = "Christopher Liscio"; 223 | TargetAttributes = { 224 | 832EA109237F5C1600FA1A45 = { 225 | CreatedOnToolsVersion = 11.2; 226 | }; 227 | 832EA125237F5CA600FA1A45 = { 228 | CreatedOnToolsVersion = 11.2; 229 | }; 230 | }; 231 | }; 232 | buildConfigurationList = 832EA104237F5C1600FA1A45 /* Build configuration list for PBXProject "SubFrameworks" */; 233 | compatibilityVersion = "Xcode 9.3"; 234 | developmentRegion = en; 235 | hasScannedForEncodings = 0; 236 | knownRegions = ( 237 | en, 238 | Base, 239 | ); 240 | mainGroup = 832EA100237F5C1600FA1A45; 241 | productRefGroup = 832EA10B237F5C1600FA1A45 /* Products */; 242 | projectDirPath = ""; 243 | projectRoot = ""; 244 | targets = ( 245 | 832EA109237F5C1600FA1A45 /* SubFrameworks */, 246 | 832EA125237F5CA600FA1A45 /* MainFramework */, 247 | ); 248 | }; 249 | /* End PBXProject section */ 250 | 251 | /* Begin PBXResourcesBuildPhase section */ 252 | 832EA108237F5C1600FA1A45 /* Resources */ = { 253 | isa = PBXResourcesBuildPhase; 254 | buildActionMask = 2147483647; 255 | files = ( 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | 832EA124237F5CA600FA1A45 /* Resources */ = { 260 | isa = PBXResourcesBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | ); 264 | runOnlyForDeploymentPostprocessing = 0; 265 | }; 266 | /* End PBXResourcesBuildPhase section */ 267 | 268 | /* Begin PBXSourcesBuildPhase section */ 269 | 832EA106237F5C1600FA1A45 /* Sources */ = { 270 | isa = PBXSourcesBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | 832EA120237F5C5E00FA1A45 /* SubC.m in Sources */, 274 | 832EA118237F5C4500FA1A45 /* SubA.m in Sources */, 275 | 832EA11C237F5C5200FA1A45 /* SubB.m in Sources */, 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | 832EA122237F5CA600FA1A45 /* Sources */ = { 280 | isa = PBXSourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | 832EA139237F5CC700FA1A45 /* MainC.m in Sources */, 284 | 83060EF023807D7A00FDF0AD /* MainE.m in Sources */, 285 | 832EA131237F5CB500FA1A45 /* MainA.m in Sources */, 286 | 83060EF423807D8500FDF0AD /* MainF.m in Sources */, 287 | 83060EF823807D8E00FDF0AD /* MainG.m in Sources */, 288 | 832EA135237F5CBD00FA1A45 /* MainB.m in Sources */, 289 | 83060EEC23807D7000FDF0AD /* MainD.m in Sources */, 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXSourcesBuildPhase section */ 294 | 295 | /* Begin XCBuildConfiguration section */ 296 | 832EA110237F5C1600FA1A45 /* Debug */ = { 297 | isa = XCBuildConfiguration; 298 | buildSettings = { 299 | ALWAYS_SEARCH_USER_PATHS = NO; 300 | CLANG_ANALYZER_NONNULL = YES; 301 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 302 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 303 | CLANG_CXX_LIBRARY = "libc++"; 304 | CLANG_ENABLE_MODULES = YES; 305 | CLANG_ENABLE_OBJC_ARC = YES; 306 | CLANG_ENABLE_OBJC_WEAK = YES; 307 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 308 | CLANG_WARN_BOOL_CONVERSION = YES; 309 | CLANG_WARN_COMMA = YES; 310 | CLANG_WARN_CONSTANT_CONVERSION = YES; 311 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 312 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 313 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 314 | CLANG_WARN_EMPTY_BODY = YES; 315 | CLANG_WARN_ENUM_CONVERSION = YES; 316 | CLANG_WARN_INFINITE_RECURSION = YES; 317 | CLANG_WARN_INT_CONVERSION = YES; 318 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 319 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 320 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 321 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 322 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 323 | CLANG_WARN_STRICT_PROTOTYPES = YES; 324 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 325 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 326 | CLANG_WARN_UNREACHABLE_CODE = YES; 327 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 328 | COPY_PHASE_STRIP = NO; 329 | CURRENT_PROJECT_VERSION = 1; 330 | DEBUG_INFORMATION_FORMAT = dwarf; 331 | ENABLE_STRICT_OBJC_MSGSEND = YES; 332 | ENABLE_TESTABILITY = YES; 333 | GCC_C_LANGUAGE_STANDARD = gnu11; 334 | GCC_DYNAMIC_NO_PIC = NO; 335 | GCC_NO_COMMON_BLOCKS = YES; 336 | GCC_OPTIMIZATION_LEVEL = 0; 337 | GCC_PREPROCESSOR_DEFINITIONS = ( 338 | "DEBUG=1", 339 | "$(inherited)", 340 | ); 341 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 342 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 343 | GCC_WARN_UNDECLARED_SELECTOR = YES; 344 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 345 | GCC_WARN_UNUSED_FUNCTION = YES; 346 | GCC_WARN_UNUSED_VARIABLE = YES; 347 | MACOSX_DEPLOYMENT_TARGET = 10.15; 348 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 349 | MTL_FAST_MATH = YES; 350 | ONLY_ACTIVE_ARCH = YES; 351 | OTHER_CFLAGS = "-Rmodule-build"; 352 | SDKROOT = macosx; 353 | VERSIONING_SYSTEM = "apple-generic"; 354 | VERSION_INFO_PREFIX = ""; 355 | }; 356 | name = Debug; 357 | }; 358 | 832EA111237F5C1600FA1A45 /* Release */ = { 359 | isa = XCBuildConfiguration; 360 | buildSettings = { 361 | ALWAYS_SEARCH_USER_PATHS = NO; 362 | CLANG_ANALYZER_NONNULL = YES; 363 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 364 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 365 | CLANG_CXX_LIBRARY = "libc++"; 366 | CLANG_ENABLE_MODULES = YES; 367 | CLANG_ENABLE_OBJC_ARC = YES; 368 | CLANG_ENABLE_OBJC_WEAK = YES; 369 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 370 | CLANG_WARN_BOOL_CONVERSION = YES; 371 | CLANG_WARN_COMMA = YES; 372 | CLANG_WARN_CONSTANT_CONVERSION = YES; 373 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 374 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 375 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 376 | CLANG_WARN_EMPTY_BODY = YES; 377 | CLANG_WARN_ENUM_CONVERSION = YES; 378 | CLANG_WARN_INFINITE_RECURSION = YES; 379 | CLANG_WARN_INT_CONVERSION = YES; 380 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 381 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 382 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 383 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 384 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 385 | CLANG_WARN_STRICT_PROTOTYPES = YES; 386 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 387 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 388 | CLANG_WARN_UNREACHABLE_CODE = YES; 389 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 390 | COPY_PHASE_STRIP = NO; 391 | CURRENT_PROJECT_VERSION = 1; 392 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 393 | ENABLE_NS_ASSERTIONS = NO; 394 | ENABLE_STRICT_OBJC_MSGSEND = YES; 395 | GCC_C_LANGUAGE_STANDARD = gnu11; 396 | GCC_NO_COMMON_BLOCKS = YES; 397 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 398 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 399 | GCC_WARN_UNDECLARED_SELECTOR = YES; 400 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 401 | GCC_WARN_UNUSED_FUNCTION = YES; 402 | GCC_WARN_UNUSED_VARIABLE = YES; 403 | MACOSX_DEPLOYMENT_TARGET = 10.15; 404 | MTL_ENABLE_DEBUG_INFO = NO; 405 | MTL_FAST_MATH = YES; 406 | OTHER_CFLAGS = "-Rmodule-build"; 407 | SDKROOT = macosx; 408 | VERSIONING_SYSTEM = "apple-generic"; 409 | VERSION_INFO_PREFIX = ""; 410 | }; 411 | name = Release; 412 | }; 413 | 832EA113237F5C1600FA1A45 /* Debug */ = { 414 | isa = XCBuildConfiguration; 415 | buildSettings = { 416 | CODE_SIGN_STYLE = Manual; 417 | COMBINE_HIDPI_IMAGES = YES; 418 | DEFINES_MODULE = YES; 419 | DEVELOPMENT_TEAM = ""; 420 | DYLIB_COMPATIBILITY_VERSION = 1; 421 | DYLIB_CURRENT_VERSION = 1; 422 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 423 | INFOPLIST_FILE = SubFrameworks/Info.plist; 424 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 425 | LD_RUNPATH_SEARCH_PATHS = ( 426 | "$(inherited)", 427 | "@executable_path/../Frameworks", 428 | "@loader_path/Frameworks", 429 | ); 430 | PRODUCT_BUNDLE_IDENTIFIER = org.liscio.SubFrameworks; 431 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 432 | PROVISIONING_PROFILE_SPECIFIER = ""; 433 | SKIP_INSTALL = YES; 434 | }; 435 | name = Debug; 436 | }; 437 | 832EA114237F5C1600FA1A45 /* Release */ = { 438 | isa = XCBuildConfiguration; 439 | buildSettings = { 440 | CODE_SIGN_STYLE = Manual; 441 | COMBINE_HIDPI_IMAGES = YES; 442 | DEFINES_MODULE = YES; 443 | DEVELOPMENT_TEAM = ""; 444 | DYLIB_COMPATIBILITY_VERSION = 1; 445 | DYLIB_CURRENT_VERSION = 1; 446 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 447 | INFOPLIST_FILE = SubFrameworks/Info.plist; 448 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 449 | LD_RUNPATH_SEARCH_PATHS = ( 450 | "$(inherited)", 451 | "@executable_path/../Frameworks", 452 | "@loader_path/Frameworks", 453 | ); 454 | PRODUCT_BUNDLE_IDENTIFIER = org.liscio.SubFrameworks; 455 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 456 | PROVISIONING_PROFILE_SPECIFIER = ""; 457 | SKIP_INSTALL = YES; 458 | }; 459 | name = Release; 460 | }; 461 | 832EA12C237F5CA600FA1A45 /* Debug */ = { 462 | isa = XCBuildConfiguration; 463 | buildSettings = { 464 | CODE_SIGN_STYLE = Manual; 465 | COMBINE_HIDPI_IMAGES = YES; 466 | DEFINES_MODULE = YES; 467 | DEVELOPMENT_TEAM = ""; 468 | DYLIB_COMPATIBILITY_VERSION = 1; 469 | DYLIB_CURRENT_VERSION = 1; 470 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 471 | INFOPLIST_FILE = MainFramework/Info.plist; 472 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 473 | LD_RUNPATH_SEARCH_PATHS = ( 474 | "$(inherited)", 475 | "@executable_path/../Frameworks", 476 | "@loader_path/Frameworks", 477 | ); 478 | PRODUCT_BUNDLE_IDENTIFIER = org.liscio.MainFramework; 479 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 480 | PROVISIONING_PROFILE_SPECIFIER = ""; 481 | SKIP_INSTALL = YES; 482 | }; 483 | name = Debug; 484 | }; 485 | 832EA12D237F5CA600FA1A45 /* Release */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | CODE_SIGN_STYLE = Manual; 489 | COMBINE_HIDPI_IMAGES = YES; 490 | DEFINES_MODULE = YES; 491 | DEVELOPMENT_TEAM = ""; 492 | DYLIB_COMPATIBILITY_VERSION = 1; 493 | DYLIB_CURRENT_VERSION = 1; 494 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 495 | INFOPLIST_FILE = MainFramework/Info.plist; 496 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 497 | LD_RUNPATH_SEARCH_PATHS = ( 498 | "$(inherited)", 499 | "@executable_path/../Frameworks", 500 | "@loader_path/Frameworks", 501 | ); 502 | PRODUCT_BUNDLE_IDENTIFIER = org.liscio.MainFramework; 503 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 504 | PROVISIONING_PROFILE_SPECIFIER = ""; 505 | SKIP_INSTALL = YES; 506 | }; 507 | name = Release; 508 | }; 509 | /* End XCBuildConfiguration section */ 510 | 511 | /* Begin XCConfigurationList section */ 512 | 832EA104237F5C1600FA1A45 /* Build configuration list for PBXProject "SubFrameworks" */ = { 513 | isa = XCConfigurationList; 514 | buildConfigurations = ( 515 | 832EA110237F5C1600FA1A45 /* Debug */, 516 | 832EA111237F5C1600FA1A45 /* Release */, 517 | ); 518 | defaultConfigurationIsVisible = 0; 519 | defaultConfigurationName = Release; 520 | }; 521 | 832EA112237F5C1600FA1A45 /* Build configuration list for PBXNativeTarget "SubFrameworks" */ = { 522 | isa = XCConfigurationList; 523 | buildConfigurations = ( 524 | 832EA113237F5C1600FA1A45 /* Debug */, 525 | 832EA114237F5C1600FA1A45 /* Release */, 526 | ); 527 | defaultConfigurationIsVisible = 0; 528 | defaultConfigurationName = Release; 529 | }; 530 | 832EA12B237F5CA600FA1A45 /* Build configuration list for PBXNativeTarget "MainFramework" */ = { 531 | isa = XCConfigurationList; 532 | buildConfigurations = ( 533 | 832EA12C237F5CA600FA1A45 /* Debug */, 534 | 832EA12D237F5CA600FA1A45 /* Release */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | /* End XCConfigurationList section */ 540 | }; 541 | rootObject = 832EA101237F5C1600FA1A45 /* Project object */; 542 | } 543 | -------------------------------------------------------------------------------- /SubFrameworks.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SubFrameworks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SubFrameworks.xcodeproj/xcuserdata/chris.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | MainFramework.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 1 11 | 12 | SubFrameworks.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /SubFrameworks/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2019 Christopher Liscio. All rights reserved. 23 | 24 | 25 | -------------------------------------------------------------------------------- /SubFrameworks/SubA.h: -------------------------------------------------------------------------------- 1 | // 2 | // SubA.h 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SubA : NSObject 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /SubFrameworks/SubA.m: -------------------------------------------------------------------------------- 1 | // 2 | // SubA.m 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "SubA.h" 10 | 11 | @implementation SubA 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /SubFrameworks/SubB.h: -------------------------------------------------------------------------------- 1 | // 2 | // SubB.h 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SubB : NSObject 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /SubFrameworks/SubB.m: -------------------------------------------------------------------------------- 1 | // 2 | // SubB.m 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "SubB.h" 10 | 11 | @implementation SubB 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /SubFrameworks/SubC.h: -------------------------------------------------------------------------------- 1 | // 2 | // SubC.h 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SubC : NSObject 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /SubFrameworks/SubC.m: -------------------------------------------------------------------------------- 1 | // 2 | // SubC.m 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import "SubC.h" 10 | 11 | @implementation SubC 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /SubFrameworks/SubFrameworks.h: -------------------------------------------------------------------------------- 1 | // 2 | // SubFrameworks.h 3 | // SubFrameworks 4 | // 5 | // Created by Christopher Liscio on 2019-11-15. 6 | // Copyright © 2019 Christopher Liscio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for SubFrameworks. 12 | FOUNDATION_EXPORT double SubFrameworksVersionNumber; 13 | 14 | //! Project version string for SubFrameworks. 15 | FOUNDATION_EXPORT const unsigned char SubFrameworksVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | #import 21 | #import 22 | #import 23 | -------------------------------------------------------------------------------- /checkRebuilds.sh: -------------------------------------------------------------------------------- 1 | # A simple script that dumps only the module (re-)builds 2 | 3 | DERIVED_OVERRIDE=testDerivedData 4 | 5 | rm -rf $DERIVED_OVERRIDE 6 | 7 | echo 8 | echo %%% Building Using Clean DerivedData %%% 9 | echo 10 | 11 | xcodebuild -scheme MainFramework build -derivedDataPath testDerivedData | grep -e 'building module ' 12 | 13 | echo 14 | echo %%% Clean re-build %%% 15 | echo 16 | 17 | xcodebuild -scheme MainFramework clean build -derivedDataPath testDerivedData | grep -e 'building module ' 18 | --------------------------------------------------------------------------------