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

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

Issue 2209973002: Stop sharing code between ios_framework_bundle & mac_framework_bundle. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compilation on iOS (variable name collision & public_* forwarding) Created 4 years, 4 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 | « no previous file | build/config/mac/base_rules.gni » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/config/ios/rules.gni
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni
index aa787158cf49adcc60dd0cc646c61adac39745f9..d3afc12f38c6e76d158975d7066fc960d41438cb 100644
--- a/build/config/ios/rules.gni
+++ b/build/config/ios/rules.gni
@@ -6,6 +6,13 @@ import("//build/config/ios/ios_sdk.gni")
import("//build/config/mac/base_rules.gni")
import("//build/config/mac/symbols.gni")
+_toolchain_suffix = ""
+_is_fat_build = additional_toolchains != []
+if (_is_fat_build) {
+ _toolchain_suffix = "($default_toolchain)"
+ _is_fat_build_main_target = current_toolchain == default_toolchain
+}
+
# Generates Info.plist files for Mac apps and frameworks.
#
# Arguments
@@ -146,11 +153,6 @@ template("ios_app_bundle") {
# The rest of the build, including the codesigning step, are the same for
# thin and fat builds.
- _is_fat_build = additional_toolchains != []
- if (_is_fat_build) {
- _is_fat_build_main_target = current_toolchain == default_toolchain
- }
-
_executable_extra_deps = []
_executable_extra_inputs = []
_executable_extra_ldflags = []
@@ -161,11 +163,6 @@ template("ios_app_bundle") {
#
# As the generation of the entitlement depends on the
if (use_ios_simulator) {
- _toolchain_suffix = ""
- if (_is_fat_build && !_is_fat_build_main_target) {
- _toolchain_suffix = "($default_toolchain)"
- }
-
_generate_entitlements_target = _target_name + "_gen_entitlements"
_generate_entitlements_target_with_toolchain_suffix =
"$_generate_entitlements_target$_toolchain_suffix"
@@ -763,12 +760,11 @@ template("bundle_data_strings") {
# Template to package a shared library into an iOS 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/base_rules.gni:framework_bundle for a discussion
-# and examples.
+# 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
#
@@ -791,6 +787,70 @@ template("bundle_data_strings") {
# (optional) list of files. Needs to be defined and non-empty if
# public_headers is defined and non-empty.
#
+# 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("ios_framework_bundle") {
@@ -799,38 +859,80 @@ template("ios_framework_bundle") {
if (defined(invoker.output_name)) {
_output_name = invoker.output_name
}
- _framework_target = _target_name
_has_public_headers =
defined(invoker.public_headers) && invoker.public_headers != []
- _is_fat_build = additional_toolchains != []
- if (_is_fat_build) {
- _is_fat_build_main_target = current_toolchain == default_toolchain
+ if (_has_public_headers) {
+ _framework_headers_target = _target_name + "_framework_headers"
+ _framework_headers_config = _target_name + "_framework_headers_config"
+ _headers_map_config = _target_name + "_headers_map"
}
- # This template has a different expansion depending on whether public headers
- # are defined or not. If no public headers are speficied, then is forwards to
- # the generic "framework_bundle" target, otherwise if expands to targets that
- # create header map mapping and corresponding config and configure them as
- # dependencies of the generic "framework_bundle" target.
+ # The expansion of the template is different for fat and thin builds. For
+ # thin build (and default toolchain of a fat build), the template expands
+ # to a "shared_library" target to create the bundle shared library and a
+ # "create_bundle" target (the main target) to create the bundle structure.
#
- # The expansion is a bit different for multi-architecture builds (aka fat
- # binary builds). Then the targets build for the non-default toolchain uses
- # the same header map (if available) as the one used by the default toolchain.
+ # For a fat build, the template just expands to the "shared_library" target
+ # for the non-default toolchain, while the final library is created using
+ # "lipo" in the expansion of the template for the default toolchain.
+ #
+ # The "$target_name+link" group for the non-default toolchain depends on the
+ # target of the same name from the default toolchain as this is the target
+ # that defines the real framework bundle (it will support the current cpu
+ # as it is a fat framework).
- _toolchain_suffix = ""
if (_is_fat_build && !_is_fat_build_main_target) {
- _toolchain_suffix = "($default_toolchain)"
- }
+ shared_library(_target_name) {
+ forward_variables_from(invoker,
+ "*",
+ [
+ "assert_no_deps",
+ "bundle_deps",
+ "code_signing_enabled",
+ "data_deps",
+ "info_plist",
+ "info_plist_target",
+ "output_name",
+ ])
+ if (defined(visibility)) {
+ visibility += [ ":${_target_name}_shared_library($default_toolchain)" ]
+ }
+ output_name = _output_name
+ output_prefix_override = true
+ output_extension = ""
+ output_dir = "$target_out_dir/$_target_name"
- if (_has_public_headers) {
- _framework_headers_target = _target_name + "_framework_headers"
- _framework_public_config = _target_name + "_ios_public_config"
- _framework_target = target_name + "_internal"
- _headers_map_config = _target_name + "_headers_map"
+ if (_has_public_headers) {
+ configs += [
+ ":$_framework_headers_config$_toolchain_suffix",
+ ":$_headers_map_config$_toolchain_suffix",
+ ]
- if (!_is_fat_build || _is_fat_build_main_target) {
+ if (!defined(deps)) {
+ deps = []
+ }
+ deps += [ ":$_framework_headers_target$_toolchain_suffix" ]
+ }
+ }
+
+ group(_target_name + "+link") {
+ forward_variables_from(invoker,
+ [
+ "visibility",
+ "testonly",
+ ])
+ public_deps = [
+ ":$_target_name+link($default_toolchain)",
+ ]
+ }
+
+ if (defined(invoker.bundle_deps)) {
+ assert(invoker.bundle_deps != [], "mark bundle_deps as used")
+ }
+ } else {
+ if (_has_public_headers) {
_public_headers = invoker.public_headers
_framework_name = _output_name + ".framework"
_framework_root = "$root_out_dir/$_framework_name"
@@ -901,7 +1003,7 @@ template("ios_framework_bundle") {
]
}
- config(_framework_public_config) {
+ config(_framework_headers_config) {
# The link settings are inherited from the framework_bundle config.
cflags = [
"-F",
@@ -909,9 +1011,178 @@ template("ios_framework_bundle") {
]
}
}
- }
- if (!_is_fat_build || _is_fat_build_main_target) {
+ _code_signing_enabled = ios_enable_code_signing
+ if (defined(invoker.code_signing_enabled)) {
+ _code_signing_enabled =
+ invoker.code_signing_enabled && _code_signing_enabled
+ }
+
+ # 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.
+ _framework_target = _target_name
+ _framework_name = _output_name + ".framework"
+ _framework_root_dir = "$root_out_dir/$_framework_name"
+ if (defined(invoker.framework_version) && invoker.framework_version != "") {
+ _framework_version = invoker.framework_version
+ _framework_root_dir += "/Versions/$_framework_version"
+ _framework_target = _target_name + "_create_bundle"
+ }
+
+ _link_shared_library_target = target_name + "_shared_library"
+ _shared_library_dir = "$target_out_dir/$_link_shared_library_target"
+
+ if (_code_signing_enabled) {
+ _link_shared_library_visibility = [ ":$_framework_target" ]
+ } else {
+ _shared_library_bundle_data = target_name + "_shared_library_bundle_data"
+ _link_shared_library_visibility = [ ":$_shared_library_bundle_data" ]
+ }
+
+ if (_is_fat_build) {
+ _lipo_shared_library_target = _link_shared_library_target
+ _lipo_shared_library_visibility = _link_shared_library_visibility
+
+ _link_shared_library_visibility = []
+ _link_shared_library_visibility = [ ":$_lipo_shared_library_target" ]
+ _link_shared_library_target = target_name + "_arch_shared_library"
+
+ _arch_shared_library_dir = "$target_out_dir/$_link_shared_library_target"
+ _shared_library_dir = "$target_out_dir/$_lipo_shared_library_target"
+ }
+
+ shared_library(_link_shared_library_target) {
+ forward_variables_from(invoker,
+ "*",
+ [
+ "assert_no_deps",
+ "bundle_deps",
+ "code_signing_enabled",
+ "data_deps",
+ "info_plist",
+ "info_plist_target",
+ "output_name",
+ "visibility",
+ ])
+ visibility = _link_shared_library_visibility
+ output_name = _output_name
+ output_prefix_override = true
+ output_extension = ""
+
+ if (!_is_fat_build) {
+ output_dir = _shared_library_dir
+ } else {
+ output_dir = _arch_shared_library_dir
+ }
+
+ if (_has_public_headers) {
+ configs += [ ":$_headers_map_config$_toolchain_suffix" ]
+
+ if (!defined(deps)) {
+ deps = []
+ }
+ deps += [ ":$_framework_headers_target$_toolchain_suffix" ]
+ }
+ }
+
+ if (_is_fat_build) {
+ action(_lipo_shared_library_target) {
+ forward_variables_from(invoker, [ "testonly" ])
+ visibility = _lipo_shared_library_visibility
+ script = "//build/toolchain/mac/linker_driver.py"
+ outputs = [
+ "$_shared_library_dir/$_output_name",
+ ]
+ inputs = [
+ "$_arch_shared_library_dir/$_output_name",
+ ]
+ deps = [
+ ":$_link_shared_library_target",
+ ]
+ foreach(_additional_toolchain, additional_toolchains) {
+ _additional_toolchain_target = "$_target_name($_additional_toolchain)"
+ deps += [ ":$_additional_toolchain_target" ]
+ inputs += [ get_label_info(_additional_toolchain_target,
+ "target_out_dir") + "/$_output_name" ]
+ }
+ args = [
+ "xcrun",
+ "lipo",
+ "-create",
+ "-output",
+ rebase_path(outputs[0], root_build_dir),
+ ] + rebase_path(inputs, root_build_dir)
+
+ if (enable_dsyms) {
+ outputs += [ "$root_out_dir/$_output_name.dSYM/" ]
+ args +=
+ [ "-Wcrl,dsym," + rebase_path("$root_out_dir/.", root_build_dir) ]
+ }
+
+ if (enable_stripping) {
+ # Check whether //build/config/mac:strip_all has been removed from
+ # the configs variable (as this is how stripping is disabled for a
+ # single target).
+ _strip_all_in_config = false
+ if (defined(invoker.configs)) {
+ foreach(_config, invoker.configs) {
+ if (_config == "//build/config/mac:strip_all") {
+ _strip_all_in_config = true
+ }
+ }
+ }
+
+ if (_strip_all_in_config) {
+ args += [ "-Wcrl,strip,-x,-S" ]
+
+ if (save_unstripped_output) {
+ outputs += [ outputs[0] + ".unstripped" ]
+ args += [ "-Wcrl,unstripped," +
+ rebase_path(get_path_info(outputs[0], "dir"),
+ root_build_dir) ]
+ }
+ }
+ }
+ }
+ }
+
+ if (!_code_signing_enabled) {
+ bundle_data(_shared_library_bundle_data) {
+ visibility = [ ":$_framework_target" ]
+ forward_variables_from(invoker, [ "testonly" ])
+ sources = [
+ "$_shared_library_dir/$_output_name",
+ ]
+ outputs = [
+ "{{bundle_executable_dir}}/$_output_name",
+ ]
+ if (_is_fat_build) {
+ public_deps = [
+ ":$_lipo_shared_library_target",
+ ]
+ } else {
+ public_deps = [
+ ":$_link_shared_library_target",
+ ]
+ }
+ }
+ }
+
+ _framework_public_config = _target_name + "_public_config"
+ config(_framework_public_config) {
+ # 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" ]
+ ldflags = [
+ "-F",
+ rebase_path("$root_out_dir/.", root_build_dir),
+ ]
+ lib_dirs = [ root_out_dir ]
+ libs = [ _framework_name ]
+ }
+
_info_plist_target = _target_name + "_info_plist"
_info_plist_bundle = _target_name + "_info_plist_bundle"
ios_info_plist(_info_plist_target) {
@@ -926,7 +1197,7 @@ template("ios_framework_bundle") {
}
bundle_data(_info_plist_bundle) {
- visibility = [ ":$_framework_target" ]
+ visibility = [ ":$_target_name" ]
forward_variables_from(invoker, [ "testonly" ])
sources = get_target_outputs(":$_info_plist_target")
outputs = [
@@ -936,83 +1207,131 @@ template("ios_framework_bundle") {
":$_info_plist_target",
]
}
- }
- framework_bundle(_framework_target) {
- forward_variables_from(invoker,
- "*",
- [
- "output_name",
- "public_headers",
- "visibility",
- ])
- output_name = _output_name
+ create_bundle(_framework_target) {
+ forward_variables_from(invoker,
+ [
+ "data_deps",
+ "deps",
+ "public_configs",
+ "public_deps",
+ "testonly",
+ ])
- if (!_is_fat_build || _is_fat_build_main_target) {
- if (!defined(bundle_deps)) {
- bundle_deps = []
+ if (defined(_framework_version)) {
+ visibility = [ ":$_target_name" ]
+ } else {
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ visibility += [ ":$_target_name+link" ]
+ }
}
- bundle_deps += [ ":$_info_plist_bundle" ]
- }
- if (_has_public_headers) {
- if (!defined(public_configs)) {
- public_configs = []
+ if (!defined(deps)) {
+ deps = []
}
- public_configs += [ ":$_framework_public_config$_toolchain_suffix" ]
- }
+ deps += [ ":$_info_plist_bundle" ]
- if (_has_public_headers) {
- visibility = [
- ":$_target_name$_toolchain_suffix",
- ":$_target_name+link$_toolchain_suffix",
- ":$_target_name+bundle$_toolchain_suffix",
- ]
- configs += [ ":$_headers_map_config$_toolchain_suffix" ]
+ if (defined(invoker.bundle_deps)) {
+ if (!defined(deps)) {
+ deps = []
+ }
+ deps += invoker.bundle_deps
+ }
- if (!defined(deps)) {
- deps = []
+ if (!_code_signing_enabled) {
+ if (!defined(public_deps)) {
+ public_deps = []
+ }
+ public_deps += [ ":$_shared_library_bundle_data" ]
}
- deps += [ ":$_framework_headers_target$_toolchain_suffix" ]
- } else {
- if (defined(invoker.visibility)) {
- visibility = invoker.visibility
- visibility += [ ":$_target_name+link$_toolchain_suffix" ]
+
+ bundle_root_dir = _framework_root_dir
+ bundle_resources_dir = "$bundle_root_dir/Resources"
+ bundle_executable_dir = "$bundle_root_dir"
+
+ if (_code_signing_enabled) {
+ if (!defined(deps)) {
+ deps = []
+ }
+
+ if (_is_fat_build) {
+ deps += [ ":$_lipo_shared_library_target" ]
+ } else {
+ deps += [ ":$_link_shared_library_target" ]
+ }
+
+ _entitlements_path = "//build/config/ios/entitlements.plist"
+ if (defined(invoker.entitlements_path)) {
+ _entitlements_path = invoker.entitlements_path
+ }
+
+ code_signing_script = "//build/config/ios/codesign.py"
+ code_signing_sources = [
+ _entitlements_path,
+ "$_shared_library_dir/$_output_name",
+ ]
+ code_signing_outputs = [
+ "$bundle_root_dir/$_output_name",
+ "$bundle_root_dir/_CodeSignature/CodeResources",
+ "$bundle_root_dir/embedded.mobileprovision",
+ ]
+ code_signing_args = [
+ "-e=" + rebase_path(_entitlements_path, root_build_dir),
+ "code-sign-bundle",
+ "-i=" + ios_code_signing_identity,
+ "-b=" +
+ rebase_path("$_shared_library_dir/$_output_name", root_build_dir),
+ rebase_path(bundle_root_dir, root_build_dir),
+ ]
}
}
- }
- if (_has_public_headers) {
- group(_target_name) {
- forward_variables_from(invoker,
- [
- "testonly",
- "public_configs",
- ])
+ if (defined(_framework_version)) {
+ action(_target_name) {
+ forward_variables_from(invoker, [ "testonly" ])
- if (defined(invoker.visibility)) {
- visibility = invoker.visibility
- visibility += [ ":$_target_name+link" ]
- }
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ visibility += [ ":$_target_name+link" ]
+ }
- public_deps = [
- ":$_framework_target$_toolchain_suffix",
- ]
+ 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,
[
+ "public_deps",
+ "public_configs",
"testonly",
"visibility",
])
- public_deps = [
- ":$_framework_target+link$_toolchain_suffix",
- ]
+ if (!defined(public_deps)) {
+ public_deps = []
+ }
+ public_deps += [ ":$_target_name" ]
+ if (!defined(public_configs)) {
+ public_configs = []
+ }
+ public_configs += [ ":$_framework_public_config" ]
+
+ if (_has_public_headers) {
+ public_configs += [ ":$_framework_headers_config" ]
+ }
}
- }
- if (!_is_fat_build || _is_fat_build_main_target) {
bundle_data(_target_name + "+bundle") {
forward_variables_from(invoker,
[
@@ -1020,7 +1339,7 @@ template("ios_framework_bundle") {
"visibility",
])
public_deps = [
- ":$_framework_target",
+ ":$_target_name",
]
sources = [
"$root_out_dir/$_output_name.framework",
@@ -1047,11 +1366,6 @@ template("ios_xctest_test") {
_output_name = invoker.output_name
}
- _is_fat_build = additional_toolchains != []
- if (_is_fat_build) {
- _is_fat_build_main_target = current_toolchain == default_toolchain
- }
-
_xctest_target = _target_name
_xctest_output = _output_name
« no previous file with comments | « no previous file | build/config/mac/base_rules.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698