Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: build/config/mac/rules.gni

Issue 1918263002: [iOS/Mac/GN] Split out common iOS and Mac rules into base_rules.gni. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do'h, SDK path Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « build/config/mac/base_rules.gni ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/config/mac/base_rules.gni")
6 import("//build/config/mac/mac_sdk.gni")
7
8 # The base template used to generate Info.plist files for iOS and Mac apps and
9 # frameworks.
10 #
11 # Arguments
12 #
13 # plist_templates:
14 # string array, paths to plist files which will be used for the bundle.
15 #
16 # executable_name:
17 # string, name of the generated target used for the product
18 # and executable name as specified in the output Info.plist.
19 #
20 # extra_substitutions:
21 # (optional) string array, 'key=value' pairs for extra fields which are
22 # specified in a source Info.plist template.
23 template("info_plist") {
24 assert(defined(invoker.plist_templates),
25 "A list of template plist files must be specified for $target_name")
26 assert(defined(invoker.executable_name),
27 "The executable_name must be specified for $target_name")
28 executable_name = invoker.executable_name
29
30 action(target_name) {
31 script = "//build/config/mac/gen_plist.py"
32 sources = invoker.plist_templates
33 outputs = [
34 "$target_gen_dir/$target_name.plist",
35 ]
36 extra_args = []
37 if (defined(invoker.extra_substitutions)) {
38 foreach(substitution, invoker.extra_substitutions) {
39 extra_args += [ "-s=$substitution" ]
40 }
41 }
42 response_file_contents =
43 extra_args + [
44 "-s=BUILD_MACHINE_OS_BUILD=$machine_os_build",
45 "-s=EXECUTABLE_NAME=$executable_name",
46 "-s=GCC_VERSION=com.apple.compilers.llvm.clang.1_0",
47 "-s=PRODUCT_NAME=$executable_name",
48 "-s=XCODE_BUILD=$xcode_build",
49 "-s=XCODE_VERSION=$xcode_version",
50 "-o=" + rebase_path(outputs[0], root_build_dir),
51 ] + rebase_path(sources, root_build_dir)
52 args = [ "@{{response_file_name}}" ]
53 }
54 }
55 6
56 # Generates Info.plist files for Mac apps and frameworks. 7 # Generates Info.plist files for Mac apps and frameworks.
57 # 8 #
58 # Arguments 9 # Arguments
59 # 10 #
60 # info_plist: 11 # info_plist:
61 # string, the path to an plist file that will be included in the final 12 # string, the path to an plist file that will be included in the final
62 # Info.plist generated. 13 # Info.plist generated.
63 # 14 #
64 # executable_name: 15 # executable_name:
(...skipping 14 matching lines...) Expand all
79 "MAC_SDK_NAME=$mac_sdk_name$mac_sdk_version", 30 "MAC_SDK_NAME=$mac_sdk_name$mac_sdk_version",
80 ] 31 ]
81 plist_templates = [ 32 plist_templates = [
82 "//build/config/mac/BuildInfo.plist", 33 "//build/config/mac/BuildInfo.plist",
83 invoker.info_plist, 34 invoker.info_plist,
84 ] 35 ]
85 forward_variables_from(invoker, [ "executable_name" ]) 36 forward_variables_from(invoker, [ "executable_name" ])
86 } 37 }
87 } 38 }
88 39
89 # This is used as the base template for both iOS and Mac frameworks.
90 #
91 # By default, the bundle target this template generates does not link the
92 # resulting framework into anything that depends on it. If a dependency wants
93 # a link-time (as well as build-time) dependency on the framework bundle,
94 # depend against "$target_name+link". If only the build-time dependency is
95 # required (e.g., for copying into another bundle), then use "$target_name".
96 #
97 # Arguments
98 #
99 # output_name:
100 # (optional) string, name of the generated framework without the
101 # .framework suffix. If omitted, defaults to target_name.
102 #
103 # framework_version:
104 # (optional) string, version of the framework. Typically this is a
105 # single letter, like "A". If omitted, the Versions/ subdirectory
106 # structure will not be created, and build output will go directly
107 # into the framework subdirectory.
108 #
109 # This template provides two targets for the resulting framework bundle. The
110 # link-time behavior varies depending on which of the two targets below is
111 # added as a dependency:
112 # - $target_name only adds a build-time dependency. Targets that depend on
113 # it will not link against the framework.
114 # - $target_name+link adds a build-time and link-time dependency. Targets
115 # that depend on it will link against the framework.
116 #
117 # The build-time-only dependency is used for when a target needs to use the
118 # framework either only for resources, or because the target loads it at run-
119 # time, via dlopen() or NSBundle. The link-time dependency will cause the
120 # dependee to have the framework loaded by dyld at launch.
121 #
122 # Example of build-time only dependency:
123 #
124 # framework_bundle("CoreTeleportation") {
125 # sources = [ ... ]
126 # }
127 #
128 # bundle_data("core_teleportation_bundle_data") {
129 # deps = [ ":CoreTeleportation" ]
130 # sources = [ "$root_out_dir/CoreTeleportation.framework" ]
131 # outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ]
132 # }
133 #
134 # app_bundle("GoatTeleporter") {
135 # sources = [ ... ]
136 # deps = [
137 # ":core_teleportation_bundle_data",
138 # ]
139 # }
140 #
141 # The GoatTeleporter.app will not directly link against
142 # CoreTeleportation.framework, but it will be included in the bundle's
143 # Frameworks directory.
144 #
145 # Example of link-time dependency:
146 #
147 # framework_bundle("CoreTeleportation") {
148 # sources = [ ... ]
149 # ldflags = [
150 # "-install_name",
151 # "@executable_path/../Frameworks/$target_name.framework"
152 # ]
153 # }
154 #
155 # bundle_data("core_teleportation_bundle_data") {
156 # deps = [ ":CoreTeleportation+link" ]
157 # sources = [ "$root_out_dir/CoreTeleportation.framework" ]
158 # outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ]
159 # }
160 #
161 # app_bundle("GoatTeleporter") {
162 # sources = [ ... ]
163 # deps = [
164 # ":core_teleportation_bundle_data",
165 # ]
166 # }
167 #
168 # Note that the framework is still copied to the app's bundle, but dyld will
169 # load this library when the app is launched because it uses the "+link"
170 # target as a dependency. This also requires that the framework set its
171 # install_name so that dyld can locate it.
172 #
173 # See "gn help shared_library" for more information on arguments supported
174 # by shared library target.
175 template("framework_bundle") {
176 _target_name = target_name
177 _output_name = target_name
178 if (defined(invoker.output_name)) {
179 _output_name = invoker.output_name
180 }
181
182 # If the framework is unversioned, the final _target_name will be the
183 # create_bundle(_framework_target), otherwise an action with the name
184 # _target_name will depends on the the create_bundle() in order to prepare
185 # the versioned directory structure.
186 _framework_target = _target_name
187 _framework_name = _output_name + ".framework"
188 _framework_root_dir = "$root_out_dir/$_framework_name"
189 if (defined(invoker.framework_version) && invoker.framework_version != "") {
190 _framework_version = invoker.framework_version
191 _framework_root_dir += "/Versions/$_framework_version"
192 _framework_target = _target_name + "_create_bundle"
193 }
194
195 _shared_library_target = target_name + "_shared_library"
196 _shared_library_bundle_data = _shared_library_target + "_bundle_data"
197
198 shared_library(_shared_library_target) {
199 visibility = [ ":$_shared_library_bundle_data" ]
200 forward_variables_from(invoker,
201 "*",
202 [
203 "assert_no_deps",
204 "data_deps",
205 "info_plist",
206 "output_name",
207 "visibility",
208 ])
209 output_name = _output_name
210 output_prefix_override = true
211 output_extension = ""
212 output_dir = "$target_out_dir/$_shared_library_target"
213 }
214
215 bundle_data(_shared_library_bundle_data) {
216 visibility = [ ":$_framework_target" ]
217 forward_variables_from(invoker, [ "testonly" ])
218 sources = [
219 "$target_out_dir/$_shared_library_target/$_output_name",
220 ]
221 outputs = [
222 "{{bundle_executable_dir}}/$_output_name",
223 ]
224 public_deps = [
225 ":$_shared_library_target",
226 ]
227 }
228
229 _framework_public_config = _target_name + "_public_config"
230 config(_framework_public_config) {
231 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs
232 # and include_dirs to avoid duplicate values on the command-line.
233 visibility = [ ":$_framework_target" ]
234 ldflags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ]
235 lib_dirs = [ root_out_dir ]
236 libs = [ _framework_name ]
237 }
238
239 create_bundle(_framework_target) {
240 forward_variables_from(invoker,
241 [
242 "data_deps",
243 "deps",
244 "public_deps",
245 "testonly",
246 ])
247
248 if (defined(_framework_version)) {
249 visibility = [ ":$_target_name" ]
250 } else {
251 if (defined(invoker.visibility)) {
252 visibility = invoker.visibility
253 visibility += [ ":$_target_name+link" ]
254 }
255 }
256
257 if (!defined(public_deps)) {
258 public_deps = []
259 }
260 public_deps += [ ":$_shared_library_bundle_data" ]
261
262 bundle_root_dir = _framework_root_dir
263 bundle_resources_dir = "$bundle_root_dir/Resources"
264 bundle_executable_dir = "$bundle_root_dir"
265 }
266
267 if (defined(_framework_version)) {
268 action(_target_name) {
269 forward_variables_from(invoker, [ "testonly" ])
270
271 if (defined(invoker.visibility)) {
272 visibility = invoker.visibility
273 visibility += [ ":$_target_name+link" ]
274 }
275
276 script = "$root_out_dir/gyp-mac-tool"
277 outputs = [
278 "$root_out_dir/$_framework_name/Versions/Current",
279 ]
280 args = [
281 "package-framework",
282 "$_framework_name",
283 "$_framework_version",
284 ]
285 public_deps = [
286 ":$_framework_target",
287 ]
288 }
289 }
290
291 group(_target_name + "+link") {
292 forward_variables_from(invoker,
293 [
294 "visibility",
295 "testonly",
296 ])
297 public_deps = [
298 ":$_target_name",
299 ]
300 public_configs = [ ":$_framework_public_config" ]
301 }
302 }
303
304 # Template to combile .xib or .storyboard files.
305 #
306 #
307 # Arguments
308 #
309 # sources:
310 # list of string, sources to compile
311 #
312 # ibtool_flags:
313 # (optional) list of string, additional flags to pass to the ibtool
314 template("compile_xibs") {
315 action_foreach(target_name) {
316 forward_variables_from(invoker,
317 [
318 "testonly",
319 "visibility",
320 ])
321 assert(defined(invoker.sources),
322 "Sources must be specified for $target_name")
323
324 ibtool_flags = []
325 if (defined(invoker.ibtool_flags)) {
326 ibtool_flags = invoker.ibtool_flags
327 }
328
329 script = "//build/config/mac/compile_xib.py"
330 sources = invoker.sources
331 outputs = [
332 "$target_gen_dir/{{source_name_part}}.nib",
333 ]
334 args = [
335 "--input",
336 "{{source}}",
337 "--output",
338 rebase_path("$target_gen_dir/{{source_name_part}}.nib"),
339 ] + ibtool_flags
340 }
341 }
342
343 # Template to compile and package Mac XIB files as bundle data. 40 # Template to compile and package Mac XIB files as bundle data.
344 # 41 #
345 # Arguments 42 # Arguments
346 # 43 #
347 # sources: 44 # sources:
348 # list of string, sources to comiple 45 # list of string, sources to comiple
349 # 46 #
350 # output_path: 47 # output_path:
351 # (optional) string, the path to use for the outputs list in the 48 # (optional) string, the path to use for the outputs list in the
352 # bundle_data step. If unspecified, defaults to bundle_resources_dir. 49 # bundle_data step. If unspecified, defaults to bundle_resources_dir.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 ] 85 ]
389 } 86 }
390 } 87 }
391 88
392 # Template to package a shared library into a Mac framework bundle. 89 # Template to package a shared library into a Mac framework bundle.
393 # 90 #
394 # This template provides two targets to control whether the framework is 91 # This template provides two targets to control whether the framework is
395 # merely built when targets depend on it, or whether it is linked as well: 92 # merely built when targets depend on it, or whether it is linked as well:
396 # "$target_name" and "$target_name+link". 93 # "$target_name" and "$target_name+link".
397 # 94 #
398 # See the //build/config/mac/rules.gni:framework_bundle for a discussion 95 # See the //build/config/mac/base_rules.gni:framework_bundle for a discussion
399 # and examples. 96 # and examples.
400 # 97 #
401 # Arguments 98 # Arguments
402 # 99 #
403 # info_plist: 100 # info_plist:
404 # string, path to the Info.plist file that will be used for the bundle. 101 # string, path to the Info.plist file that will be used for the bundle.
405 # 102 #
406 # output_name: 103 # output_name:
407 # (optional) string, name of the generated framework without the 104 # (optional) string, name of the generated framework without the
408 # .framework suffix. If omitted, defaults to target_name. 105 # .framework suffix. If omitted, defaults to target_name.
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 ]) 301 ])
605 if (!defined(deps)) { 302 if (!defined(deps)) {
606 deps = [] 303 deps = []
607 } 304 }
608 deps += [ ":$_loadable_module_bundle_data" ] 305 deps += [ ":$_loadable_module_bundle_data" ]
609 306
610 bundle_root_dir = "$root_out_dir/$_output_name.plugin/Contents" 307 bundle_root_dir = "$root_out_dir/$_output_name.plugin/Contents"
611 bundle_executable_dir = "$bundle_root_dir/MacOS" 308 bundle_executable_dir = "$bundle_root_dir/MacOS"
612 } 309 }
613 } 310 }
OLDNEW
« no previous file with comments | « build/config/mac/base_rules.gni ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698