Index: build/config/ios/rules.gni |
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni |
index 53a83ff99f44baa4df43c4a34b77aaa075199d34..5fdd640ea2841a8cfd89e8b58d3715496fe729b0 100644 |
--- a/build/config/ios/rules.gni |
+++ b/build/config/ios/rules.gni |
@@ -160,6 +160,7 @@ template("ios_app_bundle") { |
[ |
"bundle_deps", |
"bundle_extension", |
+ "extra_system_frameworks", |
"entitlements_path", |
"extra_substitutions", |
"info_plist", |
@@ -239,6 +240,7 @@ template("ios_app_bundle") { |
[ |
"bundle_deps", |
"bundle_extension", |
+ "extra_system_frameworks", |
"data_deps", |
"entitlements_path", |
"extra_substitutions", |
@@ -358,6 +360,16 @@ template("ios_app_bundle") { |
} |
} |
+ if (!ios_enable_code_signing && defined(invoker.extra_system_frameworks)) { |
+ bundle_data(_target_name + "_extra_system_frameworks") { |
+ visibility = [ ":$_target_name" ] |
+ sources = invoker.extra_system_frameworks |
+ outputs = [ |
+ "{{bundle_resources_dir}}/Frameworks/{{source_file_part}}", |
+ ] |
+ } |
+ } |
+ |
create_bundle(target_name) { |
forward_variables_from(invoker, |
[ |
@@ -380,6 +392,9 @@ template("ios_app_bundle") { |
} |
} else { |
deps += [ ":$_bundle_data_executable" ] |
+ if (defined(invoker.extra_system_frameworks)) { |
+ deps += [ ":${_target_name}_extra_system_frameworks" ] |
+ } |
} |
if (defined(invoker.bundle_deps)) { |
deps += invoker.bundle_deps |
@@ -425,12 +440,26 @@ template("ios_app_bundle") { |
"$bundle_root_dir/_CodeSignature/CodeResources", |
"$bundle_root_dir/embedded.mobileprovision", |
] |
+ if (defined(invoker.extra_system_frameworks)) { |
+ foreach(_framework, invoker.extra_system_frameworks) { |
+ code_signing_outputs += [ "$bundle_root_dir/Frameworks/" + |
+ get_path_info(_framework, "name") ] |
+ } |
+ } |
code_signing_args = [ |
"-i=" + ios_code_signing_identity, |
"-b=" + rebase_path("$target_out_dir/$_output_name", root_build_dir), |
"-e=" + rebase_path(_entitlements_path, root_build_dir), |
rebase_path(bundle_root_dir, root_build_dir), |
] |
+ if (defined(invoker.extra_system_frameworks)) { |
+ # All framework in extra_system_frameworks are expected to be |
+ # system framework and the path to be already system absolute |
+ # so do not use rebase_path here. |
+ foreach(_framework, invoker.extra_system_frameworks) { |
+ code_signing_args += [ "-F=" + _framework ] |
+ } |
+ } |
} |
} |
} |
@@ -776,12 +805,11 @@ template("ios_framework_bundle") { |
} |
config(_framework_public_config) { |
- visibility = [ ":$_framework_public_config" ] |
- common_flags = [ "-F" + rebase_path("$root_out_dir/.", root_build_dir) ] |
- cflags_objc = common_flags |
- cflags_objcc = common_flags |
- |
# The link settings are inherited from the framework_bundle config. |
+ cflags = [ |
+ "-F", |
+ rebase_path("$root_out_dir/.", root_build_dir), |
+ ] |
} |
} |
} |
@@ -910,3 +938,281 @@ template("ios_framework_bundle") { |
set_defaults("ios_framework_bundle") { |
configs = default_shared_library_configs |
} |
+ |
+# For Chrome on iOS we want to run XCTests for all our build configurations |
+# (Debug, Release, ...). In addition, the symbols visibility is configured to |
+# private by default. To simplify testing with those constraints, our tests are |
+# compiled in the TEST_HOST target instead of the .xctest bundle. |
+template("ios_xctest_test") { |
+ _target_name = target_name |
+ _output_name = target_name |
+ if (defined(invoker.output_name)) { |
+ _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 |
+ |
+ _host_target = _target_name + "_host" |
+ _host_output = _output_name + "_host" |
+ |
+ if (_is_fat_build && !_is_fat_build_main_target) { |
+ loadable_module(_xctest_target) { |
+ visibility = [ ":${_xctest_target}_loadable_module($default_toolchain)" ] |
+ sources = [ |
+ "//build/config/ios/xctest_shell.mm", |
+ ] |
+ configs += [ "//build/config/ios:xctest_config" ] |
+ |
+ output_name = _xctest_output |
+ output_extension = "" |
+ } |
+ } else { |
+ _xctest_info_plist_target = _xctest_target + "_info_plist" |
+ _xctest_info_plist_bundle = _xctest_target + "_info_plist_bundle" |
+ ios_info_plist(_xctest_info_plist_target) { |
+ visibility = [ ":$_xctest_info_plist_bundle" ] |
+ info_plist = "//build/config/ios/Module-Info.plist" |
+ executable_name = _output_name |
+ } |
+ |
+ bundle_data(_xctest_info_plist_bundle) { |
+ visibility = [ ":$_xctest_target" ] |
+ public_deps = [ |
+ ":$_xctest_info_plist_target", |
+ ] |
+ sources = get_target_outputs(":$_xctest_info_plist_target") |
+ outputs = [ |
+ "{{bundle_root_dir}}/Info.plist", |
+ ] |
+ } |
+ |
+ _xctest_loadable_module_target = _xctest_target + "_loadable_module" |
+ _xctest_loadable_module_path = "$target_out_dir/$_xctest_output" |
+ |
+ if (!ios_enable_code_signing) { |
+ _xctest_loadable_module_bundle = |
+ _xctest_target + "_loadable_module_bundle" |
+ _xctest_loadable_module_visibility = |
+ [ ":$_xctest_loadable_module_bundle" ] |
+ } else { |
+ _xctest_loadable_module_visibility = [ ":$_xctest_target" ] |
+ } |
+ |
+ if (_is_fat_build) { |
+ _xctest_lipo_loadable_module_target = _xctest_loadable_module_target |
+ _xctest_lipo_loadable_module_visibility = |
+ _xctest_loadable_module_visibility |
+ _arch_xctest_loadable_module_path = |
+ "$target_out_dir/$current_cpu/$_xctest_output" |
+ |
+ _xctest_loadable_module_visibility = [] |
+ _xctest_loadable_module_visibility = |
+ [ ":$_xctest_lipo_loadable_module_target" ] |
+ _xctest_loadable_module_target = _xctest_target + "_arch_loadable_module" |
+ } |
+ |
+ loadable_module(_xctest_loadable_module_target) { |
+ visibility = _xctest_loadable_module_visibility |
+ sources = [ |
+ "//build/config/ios/xctest_shell.mm", |
+ ] |
+ configs += [ "//build/config/ios:xctest_config" ] |
+ |
+ if (_is_fat_build) { |
+ output_name = |
+ rebase_path(_arch_xctest_loadable_module_path, root_out_dir) |
+ } else { |
+ output_name = rebase_path(_xctest_loadable_module_path, root_out_dir) |
+ } |
+ |
+ output_prefix_override = true |
+ output_extension = "" |
+ } |
+ |
+ if (_is_fat_build) { |
+ action(_xctest_lipo_loadable_module_target) { |
+ visibility = _xctest_lipo_loadable_module_visibility |
+ script = "//build/toolchain/mac/linker_driver.py" |
+ outputs = [ |
+ _xctest_loadable_module_path, |
+ ] |
+ inputs = [ |
+ _arch_xctest_loadable_module_path, |
+ ] |
+ deps = [ |
+ ":$_xctest_loadable_module_target", |
+ ] |
+ foreach(_additional_toolchain, additional_toolchains) { |
+ _additional_toolchain_target = "$_target_name($_additional_toolchain)" |
+ deps += [ ":$_additional_toolchain_target" ] |
+ inputs += [ get_label_info(_additional_toolchain_target, |
+ "root_out_dir") + "/$_xctest_output" ] |
+ } |
+ 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/$_xctest_output.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 (!ios_enable_code_signing) { |
+ bundle_data(_xctest_loadable_module_bundle) { |
+ visibility = [ ":$_xctest_target" ] |
+ if (_is_fat_build) { |
+ public_deps = [ |
+ ":$_xctest_lipo_loadable_module_target", |
+ ] |
+ } else { |
+ public_deps = [ |
+ ":$_xctest_loadable_module_target", |
+ ] |
+ } |
+ sources = [ |
+ "$target_out_dir/$_xctest_output", |
+ ] |
+ outputs = [ |
+ "{{bundle_root_dir}}/$_xctest_output", |
+ ] |
+ } |
+ } |
+ |
+ _xctest_bundle = _xctest_target + "_bundle" |
+ |
+ create_bundle(_xctest_target) { |
+ visibility = [ ":$_xctest_bundle" ] |
+ product_type = "com.apple.product-type.bundle.unit-test" |
+ deps = [ |
+ ":$_xctest_info_plist_bundle", |
+ ] |
+ bundle_root_dir = "$root_out_dir/$_xctest_output.xctest" |
+ |
+ if (!ios_enable_code_signing) { |
+ deps += [ ":$_xctest_loadable_module_bundle" ] |
+ } else { |
+ if (_is_fat_build) { |
+ deps += [ ":$_xctest_lipo_loadable_module_target" ] |
+ } else { |
+ deps += [ ":$_xctest_loadable_module_target" ] |
+ } |
+ |
+ _entitlements_path = "$ios_sdk_path/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, |
+ "$target_out_dir/$_xctest_output", |
+ ] |
+ code_signing_outputs = [ |
+ "$bundle_root_dir/$_xctest_output", |
+ "$bundle_root_dir/_CodeSignature/CodeResources", |
+ "$bundle_root_dir/embedded.mobileprovision", |
+ ] |
+ code_signing_args = [ |
+ "-i=" + ios_code_signing_identity, |
+ "-b=" + |
+ rebase_path("$target_out_dir/$_xctest_output", root_build_dir), |
+ "-e=" + rebase_path(_entitlements_path, root_build_dir), |
+ rebase_path(bundle_root_dir, root_build_dir), |
+ ] |
+ } |
+ } |
+ |
+ bundle_data(_xctest_bundle) { |
+ visibility = [ ":$_host_target" ] |
+ public_deps = [ |
+ ":$_xctest_target", |
+ ] |
+ sources = [ |
+ "$root_out_dir/$_xctest_output.xctest", |
+ ] |
+ outputs = [ |
+ "{{bundle_plugins_dir}}/$_xctest_output.xctest", |
+ ] |
+ } |
+ } |
+ |
+ ios_app_bundle(_host_target) { |
+ forward_variables_from(invoker, "*", [ "testonly" ]) |
+ |
+ testonly = true |
+ output_name = _host_output |
+ info_plist = "//build/config/ios/Host-Info.plist" |
+ configs += [ "//build/config/ios:xctest_config" ] |
+ |
+ # Xcode needs those two framework installed in the application (and signed) |
+ # for the XCTest to run, so install them using extra_system_frameworks. |
+ _ios_platform_library = "$ios_sdk_platform_path/Developer/Library" |
+ extra_system_frameworks = [ |
+ "$_ios_platform_library/Frameworks/XCTest.framework", |
+ "$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework", |
+ ] |
+ |
+ if (!_is_fat_build || _is_fat_build_main_target) { |
+ if (!defined(bundle_deps)) { |
+ bundle_deps = [] |
+ } |
+ bundle_deps += [ ":$_xctest_bundle" ] |
+ } |
+ |
+ if (!defined(ldflags)) { |
+ ldflags = [] |
+ } |
+ ldflags += [ |
+ "-Xlinker", |
+ "-rpath", |
+ "-Xlinker", |
+ "@executable_path/Frameworks", |
+ "-Xlinker", |
+ "-rpath", |
+ "-Xlinker", |
+ "@loader_path/Frameworks", |
+ ] |
+ } |
+} |
+ |
+set_defaults("ios_xctest_test") { |
+ configs = default_executable_configs |
+} |