| Index: build/config/mac/rules.gni
|
| diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni
|
| index 81297eb9a3d396bd5d7c5e2debfcab2cb87bf811..018ab49e294bd32ee6167d5778d6b0ad9f953cae 100644
|
| --- a/build/config/mac/rules.gni
|
| +++ b/build/config/mac/rules.gni
|
| @@ -143,6 +143,11 @@ template("mac_xib_bundle_data") {
|
| # structure will not be created, and build output will go directly
|
| # into the framework subdirectory.
|
| #
|
| +# framework_contents:
|
| +# (optional) list of string, top-level items in the framework. For
|
| +# frameworks with a framework_version, this is the list of symlinks to
|
| +# create in the .framework directory that link into Versions/Current/.
|
| +#
|
| # extra_substitutions:
|
| # (optional) string array, 'key=value' pairs for extra fields which are
|
| # specified in a source Info.plist template.
|
| @@ -216,6 +221,9 @@ template("mac_xib_bundle_data") {
|
| template("mac_framework_bundle") {
|
| assert(defined(invoker.deps),
|
| "Dependencies must be specified for $target_name")
|
| + assert(!defined(invoker.framework_contents) ||
|
| + defined(invoker.framework_version),
|
| + "framework_contents requres a versioned framework")
|
|
|
| _info_plist_target = target_name + "_info_plist"
|
|
|
| @@ -252,21 +260,89 @@ template("mac_framework_bundle") {
|
| _output_name = invoker.output_name
|
| }
|
|
|
| - # If the framework is unversioned, the final _target_name will be the
|
| - # create_bundle(_framework_target), otherwise an action with the name
|
| - # _target_name will depends on the the create_bundle() in order to prepare
|
| - # the versioned directory structure.
|
| + # Create a file to track the build dependency on the framework_version and
|
| + # framework_contents variables.
|
| + _framework_toc = []
|
| + if (defined(invoker.framework_version)) {
|
| + _framework_toc += [
|
| + "Version=" + invoker.framework_version,
|
| + _output_name,
|
| + ]
|
| + _framework_contents = [ _output_name ]
|
| + }
|
| + if (defined(invoker.framework_contents)) {
|
| + _framework_toc += invoker.framework_contents
|
| + _framework_contents += invoker.framework_contents
|
| + }
|
| + _framework_toc_file = "$target_out_dir/${target_name}.toc"
|
| + write_file(_framework_toc_file, _framework_toc)
|
| +
|
| + # Create local variables for referencing different parts of the bundle.
|
| _framework_target = _target_name
|
| _framework_name = _output_name + ".framework"
|
| _framework_base_dir = "$root_out_dir/$_framework_name"
|
| if (defined(invoker.framework_version) && invoker.framework_version != "") {
|
| _framework_version = invoker.framework_version
|
| _framework_root_dir = _framework_base_dir + "/Versions/$_framework_version"
|
| - _framework_target = _target_name + "_create_bundle"
|
| } else {
|
| _framework_root_dir = _framework_base_dir
|
| }
|
|
|
| + # Clean the entire framework if the framework_version changes.
|
| + _version_arg = "''"
|
| + if (defined(invoker.framework_version)) {
|
| + _version_arg = _framework_version
|
| + }
|
| + _version_file = "$target_out_dir/${target_name}_version"
|
| + exec_script("//build/config/mac/prepare_framework_version.py",
|
| + [
|
| + rebase_path(_version_file),
|
| + rebase_path(_framework_base_dir),
|
| + _version_arg,
|
| + ])
|
| +
|
| + # Create the symlinks.
|
| + _framework_package_target = target_name + "_package"
|
| + action(_framework_package_target) {
|
| + script = "//build/config/mac/package_framework.py"
|
| +
|
| + # The TOC file never needs to be read, since its contents are the values
|
| + # of GN variables. It is only used to trigger this rule when the values
|
| + # change.
|
| + inputs = [
|
| + _framework_toc_file,
|
| + ]
|
| +
|
| + _stamp_file = "$target_out_dir/run_${_framework_package_target}.stamp"
|
| + outputs = [
|
| + _stamp_file,
|
| + ]
|
| +
|
| + visibility = [ ":$_framework_target" ]
|
| +
|
| + args = [
|
| + "--framework",
|
| + rebase_path(_framework_base_dir, root_build_dir),
|
| + "--stamp",
|
| + rebase_path(_stamp_file, root_build_dir),
|
| + ]
|
| +
|
| + if (defined(invoker.framework_version)) {
|
| + outputs += [ "$_framework_base_dir/Versions/Current" ]
|
| + args += [
|
| + "--version",
|
| + invoker.framework_version,
|
| + "--contents",
|
| + ] + _framework_contents
|
| +
|
| + # It is not possible to list _framework_contents as outputs, since
|
| + # ninja does not properly stat symbolic links. The exception is the
|
| + # "Current" symlink, since package_framework.py will ensure that
|
| + # directory exists so the resolved-symlink mtime will be up-to-date.
|
| + # https://github.com/ninja-build/ninja/issues/1186
|
| + }
|
| + }
|
| +
|
| _link_shared_library_target = target_name + "_shared_library"
|
| _shared_library_bundle_data = target_name + "_shared_library_bundle_data"
|
|
|
| @@ -304,19 +380,6 @@ template("mac_framework_bundle") {
|
| ]
|
| }
|
|
|
| - # Clean the entire framework if the framework_version changes.
|
| - _version_arg = ""
|
| - if (defined(_framework_version)) {
|
| - _version_arg = _framework_version
|
| - }
|
| - _version_file = "$target_out_dir/${target_name}_version"
|
| - exec_script("//build/config/mac/prepare_framework_version.py",
|
| - [
|
| - rebase_path(_version_file),
|
| - rebase_path(_framework_base_dir),
|
| - "'$_version_arg'",
|
| - ])
|
| -
|
| _framework_public_config = _target_name + "_public_config"
|
| config(_framework_public_config) {
|
| # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs
|
| @@ -339,13 +402,9 @@ template("mac_framework_bundle") {
|
| "testonly",
|
| ])
|
|
|
| - if (defined(_framework_version)) {
|
| - visibility = [ ":$_target_name" ]
|
| - } else {
|
| - if (defined(invoker.visibility)) {
|
| - visibility = invoker.visibility
|
| - visibility += [ ":$_target_name+link" ]
|
| - }
|
| + if (defined(invoker.visibility)) {
|
| + visibility = invoker.visibility
|
| + visibility += [ ":$_target_name+link" ]
|
| }
|
|
|
| if (!defined(deps)) {
|
| @@ -360,36 +419,16 @@ template("mac_framework_bundle") {
|
| if (!defined(public_deps)) {
|
| public_deps = []
|
| }
|
| - public_deps += [ ":$_shared_library_bundle_data" ]
|
| + public_deps += [
|
| + ":$_framework_package_target",
|
| + ":$_shared_library_bundle_data",
|
| + ]
|
|
|
| bundle_root_dir = _framework_root_dir
|
| bundle_resources_dir = "$bundle_root_dir/Resources"
|
| bundle_executable_dir = "$bundle_root_dir"
|
| }
|
|
|
| - if (defined(_framework_version)) {
|
| - action(_target_name) {
|
| - forward_variables_from(invoker, [ "testonly" ])
|
| -
|
| - if (defined(invoker.visibility)) {
|
| - visibility = invoker.visibility
|
| - visibility += [ ":$_target_name+link" ]
|
| - }
|
| -
|
| - script = "//build/config/mac/package_framework.py"
|
| - outputs = [
|
| - "$root_out_dir/$_framework_name/Versions/Current",
|
| - ]
|
| - args = [
|
| - "$_framework_name",
|
| - "$_framework_version",
|
| - ]
|
| - public_deps = [
|
| - ":$_framework_target",
|
| - ]
|
| - }
|
| - }
|
| -
|
| group(_target_name + "+link") {
|
| forward_variables_from(invoker,
|
| [
|
|
|