OLD | NEW |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import("//build/toolchain/toolchain.gni") | 5 import("//build/toolchain/toolchain.gni") |
6 import("//build/config/mac/mac_sdk.gni") | 6 import("//build/config/mac/mac_sdk.gni") |
7 | 7 |
8 # This is used as the base template for both iOS and Mac frameworks.. | 8 # This is used as the base template for both iOS and Mac frameworks.. |
9 # | 9 # |
| 10 # By default, the bundle target this template generates does not link the |
| 11 # resulting framework into anything that depends on it. If a dependency wants |
| 12 # a link-time (as well as build-time) dependency on the framework bundle, |
| 13 # depend against "$target_name+link". If only the build-time dependency is |
| 14 # required (e.g., for copying into another bundle), then use "$target_name". |
| 15 # |
10 # Arguments | 16 # Arguments |
11 # | 17 # |
12 # output_name: | 18 # output_name: |
13 # (optional) string, name of the generated framework without the | 19 # (optional) string, name of the generated framework without the |
14 # .framework suffix. If omitted, defaults to target_name. | 20 # .framework suffix. If omitted, defaults to target_name. |
15 # | 21 # |
16 # framework_version: | 22 # framework_version: |
17 # (optional) string, version of the framework. Typically this is a | 23 # (optional) string, version of the framework. Typically this is a |
18 # single letter, like "A". If omitted, the Versions/ subdirectory | 24 # single letter, like "A". If omitted, the Versions/ subdirectory |
19 # structure will not be created, and build output will go directly | 25 # structure will not be created, and build output will go directly |
20 # into the framework subdirectory. | 26 # into the framework subdirectory. |
21 # | 27 # |
| 28 # This template provides two targets for the resulting framework bundle. The |
| 29 # link-time behavior varies depending on which of the two targets below is |
| 30 # added as a dependency: |
| 31 # - $target_name only adds a build-time dependency. Targets that depend on |
| 32 # it will not link against the framework. |
| 33 # - $target_name+link adds a build-time and link-time dependency. Targets |
| 34 # that depend on it will link against the framework. |
| 35 # |
| 36 # The build-time-only dependency is used for when a target needs to use the |
| 37 # framework either only for resources, or because the target loads it at run- |
| 38 # time, via dlopen() or NSBundle. The link-time dependency will cause the |
| 39 # dependee to have the framework loaded by dyld at launch. |
| 40 # |
| 41 # Example of build-time only dependency: |
| 42 # |
| 43 # framework_bundle("CoreTeleportation") { |
| 44 # sources = [ ... ] |
| 45 # } |
| 46 # |
| 47 # bundle_data("core_teleportation_bundle_data") { |
| 48 # deps = [ ":CoreTeleportation" ] |
| 49 # sources = [ "$root_out_dir/CoreTeleportation.framework" ] |
| 50 # outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ] |
| 51 # } |
| 52 # |
| 53 # app_bundle("GoatTeleporter") { |
| 54 # sources = [ ... ] |
| 55 # deps = [ |
| 56 # ":core_teleportation_bundle_data", |
| 57 # ] |
| 58 # } |
| 59 # |
| 60 # The GoatTeleporter.app will not directly link against |
| 61 # CoreTeleportation.framework, but it will be included in the bundle's |
| 62 # Frameworks directory. |
| 63 # |
| 64 # Example of link-time dependency: |
| 65 # |
| 66 # framework_bundle("CoreTeleportation") { |
| 67 # sources = [ ... ] |
| 68 # ldflags = [ |
| 69 # "-install_name", |
| 70 # "@executable_path/../Frameworks/$target_name.framework" |
| 71 # ] |
| 72 # } |
| 73 # |
| 74 # bundle_data("core_teleportation_bundle_data") { |
| 75 # deps = [ ":CoreTeleportation+link" ] |
| 76 # sources = [ "$root_out_dir/CoreTeleportation.framework" ] |
| 77 # outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ] |
| 78 # } |
| 79 # |
| 80 # app_bundle("GoatTeleporter") { |
| 81 # sources = [ ... ] |
| 82 # deps = [ |
| 83 # ":core_teleportation_bundle_data", |
| 84 # ] |
| 85 # } |
| 86 # |
| 87 # Note that the framework is still copied to the app's bundle, but dyld will |
| 88 # load this library when the app is launched because it uses the "+link" |
| 89 # target as a dependency. This also requires that the framework set its |
| 90 # install_name so that dyld can locate it. |
| 91 # |
22 # See "gn help shared_library" for more information on arguments supported | 92 # See "gn help shared_library" for more information on arguments supported |
23 # by shared library target. | 93 # by shared library target. |
24 template("framework_bundle") { | 94 template("framework_bundle") { |
25 _target_name = target_name | 95 _target_name = target_name |
26 _output_name = target_name | 96 _output_name = target_name |
27 if (defined(invoker.output_name)) { | 97 if (defined(invoker.output_name)) { |
28 _output_name = invoker.output_name | 98 _output_name = invoker.output_name |
29 } | 99 } |
30 | 100 |
31 # If the framework is unversionned, the final _target_name will be the | 101 # If the framework is unversionned, the final _target_name will be the |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 public_deps = [ | 143 public_deps = [ |
74 ":$_shared_library_target", | 144 ":$_shared_library_target", |
75 ] | 145 ] |
76 } | 146 } |
77 | 147 |
78 _framework_public_config = _target_name + "_public_config" | 148 _framework_public_config = _target_name + "_public_config" |
79 config(_framework_public_config) { | 149 config(_framework_public_config) { |
80 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs | 150 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs |
81 # and include_dirs to avoid duplicate values on the command-line. | 151 # and include_dirs to avoid duplicate values on the command-line. |
82 visibility = [ ":$_framework_target" ] | 152 visibility = [ ":$_framework_target" ] |
83 common_flags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ] | 153 ldflags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ] |
84 cflags_objc = common_flags | |
85 cflags_objcc = common_flags | |
86 ldflags = common_flags | |
87 lib_dirs = [ root_out_dir ] | 154 lib_dirs = [ root_out_dir ] |
88 libs = [ _framework_name ] | 155 libs = [ _framework_name ] |
89 } | 156 } |
90 | 157 |
91 create_bundle(_framework_target) { | 158 create_bundle(_framework_target) { |
92 forward_variables_from(invoker, | 159 forward_variables_from(invoker, |
93 [ | 160 [ |
94 "data_deps", | 161 "data_deps", |
95 "deps", | 162 "deps", |
96 "public_deps", | 163 "public_deps", |
97 "testonly", | 164 "testonly", |
98 ]) | 165 ]) |
99 | 166 |
100 if (defined(_framework_version)) { | 167 if (defined(_framework_version)) { |
101 visibility = [ ":$_target_name" ] | 168 visibility = [ ":$_target_name" ] |
102 } else { | 169 } else { |
103 forward_variables_from(invoker, [ "visibility" ]) | 170 if (defined(invoker.visibility)) { |
| 171 visibility = invoker.visibility |
| 172 visibility += [ ":$_target_name+link" ] |
| 173 } |
104 } | 174 } |
105 | 175 |
106 if (!defined(public_deps)) { | 176 if (!defined(public_deps)) { |
107 public_deps = [] | 177 public_deps = [] |
108 } | 178 } |
109 public_deps += [ ":$_shared_library_bundle_data" ] | 179 public_deps += [ ":$_shared_library_bundle_data" ] |
110 | 180 |
111 public_configs = [ ":$_framework_public_config" ] | |
112 | |
113 bundle_root_dir = _framework_root_dir | 181 bundle_root_dir = _framework_root_dir |
114 bundle_resources_dir = "$bundle_root_dir/Resources" | 182 bundle_resources_dir = "$bundle_root_dir/Resources" |
115 bundle_executable_dir = "$bundle_root_dir" | 183 bundle_executable_dir = "$bundle_root_dir" |
116 } | 184 } |
117 | 185 |
118 if (defined(_framework_version)) { | 186 if (defined(_framework_version)) { |
119 action(_target_name) { | 187 action(_target_name) { |
120 forward_variables_from(invoker, | 188 forward_variables_from(invoker, [ "testonly" ]) |
121 [ | 189 |
122 "visibility", | 190 if (defined(invoker.visibility)) { |
123 "testonly", | 191 visibility = invoker.visibility |
124 ]) | 192 visibility += [ ":$_target_name+link" ] |
| 193 } |
| 194 |
125 script = "$root_out_dir/gyp-mac-tool" | 195 script = "$root_out_dir/gyp-mac-tool" |
126 outputs = [ | 196 outputs = [ |
127 "$root_out_dir/$_framework_name/Versions/Current", | 197 "$root_out_dir/$_framework_name/Versions/Current", |
128 ] | 198 ] |
129 args = [ | 199 args = [ |
130 "package-framework", | 200 "package-framework", |
131 "$_framework_name", | 201 "$_framework_name", |
132 "$_framework_version", | 202 "$_framework_version", |
133 ] | 203 ] |
134 public_deps = [ | 204 public_deps = [ |
135 ":$_framework_target", | 205 ":$_framework_target", |
136 ] | 206 ] |
137 } | 207 } |
138 } | 208 } |
| 209 |
| 210 group(_target_name + "+link") { |
| 211 forward_variables_from(invoker, |
| 212 [ |
| 213 "visibility", |
| 214 "testonly", |
| 215 ]) |
| 216 public_deps = [ |
| 217 ":$_target_name", |
| 218 ] |
| 219 public_configs = [ ":$_framework_public_config" ] |
| 220 } |
139 } | 221 } |
140 | 222 |
141 # Template to combile .xib or .storyboard files. | 223 # Template to combile .xib or .storyboard files. |
142 # | 224 # |
143 # | 225 # |
144 # Arguments | 226 # Arguments |
145 # | 227 # |
146 # sources: | 228 # sources: |
147 # list of string, sources to compile | 229 # list of string, sources to compile |
148 # | 230 # |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 } | 303 } |
222 | 304 |
223 outputs = [ | 305 outputs = [ |
224 "$_output_path/{{source_file_part}}", | 306 "$_output_path/{{source_file_part}}", |
225 ] | 307 ] |
226 } | 308 } |
227 } | 309 } |
228 | 310 |
229 # Template to package a shared library into a Mac framework bundle. | 311 # Template to package a shared library into a Mac framework bundle. |
230 # | 312 # |
| 313 # This template provides two targets to control whether the framework is |
| 314 # merely built when targets depend on it, or whether it is linked as well: |
| 315 # "$target_name" and "$target_name+link". |
| 316 # |
| 317 # See the //build/config/mac/rules.gni:framework_bundle for a discussion |
| 318 # and examples. |
| 319 # |
231 # Arguments | 320 # Arguments |
232 # | 321 # |
233 # info_plist: | 322 # info_plist: |
234 # string, path to the Info.plist file that will be used for the bundle. | 323 # string, path to the Info.plist file that will be used for the bundle. |
235 # | 324 # |
236 # output_name: | 325 # output_name: |
237 # (optional) string, name of the generated framework without the | 326 # (optional) string, name of the generated framework without the |
238 # .framework suffix. If omitted, defaults to target_name. | 327 # .framework suffix. If omitted, defaults to target_name. |
239 # | 328 # |
240 # framework_version: | 329 # framework_version: |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 ]) | 512 ]) |
424 if (!defined(deps)) { | 513 if (!defined(deps)) { |
425 deps = [] | 514 deps = [] |
426 } | 515 } |
427 deps += [ ":$_loadable_module_bundle_data" ] | 516 deps += [ ":$_loadable_module_bundle_data" ] |
428 | 517 |
429 bundle_root_dir = "$root_out_dir/$_output_name.plugin/Contents" | 518 bundle_root_dir = "$root_out_dir/$_output_name.plugin/Contents" |
430 bundle_executable_dir = "$bundle_root_dir/MacOS" | 519 bundle_executable_dir = "$bundle_root_dir/MacOS" |
431 } | 520 } |
432 } | 521 } |
OLD | NEW |