Index: build/config/mac/rules.gni |
diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni |
index 32f3d99914d43f1bb0a161a2943faa95813522a8..7055e1eee1d368d552fd2a1b24a4b38b5aebe6cf 100644 |
--- a/build/config/mac/rules.gni |
+++ b/build/config/mac/rules.gni |
@@ -2,6 +2,8 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import("//build/toolchain/toolchain.gni") |
+ |
mac_app_script = "//build/config/mac/mac_app.py" |
template("code_sign_mac") { |
@@ -210,3 +212,145 @@ template("mac_app") { |
] |
} |
} |
+ |
+# Template to package a shared library into a Mac framework bundle. |
+# |
+# Arguments |
+# |
+# info_plist: |
+# string, path to the Info.plist file that will be used for the bundle. |
+# |
+# output_name: |
+# (optional) string, name of the generated framework without the |
+# .framework suffix. If omitted, defaults to target_name. |
+# |
+# framework_version: |
+# (optional) string, version of the framework. Typically this is a |
+# single letter, like "A". If omitted, the Versions/ subdirectory |
+# structure will not be created, and build output will go directly |
+# into the framework subdirectory. |
+template("mac_framework") { |
+ assert(defined(invoker.deps), |
+ "Dependencies must be specified for $target_name") |
+ assert(defined(invoker.info_plist), |
+ "The Info.plist file must be specified for $target_name") |
+ |
+ _target_name = target_name |
+ _output_name = target_name |
+ if (defined(invoker.output_name)) { |
+ _output_name = invoker.output_name |
+ } |
+ _framework_name = _output_name + ".framework" |
+ _framework_version = "" |
+ if (defined(invoker.framework_version)) { |
+ _framework_version = invoker.framework_version |
+ } |
+ _framework_target = _output_name + "_framework" |
+ |
+ _shared_library_target = target_name + "_shared_library" |
+ _shared_library_bundle_data = _shared_library_target + "_bundle_data" |
+ |
+ shared_library(_shared_library_target) { |
+ visibility = [ ":$_shared_library_bundle_data" ] |
+ forward_variables_from(invoker, |
+ "*", |
+ [ |
+ "assert_no_deps", |
+ "data_deps", |
+ "info_plist", |
+ "output_name", |
+ "visibility", |
+ ]) |
+ } |
+ |
+ bundle_data(_shared_library_bundle_data) { |
+ visibility = [ ":$_framework_target" ] |
+ forward_variables_from(invoker, [ "testonly" ]) |
+ sources = [ |
+ "$root_out_dir/${shlib_prefix}${_shared_library_target}${shlib_extension}", |
+ ] |
+ outputs = [ |
+ "{{bundle_executable_dir}}/$_output_name", |
+ ] |
+ public_deps = [ |
+ ":$_shared_library_target", |
+ ] |
+ } |
+ |
+ _info_plist_target = target_name + "_info_plist" |
+ |
+ # TODO(rsesek): Process Info.plist variables. |
+ |
+ _info_plist_bundle_data = _info_plist_target + "_bundle_data" |
+ |
+ bundle_data(_info_plist_bundle_data) { |
+ visibility = [ ":$_framework_target" ] |
+ forward_variables_from(invoker, [ "testonly" ]) |
+ sources = [ |
+ invoker.info_plist, |
+ ] |
+ outputs = [ |
+ "{{bundle_root_dir}}/Info.plist", |
+ ] |
+ } |
+ |
+ create_bundle(_framework_target) { |
+ visibility = [ ":$_target_name" ] |
+ forward_variables_from(invoker, |
+ [ |
+ "data_deps", |
+ "deps", |
+ "public_deps", |
+ "testonly", |
+ "visibility", |
+ ]) |
+ |
+ if (!defined(deps)) { |
+ deps = [] |
+ } |
+ deps += [ |
+ ":$_info_plist_bundle_data", |
+ ":$_shared_library_bundle_data", |
+ ] |
+ |
+ bundle_root_dir = "$root_out_dir/$_framework_name" |
+ if (_framework_version != "") { |
+ bundle_root_dir += "/Versions/$_framework_version" |
+ } |
+ bundle_resources_dir = "$bundle_root_dir/Resources" |
+ bundle_executable_dir = "$bundle_root_dir" |
+ } |
+ |
+ if (_framework_version != "") { |
+ action(_target_name) { |
+ forward_variables_from(invoker, |
+ [ |
+ "visibility", |
+ "testonly", |
+ ]) |
+ script = "$root_out_dir/gyp-mac-tool" |
+ outputs = [ |
+ "$root_out_dir/$_framework_name/Versions/Current", |
+ ] |
+ args = [ |
+ "package-framework", |
+ "$_framework_name", |
+ "$_framework_version", |
+ ] |
+ deps = [ |
+ ":$_framework_target", |
+ ] |
+ } |
+ } else { |
+ group(_target_name) { |
+ forward_variables_from(invoker, |
+ [ |
+ "visibility", |
+ "testonly", |
+ ]) |
+ deps = [ |
+ ":$_framework_target", |
+ ] |
+ } |
+ } |
+} |