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

Unified Diff: build/config/mac/rules.gni

Issue 1910133002: [iOS/Mac/GN] The framework_bundle template should not force dependencies to link it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/config/ios/rules.gni ('k') | ios/third_party/earl_grey/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/config/mac/rules.gni
diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni
index 11b86c9d6f88f33c8f727afd56a58952ff667e03..9d624a7bac72f4a7744ba5b275492fe10a3d21e3 100644
--- a/build/config/mac/rules.gni
+++ b/build/config/mac/rules.gni
@@ -7,6 +7,12 @@ import("//build/config/mac/mac_sdk.gni")
# This is used as the base template for both iOS and Mac frameworks..
#
+# By default, the bundle target this template generates does not link the
+# resulting framework into anything that depends on it. If a dependency wants
+# a link-time (as well as build-time) dependency on the framework bundle,
+# depend against "$target_name+link". If only the build-time dependency is
+# required (e.g., for copying into another bundle), then use "$target_name".
+#
# Arguments
#
# output_name:
@@ -19,6 +25,70 @@ import("//build/config/mac/mac_sdk.gni")
# structure will not be created, and build output will go directly
# into the framework subdirectory.
#
+# This template provides two targets for the resulting framework bundle. The
+# link-time behavior varies depending on which of the two targets below is
+# added as a dependency:
+# - $target_name only adds a build-time dependency. Targets that depend on
+# it will not link against the framework.
+# - $target_name+link adds a build-time and link-time dependency. Targets
+# that depend on it will link against the framework.
+#
+# The build-time-only dependency is used for when a target needs to use the
+# framework either only for resources, or because the target loads it at run-
+# time, via dlopen() or NSBundle. The link-time dependency will cause the
+# dependee to have the framework loaded by dyld at launch.
+#
+# Example of build-time only dependency:
+#
+# framework_bundle("CoreTeleportation") {
+# sources = [ ... ]
+# }
+#
+# bundle_data("core_teleportation_bundle_data") {
+# deps = [ ":CoreTeleportation" ]
+# sources = [ "$root_out_dir/CoreTeleportation.framework" ]
+# outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ]
+# }
+#
+# app_bundle("GoatTeleporter") {
+# sources = [ ... ]
+# deps = [
+# ":core_teleportation_bundle_data",
+# ]
+# }
+#
+# The GoatTeleporter.app will not directly link against
+# CoreTeleportation.framework, but it will be included in the bundle's
+# Frameworks directory.
+#
+# Example of link-time dependency:
+#
+# framework_bundle("CoreTeleportation") {
+# sources = [ ... ]
+# ldflags = [
+# "-install_name",
+# "@executable_path/../Frameworks/$target_name.framework"
+# ]
+# }
+#
+# bundle_data("core_teleportation_bundle_data") {
+# deps = [ ":CoreTeleportation+link" ]
+# sources = [ "$root_out_dir/CoreTeleportation.framework" ]
+# outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ]
+# }
+#
+# app_bundle("GoatTeleporter") {
+# sources = [ ... ]
+# deps = [
+# ":core_teleportation_bundle_data",
+# ]
+# }
+#
+# Note that the framework is still copied to the app's bundle, but dyld will
+# load this library when the app is launched because it uses the "+link"
+# target as a dependency. This also requires that the framework set its
+# install_name so that dyld can locate it.
+#
# See "gn help shared_library" for more information on arguments supported
# by shared library target.
template("framework_bundle") {
@@ -80,10 +150,7 @@ template("framework_bundle") {
# TODO(sdefresne): should we have a framework_dirs similar to lib_dirs
# and include_dirs to avoid duplicate values on the command-line.
visibility = [ ":$_framework_target" ]
- common_flags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ]
- cflags_objc = common_flags
- cflags_objcc = common_flags
- ldflags = common_flags
+ ldflags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ]
lib_dirs = [ root_out_dir ]
libs = [ _framework_name ]
}
@@ -100,7 +167,10 @@ template("framework_bundle") {
if (defined(_framework_version)) {
visibility = [ ":$_target_name" ]
} else {
- forward_variables_from(invoker, [ "visibility" ])
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ visibility += [ ":$_target_name+link" ]
+ }
}
if (!defined(public_deps)) {
@@ -108,8 +178,6 @@ template("framework_bundle") {
}
public_deps += [ ":$_shared_library_bundle_data" ]
- public_configs = [ ":$_framework_public_config" ]
-
bundle_root_dir = _framework_root_dir
bundle_resources_dir = "$bundle_root_dir/Resources"
bundle_executable_dir = "$bundle_root_dir"
@@ -117,11 +185,13 @@ template("framework_bundle") {
if (defined(_framework_version)) {
action(_target_name) {
- forward_variables_from(invoker,
- [
- "visibility",
- "testonly",
- ])
+ forward_variables_from(invoker, [ "testonly" ])
+
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ visibility += [ ":$_target_name+link" ]
+ }
+
script = "$root_out_dir/gyp-mac-tool"
outputs = [
"$root_out_dir/$_framework_name/Versions/Current",
@@ -136,6 +206,18 @@ template("framework_bundle") {
]
}
}
+
+ group(_target_name + "+link") {
+ forward_variables_from(invoker,
+ [
+ "visibility",
+ "testonly",
+ ])
+ public_deps = [
+ ":$_target_name",
+ ]
+ public_configs = [ ":$_framework_public_config" ]
+ }
}
# Template to combile .xib or .storyboard files.
@@ -228,6 +310,13 @@ template("mac_xib_bundle_data") {
# Template to package a shared library into a Mac framework bundle.
#
+# This template provides two targets to control whether the framework is
+# merely built when targets depend on it, or whether it is linked as well:
+# "$target_name" and "$target_name+link".
+#
+# See the //build/config/mac/rules.gni:framework_bundle for a discussion
+# and examples.
+#
# Arguments
#
# info_plist:
« no previous file with comments | « build/config/ios/rules.gni ('k') | ios/third_party/earl_grey/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698