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