├── GTMLoadTimer.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcshareddata │ └── xcschemes │ │ └── GTMLoadTimer-macOS.xcscheme └── project.pbxproj ├── BUILD ├── Info.plist ├── CONTRIBUTING.md ├── README.md ├── GTMLoadTimer.m ├── GTMLoadTimer.instrpkg └── LICENSE /GTMLoadTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /GTMLoadTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /BUILD: -------------------------------------------------------------------------------- 1 | package(default_visibility = ["//visibility:private"]) 2 | 3 | licenses(["notice"]) # Apache 2.0 4 | 5 | exports_files(["LICENSE"]) 6 | 7 | load("//tools/build_defs/apple:ios.bzl", "ios_framework") 8 | 9 | ios_framework( 10 | name = "GTMLoadTimer", 11 | bundle_id = "com.google.toolbox.GTMLoadTimer", 12 | extension_safe = 1, 13 | families = [ 14 | "iphone", 15 | "ipad", 16 | ], 17 | infoplists = [":Info.plist"], 18 | minimum_os_version = "8", 19 | visibility = ["//visibility:public"], 20 | deps = [ 21 | ":GTMLoadTimerLib", 22 | ], 23 | ) 24 | 25 | objc_library( 26 | name = "GTMLoadTimerLib", 27 | srcs = ["GTMLoadTimer.m"], 28 | ) 29 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleVersion 18 | 1.0 19 | CFBundleShortVersionString 20 | 1.0 21 | 22 | 23 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are 4 | just a few small guidelines you need to follow. 5 | 6 | ## Contributor License Agreement 7 | 8 | Contributions to this project must be accompanied by a Contributor License 9 | Agreement. You (or your employer) retain the copyright to your contribution; 10 | this simply gives us permission to use and redistribute your contributions as 11 | part of the project. Head over to to see 12 | your current agreements on file or to sign a new one. 13 | 14 | You generally only need to submit a CLA once, so if you've already submitted one 15 | (even if it was for a different project), you probably don't need to do it 16 | again. 17 | 18 | ## Code reviews 19 | 20 | All submissions, including submissions by project members, require review. We 21 | use GitHub pull requests for this purpose. Consult 22 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 23 | information on using pull requests. 24 | 25 | ## Community Guidelines 26 | 27 | This project follows [Google's Open Source Community 28 | Guidelines](https://opensource.google.com/conduct/). 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gtm_load_timer 2 | 3 | GTMLoadTimer is a framework to instrument Objective C +load calls to see how they are contributing to your 4 | application startup time. 5 | 6 | ## How to use GTMLoadTimer 7 | 8 | 1. Add a dependency on either the GTMLoadTimer-macOS or GTMLoadTimer-iOS framework to your project. 9 | 1. Do a build and verify that the framework is copied into the Frameworks directory of your application bundle. 10 | 1. Build the "Instrument" target of the GTMLoadTimer project. 11 | 1. Go to the Finder and "open" the GTMLoadTimer.instrdst package you just built. It should ask to install into 12 | Instruments. 13 | 1. Create a new "blank" instrument in Instruments and add the "+load messages" instrument. 14 | 1. Record your app with your instrument. 15 | 16 | 17 | The data that you are probably most interested in is the `+load messages` graph which will show you timings for 18 | each of the `+load` messages that the framework has swizzled. 19 | The "swizzler" track is just to make you aware of the overhead of using GTMLoadTimer. 20 | 21 | **_Please do not ship GTMLoadTimer in your applications._** 22 | 23 | As far as I know there is nothing that GTMLoadTimer does that breaks any of Apple's rules with regards to the 24 | AppStore in that it only uses public APIs. That being said, all it will do is slow down launch time for your end users 25 | which is not cool. 26 | 27 | What would be cool is if Apple built this functionality into libObjc directly so that GTMLoadTimer wasn't needed at all. 28 | If you feel the same, please file a radar to let Apple know you care. Feel free to reference my radar on this issue 29 | (47260318). 30 | 31 | ## Level of support 32 | This is not an officially supported Google product. 33 | -------------------------------------------------------------------------------- /GTMLoadTimer.xcodeproj/xcshareddata/xcschemes/GTMLoadTimer-macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /GTMLoadTimer.m: -------------------------------------------------------------------------------- 1 | // Copyright 2018 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // https://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #import 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | static os_log_t swizzleLogger; 24 | 25 | static void SwizzleLoads(const struct mach_header* mh, intptr_t vmaddr_slide) { 26 | Dl_info info; 27 | 28 | if (dladdr(mh, &info) == 0 || info.dli_fname == NULL) { 29 | os_log_error(OS_LOG_DEFAULT, "Unable to locate a mach_header in GTMLoadTimer::SwizzleLoads"); 30 | return; 31 | } 32 | os_signpost_id_t swizzleSignPost = OS_SIGNPOST_ID_INVALID; 33 | if (@available(iOS 12, macOS 10.14, *)) { 34 | swizzleSignPost = os_signpost_id_make_with_pointer(swizzleLogger, mh); 35 | os_signpost_interval_begin(swizzleLogger, swizzleSignPost, "swizzler", 36 | "file: %{public}s", info.dli_fname); 37 | } 38 | unsigned int classCount; 39 | const char **classNames = objc_copyClassNamesForImage(info.dli_fname, &classCount); 40 | for (unsigned int i = 0; i < classCount; i++) { 41 | Class cls = objc_lookUpClass(classNames[i]); 42 | unsigned int methodCount; 43 | Method *methods= class_copyMethodList(object_getClass(cls), &methodCount); 44 | for (unsigned int j = 0; j < methodCount; j++) { 45 | SEL selector = method_getName(methods[j]); 46 | const char *name = sel_getName(selector); 47 | if (strcmp(name, "load") == 0) { 48 | char *className = strdup(classNames[i]); 49 | typedef void (*LoadImpType)(id self, SEL selector); 50 | LoadImpType oldImp = (LoadImpType)method_getImplementation(methods[j]); 51 | os_signpost_id_t loadSignPost = OS_SIGNPOST_ID_INVALID; 52 | if (@available(iOS 12, macOS 10.14, *)) { 53 | loadSignPost = os_signpost_id_make_with_pointer(swizzleLogger, oldImp); 54 | } 55 | IMP newImp = imp_implementationWithBlock(^void(id self) { 56 | if (@available(iOS 12, macOS 10.14, *)) { 57 | os_signpost_interval_begin(swizzleLogger, loadSignPost, "load", 58 | "class: %{public}s", className); 59 | } 60 | oldImp(self, @selector(load)); 61 | if (@available(iOS 12, macOS 10.14, *)) { 62 | os_signpost_interval_end(swizzleLogger, loadSignPost, "load"); 63 | } 64 | free(className); 65 | }); 66 | method_setImplementation(methods[j], newImp); 67 | break; 68 | } 69 | } 70 | free(methods); 71 | } 72 | free(classNames); 73 | if (@available(iOS 12, macOS 10.14, *)) { 74 | os_signpost_interval_end(swizzleLogger, swizzleSignPost, "swizzler"); 75 | } 76 | } 77 | 78 | @interface GTMLoadTimer : NSObject 79 | @end 80 | 81 | @implementation GTMLoadTimer 82 | 83 | + (void)load { 84 | if (@available (iOS 12.0, macOS 10.14, *)) { 85 | swizzleLogger = os_log_create("com.google.instruments.loadtimer", "performance"); 86 | _dyld_register_func_for_add_image(SwizzleLoads); 87 | } 88 | } 89 | 90 | @end 91 | -------------------------------------------------------------------------------- /GTMLoadTimer.instrpkg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 20 | 21 | com.google.instruments.loadtimer 22 | 1 23 | GTMLoadTimer 24 | 25 | Dave MacLachlan 26 | 27 | 28 | Monitors +load messages. Requires that apps link with the GTMLoadTimer framework. 29 | 30 | 31 | 32 | 33 | com-google-instruments-class-load-messages 34 | +load Message 35 | 36 | Monitors +load messages. 37 | 38 | "com.google.instruments.loadtimer" 39 | "performance" 40 | "load" 41 | 42 | "class: " ?class 43 | 44 | 45 | ?ignored 46 | 47 | 48 | duration 49 | Duration 50 | duration 51 | 52 | 53 | class 54 | Class 55 | raw-string 56 | ?class 57 | 58 | 59 | 60 | 61 | com-google-instruments-class-load-swizzler 62 | +load Swizzler 63 | 64 | Monitors swizzler instrumenting +load messages. This is just to be aware of the overhead 65 | incurred by the GTMLoadTimer framework itself at startup time. 66 | 67 | "com.google.instruments.loadtimer" 68 | "performance" 69 | "swizzler" 70 | 71 | "file: " ?file 72 | 73 | 74 | ?ignored 75 | 76 | 77 | duration 78 | Duration 79 | duration 80 | 81 | 82 | file 83 | File 84 | file-path 85 | ?file 86 | 87 | 88 | 89 | 90 | 91 | com.google.instruments.loadtimer.loads 92 | +load messages 93 | Behavior 94 | Measures +load messages. 95 | Generic 96 | 97 | load 98 | com-google-instruments-class-load-messages 99 | 100 | 101 | swizzler 102 | com-google-instruments-class-load-swizzler 103 | 104 | 105 | +load messages 106 | 107 | +load messages 108 | load 109 | 110 | class 111 | 112 | 113 | 114 | +load swizzler 115 | swizzler 116 | Purple 117 | 118 | file 119 | 120 | 121 | 122 | 123 | Summary: +load 124 | load 125 | 126 | 127 | class 128 | 129 | 130 | 131 | Duration 132 | duration 133 | 134 | 135 | 136 | Summary: swizzler 137 | swizzler 138 | 139 | 140 | file 141 | 142 | 143 | 144 | Duration 145 | duration 146 | 147 | 148 | 149 | List: +load 150 | load 151 | start 152 | duration 153 | class 154 | 155 | 156 | List: swizzler 157 | swizzler 158 | start 159 | duration 160 | file 161 | 162 | 163 | 164 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /GTMLoadTimer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 8B05C9BF21E96EEE00E634D1 /* GTMLoadTimer.instrpkg in Sources */ = {isa = PBXBuildFile; fileRef = 8B05C9BE21E96EEE00E634D1 /* GTMLoadTimer.instrpkg */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXFileReference section */ 14 | 8B05C9BB21E96EEE00E634D1 /* GTMLoadTimer.instrdst */ = {isa = PBXFileReference; explicitFileType = com.apple.instruments.instrdst; includeInIndex = 0; path = GTMLoadTimer.instrdst; sourceTree = BUILT_PRODUCTS_DIR; }; 15 | 8B05C9BE21E96EEE00E634D1 /* GTMLoadTimer.instrpkg */ = {isa = PBXFileReference; lastKnownFileType = "com.apple.instruments.package-definition"; path = GTMLoadTimer.instrpkg; sourceTree = SOURCE_ROOT; }; 16 | 8B05C9C821E974F800E634D1 /* GTMLoadTimer_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMLoadTimer_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 17 | 8B05C9D021E9755300E634D1 /* GTMLoadTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMLoadTimer.m; sourceTree = SOURCE_ROOT; }; 18 | 8B05C9DB21E9759800E634D1 /* GTMLoadTimer-iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "GTMLoadTimer-iOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 19 | 8B05C9DD21ED0FED00E634D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 20 | 8B05C9DE21ED188400E634D1 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 21 | 8B05C9DF21ED188400E634D1 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; }; 22 | 8B05C9E021ED188400E634D1 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 23 | /* End PBXFileReference section */ 24 | 25 | /* Begin PBXFrameworksBuildPhase section */ 26 | 8B05C9C521E974F800E634D1 /* Frameworks */ = { 27 | isa = PBXFrameworksBuildPhase; 28 | buildActionMask = 2147483647; 29 | files = ( 30 | ); 31 | runOnlyForDeploymentPostprocessing = 0; 32 | }; 33 | 8B05C9D621E9759800E634D1 /* Frameworks */ = { 34 | isa = PBXFrameworksBuildPhase; 35 | buildActionMask = 2147483647; 36 | files = ( 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXFrameworksBuildPhase section */ 41 | 42 | /* Begin PBXGroup section */ 43 | 8B05C9B421E96EED00E634D1 = { 44 | isa = PBXGroup; 45 | children = ( 46 | 8B05C9BE21E96EEE00E634D1 /* GTMLoadTimer.instrpkg */, 47 | 8B05C9D021E9755300E634D1 /* GTMLoadTimer.m */, 48 | 8B05C9DD21ED0FED00E634D1 /* Info.plist */, 49 | 8B05C9DF21ED188400E634D1 /* CONTRIBUTING.md */, 50 | 8B05C9DE21ED188400E634D1 /* LICENSE */, 51 | 8B05C9E021ED188400E634D1 /* README.md */, 52 | 8B05C9BC21E96EEE00E634D1 /* Products */, 53 | ); 54 | sourceTree = ""; 55 | }; 56 | 8B05C9BC21E96EEE00E634D1 /* Products */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | 8B05C9BB21E96EEE00E634D1 /* GTMLoadTimer.instrdst */, 60 | 8B05C9C821E974F800E634D1 /* GTMLoadTimer_macOS.framework */, 61 | 8B05C9DB21E9759800E634D1 /* GTMLoadTimer-iOS.framework */, 62 | ); 63 | name = Products; 64 | sourceTree = ""; 65 | }; 66 | /* End PBXGroup section */ 67 | 68 | /* Begin PBXHeadersBuildPhase section */ 69 | 8B05C9C321E974F800E634D1 /* Headers */ = { 70 | isa = PBXHeadersBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | 8B05C9D321E9759800E634D1 /* Headers */ = { 77 | isa = PBXHeadersBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | /* End PBXHeadersBuildPhase section */ 84 | 85 | /* Begin PBXNativeTarget section */ 86 | 8B05C9BA21E96EEE00E634D1 /* Instrument */ = { 87 | isa = PBXNativeTarget; 88 | buildConfigurationList = 8B05C9C021E96EEE00E634D1 /* Build configuration list for PBXNativeTarget "Instrument" */; 89 | buildPhases = ( 90 | 8B05C9B921E96EEE00E634D1 /* Sources */, 91 | ); 92 | buildRules = ( 93 | ); 94 | dependencies = ( 95 | ); 96 | name = Instrument; 97 | productName = GTMLoadTImer; 98 | productReference = 8B05C9BB21E96EEE00E634D1 /* GTMLoadTimer.instrdst */; 99 | productType = "com.apple.product-type.instruments-package"; 100 | }; 101 | 8B05C9C721E974F800E634D1 /* GTMLoadTimer-macOS */ = { 102 | isa = PBXNativeTarget; 103 | buildConfigurationList = 8B05C9CD21E974F900E634D1 /* Build configuration list for PBXNativeTarget "GTMLoadTimer-macOS" */; 104 | buildPhases = ( 105 | 8B05C9C321E974F800E634D1 /* Headers */, 106 | 8B05C9C421E974F800E634D1 /* Sources */, 107 | 8B05C9C521E974F800E634D1 /* Frameworks */, 108 | 8B05C9C621E974F800E634D1 /* Resources */, 109 | ); 110 | buildRules = ( 111 | ); 112 | dependencies = ( 113 | ); 114 | name = "GTMLoadTimer-macOS"; 115 | productName = GTMLoadTimer; 116 | productReference = 8B05C9C821E974F800E634D1 /* GTMLoadTimer_macOS.framework */; 117 | productType = "com.apple.product-type.framework"; 118 | }; 119 | 8B05C9D221E9759800E634D1 /* GTMLoadTimer-iOS */ = { 120 | isa = PBXNativeTarget; 121 | buildConfigurationList = 8B05C9D821E9759800E634D1 /* Build configuration list for PBXNativeTarget "GTMLoadTimer-iOS" */; 122 | buildPhases = ( 123 | 8B05C9D321E9759800E634D1 /* Headers */, 124 | 8B05C9D421E9759800E634D1 /* Sources */, 125 | 8B05C9D621E9759800E634D1 /* Frameworks */, 126 | 8B05C9D721E9759800E634D1 /* Resources */, 127 | ); 128 | buildRules = ( 129 | ); 130 | dependencies = ( 131 | ); 132 | name = "GTMLoadTimer-iOS"; 133 | productName = GTMLoadTimer; 134 | productReference = 8B05C9DB21E9759800E634D1 /* GTMLoadTimer-iOS.framework */; 135 | productType = "com.apple.product-type.framework"; 136 | }; 137 | /* End PBXNativeTarget section */ 138 | 139 | /* Begin PBXProject section */ 140 | 8B05C9B521E96EED00E634D1 /* Project object */ = { 141 | isa = PBXProject; 142 | attributes = { 143 | LastUpgradeCheck = 1010; 144 | TargetAttributes = { 145 | 8B05C9BA21E96EEE00E634D1 = { 146 | CreatedOnToolsVersion = 10.1; 147 | }; 148 | 8B05C9C721E974F800E634D1 = { 149 | CreatedOnToolsVersion = 10.1; 150 | }; 151 | }; 152 | }; 153 | buildConfigurationList = 8B05C9B821E96EED00E634D1 /* Build configuration list for PBXProject "GTMLoadTimer" */; 154 | compatibilityVersion = "Xcode 9.3"; 155 | developmentRegion = en; 156 | hasScannedForEncodings = 0; 157 | knownRegions = ( 158 | en, 159 | ); 160 | mainGroup = 8B05C9B421E96EED00E634D1; 161 | productRefGroup = 8B05C9BC21E96EEE00E634D1 /* Products */; 162 | projectDirPath = ""; 163 | projectRoot = ""; 164 | targets = ( 165 | 8B05C9BA21E96EEE00E634D1 /* Instrument */, 166 | 8B05C9C721E974F800E634D1 /* GTMLoadTimer-macOS */, 167 | 8B05C9D221E9759800E634D1 /* GTMLoadTimer-iOS */, 168 | ); 169 | }; 170 | /* End PBXProject section */ 171 | 172 | /* Begin PBXResourcesBuildPhase section */ 173 | 8B05C9C621E974F800E634D1 /* Resources */ = { 174 | isa = PBXResourcesBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | ); 178 | runOnlyForDeploymentPostprocessing = 0; 179 | }; 180 | 8B05C9D721E9759800E634D1 /* Resources */ = { 181 | isa = PBXResourcesBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | /* End PBXResourcesBuildPhase section */ 188 | 189 | /* Begin PBXSourcesBuildPhase section */ 190 | 8B05C9B921E96EEE00E634D1 /* Sources */ = { 191 | isa = PBXSourcesBuildPhase; 192 | buildActionMask = 2147483647; 193 | files = ( 194 | 8B05C9BF21E96EEE00E634D1 /* GTMLoadTimer.instrpkg in Sources */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | 8B05C9C421E974F800E634D1 /* Sources */ = { 199 | isa = PBXSourcesBuildPhase; 200 | buildActionMask = 2147483647; 201 | files = ( 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | 8B05C9D421E9759800E634D1 /* Sources */ = { 206 | isa = PBXSourcesBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin XCBuildConfiguration section */ 215 | 8B05C9B621E96EED00E634D1 /* Debug */ = { 216 | isa = XCBuildConfiguration; 217 | buildSettings = { 218 | COPY_PHASE_STRIP = NO; 219 | }; 220 | name = Debug; 221 | }; 222 | 8B05C9B721E96EED00E634D1 /* Release */ = { 223 | isa = XCBuildConfiguration; 224 | buildSettings = { 225 | COPY_PHASE_STRIP = YES; 226 | }; 227 | name = Release; 228 | }; 229 | 8B05C9C121E96EEE00E634D1 /* Debug */ = { 230 | isa = XCBuildConfiguration; 231 | buildSettings = { 232 | ALWAYS_SEARCH_USER_PATHS = NO; 233 | CODE_SIGN_STYLE = Automatic; 234 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Instruments/Packages"; 235 | PRODUCT_NAME = GTMLoadTimer; 236 | VERSIONING_SYSTEM = ""; 237 | }; 238 | name = Debug; 239 | }; 240 | 8B05C9C221E96EEE00E634D1 /* Release */ = { 241 | isa = XCBuildConfiguration; 242 | buildSettings = { 243 | ALWAYS_SEARCH_USER_PATHS = NO; 244 | CODE_SIGN_STYLE = Automatic; 245 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Instruments/Packages"; 246 | PRODUCT_NAME = GTMLoadTimer; 247 | VERSIONING_SYSTEM = ""; 248 | }; 249 | name = Release; 250 | }; 251 | 8B05C9CE21E974F900E634D1 /* Debug */ = { 252 | isa = XCBuildConfiguration; 253 | buildSettings = { 254 | ALWAYS_SEARCH_USER_PATHS = NO; 255 | CLANG_ANALYZER_NONNULL = YES; 256 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 257 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 258 | CLANG_CXX_LIBRARY = "libc++"; 259 | CLANG_ENABLE_MODULES = YES; 260 | CLANG_ENABLE_OBJC_ARC = YES; 261 | CLANG_ENABLE_OBJC_WEAK = YES; 262 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 263 | CLANG_WARN_BOOL_CONVERSION = YES; 264 | CLANG_WARN_COMMA = YES; 265 | CLANG_WARN_CONSTANT_CONVERSION = YES; 266 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 267 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 268 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 269 | CLANG_WARN_EMPTY_BODY = YES; 270 | CLANG_WARN_ENUM_CONVERSION = YES; 271 | CLANG_WARN_INFINITE_RECURSION = YES; 272 | CLANG_WARN_INT_CONVERSION = YES; 273 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 274 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 275 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 276 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 277 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 278 | CLANG_WARN_STRICT_PROTOTYPES = YES; 279 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 280 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | CODE_SIGN_IDENTITY = "-"; 284 | CODE_SIGN_STYLE = Automatic; 285 | COMBINE_HIDPI_IMAGES = YES; 286 | CURRENT_PROJECT_VERSION = 1; 287 | DEBUG_INFORMATION_FORMAT = dwarf; 288 | DEFINES_MODULE = YES; 289 | DYLIB_COMPATIBILITY_VERSION = 1; 290 | DYLIB_CURRENT_VERSION = 1; 291 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 292 | ENABLE_STRICT_OBJC_MSGSEND = YES; 293 | ENABLE_TESTABILITY = YES; 294 | FRAMEWORK_VERSION = A; 295 | GCC_C_LANGUAGE_STANDARD = gnu11; 296 | GCC_DYNAMIC_NO_PIC = NO; 297 | GCC_NO_COMMON_BLOCKS = YES; 298 | GCC_OPTIMIZATION_LEVEL = 0; 299 | GCC_PREPROCESSOR_DEFINITIONS = ( 300 | "DEBUG=1", 301 | "$(inherited)", 302 | ); 303 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 304 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 305 | GCC_WARN_UNDECLARED_SELECTOR = YES; 306 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 307 | GCC_WARN_UNUSED_FUNCTION = YES; 308 | GCC_WARN_UNUSED_VARIABLE = YES; 309 | INFOPLIST_FILE = Info.plist; 310 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 311 | LD_RUNPATH_SEARCH_PATHS = ( 312 | "$(inherited)", 313 | "@executable_path/../Frameworks", 314 | "@loader_path/Frameworks", 315 | ); 316 | MACOSX_DEPLOYMENT_TARGET = 10.14; 317 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 318 | MTL_FAST_MATH = YES; 319 | ONLY_ACTIVE_ARCH = YES; 320 | PRODUCT_BUNDLE_IDENTIFIER = com.google.gtmloadtimer.GTMLoadTimer; 321 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 322 | SDKROOT = macosx; 323 | SKIP_INSTALL = YES; 324 | VERSIONING_SYSTEM = "apple-generic"; 325 | VERSION_INFO_PREFIX = ""; 326 | }; 327 | name = Debug; 328 | }; 329 | 8B05C9CF21E974F900E634D1 /* Release */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ALWAYS_SEARCH_USER_PATHS = NO; 333 | CLANG_ANALYZER_NONNULL = YES; 334 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 335 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 336 | CLANG_CXX_LIBRARY = "libc++"; 337 | CLANG_ENABLE_MODULES = YES; 338 | CLANG_ENABLE_OBJC_ARC = YES; 339 | CLANG_ENABLE_OBJC_WEAK = YES; 340 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 341 | CLANG_WARN_BOOL_CONVERSION = YES; 342 | CLANG_WARN_COMMA = YES; 343 | CLANG_WARN_CONSTANT_CONVERSION = YES; 344 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 345 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 346 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INFINITE_RECURSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 352 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 353 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 355 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 356 | CLANG_WARN_STRICT_PROTOTYPES = YES; 357 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 358 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 359 | CLANG_WARN_UNREACHABLE_CODE = YES; 360 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 361 | CODE_SIGN_IDENTITY = "-"; 362 | CODE_SIGN_STYLE = Automatic; 363 | COMBINE_HIDPI_IMAGES = YES; 364 | COPY_PHASE_STRIP = NO; 365 | CURRENT_PROJECT_VERSION = 1; 366 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 367 | DEFINES_MODULE = YES; 368 | DYLIB_COMPATIBILITY_VERSION = 1; 369 | DYLIB_CURRENT_VERSION = 1; 370 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 371 | ENABLE_NS_ASSERTIONS = NO; 372 | ENABLE_STRICT_OBJC_MSGSEND = YES; 373 | FRAMEWORK_VERSION = A; 374 | GCC_C_LANGUAGE_STANDARD = gnu11; 375 | GCC_NO_COMMON_BLOCKS = YES; 376 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 377 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 378 | GCC_WARN_UNDECLARED_SELECTOR = YES; 379 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 380 | GCC_WARN_UNUSED_FUNCTION = YES; 381 | GCC_WARN_UNUSED_VARIABLE = YES; 382 | INFOPLIST_FILE = Info.plist; 383 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 384 | LD_RUNPATH_SEARCH_PATHS = ( 385 | "$(inherited)", 386 | "@executable_path/../Frameworks", 387 | "@loader_path/Frameworks", 388 | ); 389 | MACOSX_DEPLOYMENT_TARGET = 10.14; 390 | MTL_ENABLE_DEBUG_INFO = NO; 391 | MTL_FAST_MATH = YES; 392 | PRODUCT_BUNDLE_IDENTIFIER = com.google.gtmloadtimer.GTMLoadTimer; 393 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 394 | SDKROOT = macosx; 395 | SKIP_INSTALL = YES; 396 | VERSIONING_SYSTEM = "apple-generic"; 397 | VERSION_INFO_PREFIX = ""; 398 | }; 399 | name = Release; 400 | }; 401 | 8B05C9D921E9759800E634D1 /* Debug */ = { 402 | isa = XCBuildConfiguration; 403 | buildSettings = { 404 | ALWAYS_SEARCH_USER_PATHS = NO; 405 | CLANG_ANALYZER_NONNULL = YES; 406 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 407 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 408 | CLANG_CXX_LIBRARY = "libc++"; 409 | CLANG_ENABLE_MODULES = YES; 410 | CLANG_ENABLE_OBJC_ARC = YES; 411 | CLANG_ENABLE_OBJC_WEAK = YES; 412 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 413 | CLANG_WARN_BOOL_CONVERSION = YES; 414 | CLANG_WARN_COMMA = YES; 415 | CLANG_WARN_CONSTANT_CONVERSION = YES; 416 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 417 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 418 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 419 | CLANG_WARN_EMPTY_BODY = YES; 420 | CLANG_WARN_ENUM_CONVERSION = YES; 421 | CLANG_WARN_INFINITE_RECURSION = YES; 422 | CLANG_WARN_INT_CONVERSION = YES; 423 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 424 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 425 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 426 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 427 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 428 | CLANG_WARN_STRICT_PROTOTYPES = YES; 429 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 430 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 431 | CLANG_WARN_UNREACHABLE_CODE = YES; 432 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 433 | CODE_SIGN_IDENTITY = "-"; 434 | CODE_SIGN_STYLE = Automatic; 435 | COMBINE_HIDPI_IMAGES = YES; 436 | CURRENT_PROJECT_VERSION = 1; 437 | DEBUG_INFORMATION_FORMAT = dwarf; 438 | DEFINES_MODULE = YES; 439 | DYLIB_COMPATIBILITY_VERSION = 1; 440 | DYLIB_CURRENT_VERSION = 1; 441 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 442 | ENABLE_STRICT_OBJC_MSGSEND = YES; 443 | ENABLE_TESTABILITY = YES; 444 | FRAMEWORK_VERSION = A; 445 | GCC_C_LANGUAGE_STANDARD = gnu11; 446 | GCC_DYNAMIC_NO_PIC = NO; 447 | GCC_NO_COMMON_BLOCKS = YES; 448 | GCC_OPTIMIZATION_LEVEL = 0; 449 | GCC_PREPROCESSOR_DEFINITIONS = ( 450 | "DEBUG=1", 451 | "$(inherited)", 452 | ); 453 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 454 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 455 | GCC_WARN_UNDECLARED_SELECTOR = YES; 456 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 457 | GCC_WARN_UNUSED_FUNCTION = YES; 458 | GCC_WARN_UNUSED_VARIABLE = YES; 459 | INFOPLIST_FILE = Info.plist; 460 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 461 | LD_RUNPATH_SEARCH_PATHS = ( 462 | "$(inherited)", 463 | "@executable_path/../Frameworks", 464 | "@loader_path/Frameworks", 465 | ); 466 | MACOSX_DEPLOYMENT_TARGET = 10.14; 467 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 468 | MTL_FAST_MATH = YES; 469 | ONLY_ACTIVE_ARCH = YES; 470 | PRODUCT_BUNDLE_IDENTIFIER = com.google.gtmloadtimer.GTMLoadTimer; 471 | PRODUCT_NAME = "$(TARGET_NAME)"; 472 | SDKROOT = iphoneos; 473 | SKIP_INSTALL = YES; 474 | VERSIONING_SYSTEM = "apple-generic"; 475 | VERSION_INFO_PREFIX = ""; 476 | }; 477 | name = Debug; 478 | }; 479 | 8B05C9DA21E9759800E634D1 /* Release */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ALWAYS_SEARCH_USER_PATHS = NO; 483 | CLANG_ANALYZER_NONNULL = YES; 484 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 485 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 486 | CLANG_CXX_LIBRARY = "libc++"; 487 | CLANG_ENABLE_MODULES = YES; 488 | CLANG_ENABLE_OBJC_ARC = YES; 489 | CLANG_ENABLE_OBJC_WEAK = YES; 490 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 491 | CLANG_WARN_BOOL_CONVERSION = YES; 492 | CLANG_WARN_COMMA = YES; 493 | CLANG_WARN_CONSTANT_CONVERSION = YES; 494 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 495 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 496 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 497 | CLANG_WARN_EMPTY_BODY = YES; 498 | CLANG_WARN_ENUM_CONVERSION = YES; 499 | CLANG_WARN_INFINITE_RECURSION = YES; 500 | CLANG_WARN_INT_CONVERSION = YES; 501 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 502 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 503 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 504 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 505 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 506 | CLANG_WARN_STRICT_PROTOTYPES = YES; 507 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 508 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 509 | CLANG_WARN_UNREACHABLE_CODE = YES; 510 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 511 | CODE_SIGN_IDENTITY = "-"; 512 | CODE_SIGN_STYLE = Automatic; 513 | COMBINE_HIDPI_IMAGES = YES; 514 | COPY_PHASE_STRIP = NO; 515 | CURRENT_PROJECT_VERSION = 1; 516 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 517 | DEFINES_MODULE = YES; 518 | DYLIB_COMPATIBILITY_VERSION = 1; 519 | DYLIB_CURRENT_VERSION = 1; 520 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 521 | ENABLE_NS_ASSERTIONS = NO; 522 | ENABLE_STRICT_OBJC_MSGSEND = YES; 523 | FRAMEWORK_VERSION = A; 524 | GCC_C_LANGUAGE_STANDARD = gnu11; 525 | GCC_NO_COMMON_BLOCKS = YES; 526 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 527 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 528 | GCC_WARN_UNDECLARED_SELECTOR = YES; 529 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 530 | GCC_WARN_UNUSED_FUNCTION = YES; 531 | GCC_WARN_UNUSED_VARIABLE = YES; 532 | INFOPLIST_FILE = Info.plist; 533 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 534 | LD_RUNPATH_SEARCH_PATHS = ( 535 | "$(inherited)", 536 | "@executable_path/../Frameworks", 537 | "@loader_path/Frameworks", 538 | ); 539 | MACOSX_DEPLOYMENT_TARGET = 10.14; 540 | MTL_ENABLE_DEBUG_INFO = NO; 541 | MTL_FAST_MATH = YES; 542 | PRODUCT_BUNDLE_IDENTIFIER = com.google.gtmloadtimer.GTMLoadTimer; 543 | PRODUCT_NAME = "$(TARGET_NAME)"; 544 | SDKROOT = iphoneos; 545 | SKIP_INSTALL = YES; 546 | VERSIONING_SYSTEM = "apple-generic"; 547 | VERSION_INFO_PREFIX = ""; 548 | }; 549 | name = Release; 550 | }; 551 | /* End XCBuildConfiguration section */ 552 | 553 | /* Begin XCConfigurationList section */ 554 | 8B05C9B821E96EED00E634D1 /* Build configuration list for PBXProject "GTMLoadTimer" */ = { 555 | isa = XCConfigurationList; 556 | buildConfigurations = ( 557 | 8B05C9B621E96EED00E634D1 /* Debug */, 558 | 8B05C9B721E96EED00E634D1 /* Release */, 559 | ); 560 | defaultConfigurationIsVisible = 0; 561 | defaultConfigurationName = Release; 562 | }; 563 | 8B05C9C021E96EEE00E634D1 /* Build configuration list for PBXNativeTarget "Instrument" */ = { 564 | isa = XCConfigurationList; 565 | buildConfigurations = ( 566 | 8B05C9C121E96EEE00E634D1 /* Debug */, 567 | 8B05C9C221E96EEE00E634D1 /* Release */, 568 | ); 569 | defaultConfigurationIsVisible = 0; 570 | defaultConfigurationName = Release; 571 | }; 572 | 8B05C9CD21E974F900E634D1 /* Build configuration list for PBXNativeTarget "GTMLoadTimer-macOS" */ = { 573 | isa = XCConfigurationList; 574 | buildConfigurations = ( 575 | 8B05C9CE21E974F900E634D1 /* Debug */, 576 | 8B05C9CF21E974F900E634D1 /* Release */, 577 | ); 578 | defaultConfigurationIsVisible = 0; 579 | defaultConfigurationName = Release; 580 | }; 581 | 8B05C9D821E9759800E634D1 /* Build configuration list for PBXNativeTarget "GTMLoadTimer-iOS" */ = { 582 | isa = XCConfigurationList; 583 | buildConfigurations = ( 584 | 8B05C9D921E9759800E634D1 /* Debug */, 585 | 8B05C9DA21E9759800E634D1 /* Release */, 586 | ); 587 | defaultConfigurationIsVisible = 0; 588 | defaultConfigurationName = Release; 589 | }; 590 | /* End XCConfigurationList section */ 591 | }; 592 | rootObject = 8B05C9B521E96EED00E634D1 /* Project object */; 593 | } 594 | --------------------------------------------------------------------------------