diff --git a/config/ios/rules.gni b/config/ios/rules.gni index d64136338..778a56b17 100644 --- a/config/ios/rules.gni +++ b/config/ios/rules.gni @@ -420,6 +420,17 @@ template("ios_app_bundle") { _output_name = invoker.output_name } + # TODO(sdefresne): some target downstream manually pack an PkgInfo, so + # allow controlling the generation of the PkgInfo file via an undocumented + # parameter until they are fixed. + _write_pkg_info = false + if (defined(invoker.write_pkg_info)) { + _write_pkg_info = invoker.write_pkg_info + } + + assert(_write_pkg_info || !_write_pkg_info, + "prevents 'Assignment had no effect.' errors") + _arch_executable_source = _target_name + "_arch_executable_sources" _arch_executable_target = _target_name + "_arch_executable" _lipo_executable_target = _target_name + "_executable" @@ -634,6 +645,38 @@ template("ios_app_bundle") { ] } + if (_write_pkg_info) { + _create_pkg_info = target_name + "_pkg_info" + action(_create_pkg_info) { + forward_variables_from(invoker, [ "testonly" ]) + script = "//build/config/mac/write_pkg_info.py" + sources = get_target_outputs(":$_generate_info_plist") + outputs = [ + # Cannot name the output PkgInfo as the name will not be unique if + # multiple ios_app_bundle are defined in the same BUILD.gn file. The + # file is renamed in the bundle_data outputs to the correct name. + "$target_gen_dir/$target_name", + ] + args = [ "--plist" ] + rebase_path(sources, root_build_dir) + + [ "--output" ] + rebase_path(outputs, root_build_dir) + deps = [ + ":$_generate_info_plist", + ] + } + + _bundle_data_pkg_info = target_name + "_bundle_data_pkg_info" + bundle_data(_bundle_data_pkg_info) { + forward_variables_from(invoker, [ "testonly" ]) + sources = get_target_outputs(":$_create_pkg_info") + outputs = [ + "{{bundle_resources_dir}}/PkgInfo", + ] + public_deps = [ + ":$_create_pkg_info", + ] + } + } + create_signed_bundle(_target_name) { forward_variables_from(invoker, [ @@ -661,6 +704,9 @@ template("ios_app_bundle") { bundle_deps = [] } bundle_deps += [ ":$_bundle_data_info_plist" ] + if (_write_pkg_info) { + bundle_deps += [ ":$_bundle_data_pkg_info" ] + } if (use_ios_simulator) { if (!defined(data_deps)) { diff --git a/config/mac/write_pkg_info.py b/config/mac/write_pkg_info.py index b03e77928..3e2c3c930 100644 --- a/config/mac/write_pkg_info.py +++ b/config/mac/write_pkg_info.py @@ -4,7 +4,7 @@ import argparse import os -import plistlib +import plist_util import sys # This script creates a PkgInfo file for an OS X .app bundle's plist. @@ -24,7 +24,7 @@ def Main(): if os.path.exists(args.output): os.unlink(args.output) - plist = plistlib.readPlist(args.plist) + plist = plist_util.LoadPList(args.plist) package_type = plist['CFBundlePackageType'] if package_type != 'APPL': raise ValueError('Expected CFBundlePackageType to be %s, got %s' % \