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

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

Issue 2487763002: [Mac/GN] Re-do framework packaging to fix framework versioning. (Closed)
Patch Set: address comments Created 4 years, 1 month 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/package_framework.py ('k') | chrome/BUILD.gn » ('j') | 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/config/mac/base_rules.gni") 5 import("//build/config/mac/base_rules.gni")
6 6
7 # Generates Info.plist files for Mac apps and frameworks. 7 # Generates Info.plist files for Mac apps and frameworks.
8 # 8 #
9 # Arguments 9 # Arguments
10 # 10 #
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 # output_name: 136 # output_name:
137 # (optional) string, name of the generated framework without the 137 # (optional) string, name of the generated framework without the
138 # .framework suffix. If omitted, defaults to target_name. 138 # .framework suffix. If omitted, defaults to target_name.
139 # 139 #
140 # framework_version: 140 # framework_version:
141 # (optional) string, version of the framework. Typically this is a 141 # (optional) string, version of the framework. Typically this is a
142 # single letter, like "A". If omitted, the Versions/ subdirectory 142 # single letter, like "A". If omitted, the Versions/ subdirectory
143 # structure will not be created, and build output will go directly 143 # structure will not be created, and build output will go directly
144 # into the framework subdirectory. 144 # into the framework subdirectory.
145 # 145 #
146 # framework_contents:
147 # (optional) list of string, top-level items in the framework. For
148 # frameworks with a framework_version, this is the list of symlinks to
149 # create in the .framework directory that link into Versions/Current/.
150 #
146 # extra_substitutions: 151 # extra_substitutions:
147 # (optional) string array, 'key=value' pairs for extra fields which are 152 # (optional) string array, 'key=value' pairs for extra fields which are
148 # specified in a source Info.plist template. 153 # specified in a source Info.plist template.
149 # 154 #
150 # This template provides two targets for the resulting framework bundle. The 155 # This template provides two targets for the resulting framework bundle. The
151 # link-time behavior varies depending on which of the two targets below is 156 # link-time behavior varies depending on which of the two targets below is
152 # added as a dependency: 157 # added as a dependency:
153 # - $target_name only adds a build-time dependency. Targets that depend on 158 # - $target_name only adds a build-time dependency. Targets that depend on
154 # it will not link against the framework. 159 # it will not link against the framework.
155 # - $target_name+link adds a build-time and link-time dependency. Targets 160 # - $target_name+link adds a build-time and link-time dependency. Targets
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 # Note that the framework is still copied to the app's bundle, but dyld will 214 # Note that the framework is still copied to the app's bundle, but dyld will
210 # load this library when the app is launched because it uses the "+link" 215 # load this library when the app is launched because it uses the "+link"
211 # target as a dependency. This also requires that the framework set its 216 # target as a dependency. This also requires that the framework set its
212 # install_name so that dyld can locate it. 217 # install_name so that dyld can locate it.
213 # 218 #
214 # See "gn help shared_library" for more information on arguments supported 219 # See "gn help shared_library" for more information on arguments supported
215 # by shared library target. 220 # by shared library target.
216 template("mac_framework_bundle") { 221 template("mac_framework_bundle") {
217 assert(defined(invoker.deps), 222 assert(defined(invoker.deps),
218 "Dependencies must be specified for $target_name") 223 "Dependencies must be specified for $target_name")
224 assert(!defined(invoker.framework_contents) ||
225 defined(invoker.framework_version),
226 "framework_contents requres a versioned framework")
219 227
220 _info_plist_target = target_name + "_info_plist" 228 _info_plist_target = target_name + "_info_plist"
221 229
222 mac_info_plist(_info_plist_target) { 230 mac_info_plist(_info_plist_target) {
223 executable_name = target_name 231 executable_name = target_name
224 if (defined(invoker.output_name)) { 232 if (defined(invoker.output_name)) {
225 executable_name = invoker.output_name 233 executable_name = invoker.output_name
226 } 234 }
227 forward_variables_from(invoker, 235 forward_variables_from(invoker,
228 [ 236 [
(...skipping 16 matching lines...) Expand all
245 ":$_info_plist_target", 253 ":$_info_plist_target",
246 ] 254 ]
247 } 255 }
248 256
249 _target_name = target_name 257 _target_name = target_name
250 _output_name = target_name 258 _output_name = target_name
251 if (defined(invoker.output_name)) { 259 if (defined(invoker.output_name)) {
252 _output_name = invoker.output_name 260 _output_name = invoker.output_name
253 } 261 }
254 262
255 # If the framework is unversioned, the final _target_name will be the 263 # Create a file to track the build dependency on the framework_version and
256 # create_bundle(_framework_target), otherwise an action with the name 264 # framework_contents variables.
257 # _target_name will depends on the the create_bundle() in order to prepare 265 _framework_toc = []
258 # the versioned directory structure. 266 if (defined(invoker.framework_version)) {
267 _framework_toc += [
268 "Version=" + invoker.framework_version,
269 _output_name,
270 ]
271 _framework_contents = [ _output_name ]
272 }
273 if (defined(invoker.framework_contents)) {
274 _framework_toc += invoker.framework_contents
275 _framework_contents += invoker.framework_contents
276 }
277 _framework_toc_file = "$target_out_dir/${target_name}.toc"
278 write_file(_framework_toc_file, _framework_toc)
279
280 # Create local variables for referencing different parts of the bundle.
259 _framework_target = _target_name 281 _framework_target = _target_name
260 _framework_name = _output_name + ".framework" 282 _framework_name = _output_name + ".framework"
261 _framework_base_dir = "$root_out_dir/$_framework_name" 283 _framework_base_dir = "$root_out_dir/$_framework_name"
262 if (defined(invoker.framework_version) && invoker.framework_version != "") { 284 if (defined(invoker.framework_version) && invoker.framework_version != "") {
263 _framework_version = invoker.framework_version 285 _framework_version = invoker.framework_version
264 _framework_root_dir = _framework_base_dir + "/Versions/$_framework_version" 286 _framework_root_dir = _framework_base_dir + "/Versions/$_framework_version"
265 _framework_target = _target_name + "_create_bundle"
266 } else { 287 } else {
267 _framework_root_dir = _framework_base_dir 288 _framework_root_dir = _framework_base_dir
268 } 289 }
269 290
291 # Clean the entire framework if the framework_version changes.
292 _version_arg = "''"
293 if (defined(invoker.framework_version)) {
294 _version_arg = _framework_version
295 }
296 _version_file = "$target_out_dir/${target_name}_version"
297 exec_script("//build/config/mac/prepare_framework_version.py",
298 [
299 rebase_path(_version_file),
300 rebase_path(_framework_base_dir),
301 _version_arg,
302 ])
303
304 # Create the symlinks.
305 _framework_package_target = target_name + "_package"
306 action(_framework_package_target) {
307 script = "//build/config/mac/package_framework.py"
308
309 # The TOC file never needs to be read, since its contents are the values
310 # of GN variables. It is only used to trigger this rule when the values
311 # change.
312 inputs = [
313 _framework_toc_file,
314 ]
315
316 _stamp_file = "$target_out_dir/run_${_framework_package_target}.stamp"
317 outputs = [
318 _stamp_file,
319 ]
320
321 visibility = [ ":$_framework_target" ]
322
323 args = [
324 "--framework",
325 rebase_path(_framework_base_dir, root_build_dir),
326 "--stamp",
327 rebase_path(_stamp_file, root_build_dir),
328 ]
329
330 if (defined(invoker.framework_version)) {
331 outputs += [ "$_framework_base_dir/Versions/Current" ]
332 args += [
333 "--version",
334 invoker.framework_version,
335 "--contents",
336 ] + _framework_contents
337
338 # It is not possible to list _framework_contents as outputs, since
339 # ninja does not properly stat symbolic links. The exception is the
340 # "Current" symlink, since package_framework.py will ensure that
341 # directory exists so the resolved-symlink mtime will be up-to-date.
342 # https://github.com/ninja-build/ninja/issues/1186
343 }
344 }
345
270 _link_shared_library_target = target_name + "_shared_library" 346 _link_shared_library_target = target_name + "_shared_library"
271 _shared_library_bundle_data = target_name + "_shared_library_bundle_data" 347 _shared_library_bundle_data = target_name + "_shared_library_bundle_data"
272 348
273 shared_library(_link_shared_library_target) { 349 shared_library(_link_shared_library_target) {
274 forward_variables_from(invoker, 350 forward_variables_from(invoker,
275 "*", 351 "*",
276 [ 352 [
277 "assert_no_deps", 353 "assert_no_deps",
278 "bundle_deps", 354 "bundle_deps",
279 "code_signing_enabled", 355 "code_signing_enabled",
(...skipping 17 matching lines...) Expand all
297 "$target_out_dir/$_link_shared_library_target/$_output_name", 373 "$target_out_dir/$_link_shared_library_target/$_output_name",
298 ] 374 ]
299 outputs = [ 375 outputs = [
300 "{{bundle_executable_dir}}/$_output_name", 376 "{{bundle_executable_dir}}/$_output_name",
301 ] 377 ]
302 public_deps = [ 378 public_deps = [
303 ":$_link_shared_library_target", 379 ":$_link_shared_library_target",
304 ] 380 ]
305 } 381 }
306 382
307 # Clean the entire framework if the framework_version changes.
308 _version_arg = ""
309 if (defined(_framework_version)) {
310 _version_arg = _framework_version
311 }
312 _version_file = "$target_out_dir/${target_name}_version"
313 exec_script("//build/config/mac/prepare_framework_version.py",
314 [
315 rebase_path(_version_file),
316 rebase_path(_framework_base_dir),
317 "'$_version_arg'",
318 ])
319
320 _framework_public_config = _target_name + "_public_config" 383 _framework_public_config = _target_name + "_public_config"
321 config(_framework_public_config) { 384 config(_framework_public_config) {
322 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs 385 # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs
323 # and include_dirs to avoid duplicate values on the command-line. 386 # and include_dirs to avoid duplicate values on the command-line.
324 visibility = [ ":$_framework_target" ] 387 visibility = [ ":$_framework_target" ]
325 ldflags = [ 388 ldflags = [
326 "-F", 389 "-F",
327 rebase_path("$root_out_dir/.", root_build_dir), 390 rebase_path("$root_out_dir/.", root_build_dir),
328 ] 391 ]
329 lib_dirs = [ root_out_dir ] 392 lib_dirs = [ root_out_dir ]
330 libs = [ _framework_name ] 393 libs = [ _framework_name ]
331 } 394 }
332 395
333 create_bundle(_framework_target) { 396 create_bundle(_framework_target) {
334 forward_variables_from(invoker, 397 forward_variables_from(invoker,
335 [ 398 [
336 "data_deps", 399 "data_deps",
337 "deps", 400 "deps",
338 "public_deps", 401 "public_deps",
339 "testonly", 402 "testonly",
340 ]) 403 ])
341 404
342 if (defined(_framework_version)) { 405 if (defined(invoker.visibility)) {
343 visibility = [ ":$_target_name" ] 406 visibility = invoker.visibility
344 } else { 407 visibility += [ ":$_target_name+link" ]
345 if (defined(invoker.visibility)) {
346 visibility = invoker.visibility
347 visibility += [ ":$_target_name+link" ]
348 }
349 } 408 }
350 409
351 if (!defined(deps)) { 410 if (!defined(deps)) {
352 deps = [] 411 deps = []
353 } 412 }
354 deps += [ ":$_info_plist_bundle_data" ] 413 deps += [ ":$_info_plist_bundle_data" ]
355 414
356 if (defined(invoker.bundle_deps)) { 415 if (defined(invoker.bundle_deps)) {
357 deps += invoker.bundle_deps 416 deps += invoker.bundle_deps
358 } 417 }
359 418
360 if (!defined(public_deps)) { 419 if (!defined(public_deps)) {
361 public_deps = [] 420 public_deps = []
362 } 421 }
363 public_deps += [ ":$_shared_library_bundle_data" ] 422 public_deps += [
423 ":$_framework_package_target",
424 ":$_shared_library_bundle_data",
425 ]
364 426
365 bundle_root_dir = _framework_root_dir 427 bundle_root_dir = _framework_root_dir
366 bundle_resources_dir = "$bundle_root_dir/Resources" 428 bundle_resources_dir = "$bundle_root_dir/Resources"
367 bundle_executable_dir = "$bundle_root_dir" 429 bundle_executable_dir = "$bundle_root_dir"
368 } 430 }
369 431
370 if (defined(_framework_version)) {
371 action(_target_name) {
372 forward_variables_from(invoker, [ "testonly" ])
373
374 if (defined(invoker.visibility)) {
375 visibility = invoker.visibility
376 visibility += [ ":$_target_name+link" ]
377 }
378
379 script = "//build/config/mac/package_framework.py"
380 outputs = [
381 "$root_out_dir/$_framework_name/Versions/Current",
382 ]
383 args = [
384 "$_framework_name",
385 "$_framework_version",
386 ]
387 public_deps = [
388 ":$_framework_target",
389 ]
390 }
391 }
392
393 group(_target_name + "+link") { 432 group(_target_name + "+link") {
394 forward_variables_from(invoker, 433 forward_variables_from(invoker,
395 [ 434 [
396 "public_configs", 435 "public_configs",
397 "testonly", 436 "testonly",
398 "visibility", 437 "visibility",
399 ]) 438 ])
400 public_deps = [ 439 public_deps = [
401 ":$_target_name", 440 ":$_target_name",
402 ] 441 ]
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 ]) 686 ])
648 if (!defined(deps)) { 687 if (!defined(deps)) {
649 deps = [] 688 deps = []
650 } 689 }
651 deps += [ ":$_loadable_module_bundle_data" ] 690 deps += [ ":$_loadable_module_bundle_data" ]
652 691
653 bundle_root_dir = "$root_out_dir/$_output_name.plugin/Contents" 692 bundle_root_dir = "$root_out_dir/$_output_name.plugin/Contents"
654 bundle_executable_dir = "$bundle_root_dir/MacOS" 693 bundle_executable_dir = "$bundle_root_dir/MacOS"
655 } 694 }
656 } 695 }
OLDNEW
« no previous file with comments | « build/config/mac/package_framework.py ('k') | chrome/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698