mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	* Add samples and definition for GN build files * Add grammar to provide GN syntax highlighting * Fix failing tests * Add Python extensions for GYP includes and .gclient configs
		
			
				
	
	
		
			1423 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1423 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # Copyright 2015 The Chromium Authors. All rights reserved.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| import("//build/config/ios/ios_sdk.gni")
 | |
| import("//build/config/mac/base_rules.gni")
 | |
| import("//build/config/mac/symbols.gni")
 | |
| import("//build/toolchain/toolchain.gni")
 | |
| 
 | |
| # Invokes lipo on multiple arch-specific binaries to create a fat binary.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #   arch_binary_target
 | |
| #     name of the target generating the arch-specific binaries, they must
 | |
| #     be named $target_out_dir/$toolchain_cpu/$arch_binary_output.
 | |
| #
 | |
| #   arch_binary_output
 | |
| #     (optional, defaults to the name of $arch_binary_target) base name of
 | |
| #     the arch-specific binary generated by arch_binary_target.
 | |
| #
 | |
| #   output_name
 | |
| #     (optional, defaults to $target_name) base name of the target output,
 | |
| #     the full path will be $target_out_dir/$output_name.
 | |
| #
 | |
| #   configs
 | |
| #     (optional) a list of configurations, this is used to check whether
 | |
| #     the binary should be stripped, when "enable_stripping" is true.
 | |
| #
 | |
| template("lipo_binary") {
 | |
|   assert(defined(invoker.arch_binary_target),
 | |
|          "arch_binary_target must be defined for $target_name")
 | |
| 
 | |
|   _target_name = target_name
 | |
|   _output_name = target_name
 | |
|   if (defined(invoker.output_name)) {
 | |
|     _output_name = invoker.output_name
 | |
|   }
 | |
| 
 | |
|   _all_target_cpu = [ current_cpu ] + additional_target_cpus
 | |
|   _all_toolchains = [ current_toolchain ] + additional_toolchains
 | |
| 
 | |
|   _arch_binary_target = invoker.arch_binary_target
 | |
|   _arch_binary_output = get_label_info(_arch_binary_target, "name")
 | |
|   if (defined(invoker.arch_binary_output)) {
 | |
|     _arch_binary_output = invoker.arch_binary_output
 | |
|   }
 | |
| 
 | |
|   action(_target_name) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "arch_binary_output",
 | |
|                              "arch_binary_target",
 | |
|                              "configs",
 | |
|                              "output_name",
 | |
|                            ])
 | |
| 
 | |
|     script = "//build/toolchain/mac/linker_driver.py"
 | |
| 
 | |
|     outputs = [
 | |
|       "$target_out_dir/$_output_name",
 | |
|     ]
 | |
| 
 | |
|     deps = []
 | |
|     _index = 0
 | |
|     inputs = []
 | |
|     foreach(_cpu, _all_target_cpu) {
 | |
|       _toolchain = _all_toolchains[_index]
 | |
|       _index = _index + 1
 | |
| 
 | |
|       inputs +=
 | |
|           [ get_label_info("$_arch_binary_target($_toolchain)",
 | |
|                            "target_out_dir") + "/$_cpu/$_arch_binary_output" ]
 | |
| 
 | |
|       deps += [ "$_arch_binary_target($_toolchain)" ]
 | |
|     }
 | |
| 
 | |
|     args = []
 | |
|     if (!use_system_xcode) {
 | |
|       args += [
 | |
|         "--developer_dir",
 | |
|         hermetic_xcode_path,
 | |
|       ]
 | |
|     }
 | |
|     args += [
 | |
|               "xcrun",
 | |
|               "lipo",
 | |
|               "-create",
 | |
|               "-output",
 | |
|               rebase_path("$target_out_dir/$_output_name", root_build_dir),
 | |
|             ] + rebase_path(inputs, root_build_dir)
 | |
| 
 | |
|     if (enable_dsyms) {
 | |
|       _dsyms_output_dir = "$root_out_dir/$_output_name.dSYM"
 | |
|       outputs += [
 | |
|         "$_dsyms_output_dir/",
 | |
|         "$_dsyms_output_dir/Contents/Info.plist",
 | |
|         "$_dsyms_output_dir/Contents/Resources/DWARF/$_output_name",
 | |
|       ]
 | |
|       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 variables (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 += [ "$root_out_dir/$_output_name.unstripped" ]
 | |
|           args += [ "-Wcrl,unstripped," +
 | |
|                     rebase_path("$root_out_dir/.", root_build_dir) ]
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Wrapper around create_bundle taking care of code signature settings.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #   product_type
 | |
| #       string, product type for the generated Xcode project.
 | |
| #
 | |
| #   bundle_deps
 | |
| #       (optional) list of additional dependencies
 | |
| #
 | |
| #   bundle_deps_filter
 | |
| #       (optional) list of dependencies to filter (for more information
 | |
| #       see "gn help bundle_deps_filter")
 | |
| #
 | |
| #   bundle_extension
 | |
| #       string, extension of the bundle, used to generate bundle name.
 | |
| #
 | |
| #   bundle_binary_target
 | |
| #       string, label of the target generating the bundle main binary.
 | |
| #
 | |
| #   bundle_binary_output
 | |
| #       (optional) string, base name of the binary generated by the
 | |
| #       bundle_binary_target target, defaults to the target name.
 | |
| #
 | |
| #   extra_system_frameworks
 | |
| #       (optional) list of system framework to copy to the bundle.
 | |
| #
 | |
| #   enable_code_signing
 | |
| #       (optional) boolean, control whether code signing is enabled or not,
 | |
| #       default to ios_enable_code_signing if not defined.
 | |
| #
 | |
| #   entitlements_path:
 | |
| #       (optional) path to the template to use to generate the application
 | |
| #       entitlements by performing variable substitutions, defaults to
 | |
| #       //build/config/ios/entitlements.plist.
 | |
| #
 | |
| #   entitlements_target:
 | |
| #       (optional) label of the target generating the application
 | |
| #       entitlements (must generate a single file as output); cannot be
 | |
| #       defined if entitlements_path is set.
 | |
| #
 | |
| template("create_signed_bundle") {
 | |
|   assert(defined(invoker.product_type),
 | |
|          "product_type must be defined for $target_name")
 | |
|   assert(defined(invoker.bundle_extension),
 | |
|          "bundle_extension must be defined for $target_name")
 | |
|   assert(defined(invoker.bundle_binary_target),
 | |
|          "bundle_binary_target must be defined for $target_name")
 | |
| 
 | |
|   _target_name = target_name
 | |
|   _output_name = target_name
 | |
|   if (defined(invoker.output_name)) {
 | |
|     _output_name = invoker.output_name
 | |
|   }
 | |
| 
 | |
|   _bundle_binary_target = invoker.bundle_binary_target
 | |
|   _bundle_binary_output = get_label_info(_bundle_binary_target, "name")
 | |
|   if (defined(invoker.bundle_binary_output)) {
 | |
|     _bundle_binary_output = invoker.bundle_binary_output
 | |
|   }
 | |
| 
 | |
|   _bundle_extension = invoker.bundle_extension
 | |
|   _bundle_root_dir = "$root_out_dir/$_output_name$_bundle_extension"
 | |
| 
 | |
|   if (!defined(invoker.entitlements_target)) {
 | |
|     _entitlements_path = "//build/config/ios/entitlements.plist"
 | |
|     if (defined(invoker.entitlements_path)) {
 | |
|       _entitlements_path = invoker.entitlements_path
 | |
|     }
 | |
|   } else {
 | |
|     assert(!defined(invoker.entitlements_path),
 | |
|            "Cannot define both entitlements_path and entitlements_target " +
 | |
|                "for $target_name")
 | |
| 
 | |
|     _entitlements_target_outputs =
 | |
|         get_target_outputs(invoker.entitlements_target)
 | |
|     _entitlements_path = _entitlements_target_outputs[0]
 | |
|   }
 | |
| 
 | |
|   _enable_code_signing = ios_enable_code_signing
 | |
|   if (defined(invoker.enable_code_signing)) {
 | |
|     _enable_code_signing = invoker.enable_code_signing
 | |
|   }
 | |
| 
 | |
|   create_bundle(_target_name) {
 | |
|     forward_variables_from(invoker,
 | |
|                            [
 | |
|                              "bundle_deps_filter",
 | |
|                              "data_deps",
 | |
|                              "deps",
 | |
|                              "product_type",
 | |
|                              "public_configs",
 | |
|                              "public_deps",
 | |
|                              "testonly",
 | |
|                              "visibility",
 | |
|                            ])
 | |
| 
 | |
|     bundle_root_dir = _bundle_root_dir
 | |
|     bundle_resources_dir = _bundle_root_dir
 | |
|     bundle_executable_dir = _bundle_root_dir
 | |
|     bundle_plugins_dir = "$_bundle_root_dir/PlugIns"
 | |
| 
 | |
|     if (!defined(public_deps)) {
 | |
|       public_deps = []
 | |
|     }
 | |
|     public_deps += [ _bundle_binary_target ]
 | |
| 
 | |
|     if (defined(invoker.bundle_deps)) {
 | |
|       if (!defined(deps)) {
 | |
|         deps = []
 | |
|       }
 | |
|       deps += invoker.bundle_deps
 | |
|     }
 | |
|     if (defined(invoker.entitlements_target)) {
 | |
|       if (!defined(deps)) {
 | |
|         deps = []
 | |
|       }
 | |
|       deps += [ invoker.entitlements_target ]
 | |
|     }
 | |
| 
 | |
|     code_signing_script = "//build/config/ios/codesign.py"
 | |
|     code_signing_sources = [
 | |
|       _entitlements_path,
 | |
|       get_label_info(_bundle_binary_target, "target_out_dir") +
 | |
|           "/$_bundle_binary_output",
 | |
|     ]
 | |
|     code_signing_outputs = [ "$_bundle_root_dir/$_output_name" ]
 | |
|     if (_enable_code_signing) {
 | |
|       code_signing_outputs +=
 | |
|           [ "$_bundle_root_dir/_CodeSignature/CodeResources" ]
 | |
|     }
 | |
|     if (ios_code_signing_identity != "" && !use_ios_simulator) {
 | |
|       code_signing_outputs += [ "$_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, "file") ]
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     code_signing_args = []
 | |
|     if (!use_system_xcode) {
 | |
|       code_signing_args += [
 | |
|         "--developer_dir",
 | |
|         hermetic_xcode_path,
 | |
|       ]
 | |
|     }
 | |
|     code_signing_args += [
 | |
|       "code-sign-bundle",
 | |
|       "-t=" + ios_sdk_name,
 | |
|       "-i=" + ios_code_signing_identity,
 | |
|       "-e=" + rebase_path(_entitlements_path, root_build_dir),
 | |
|       "-b=" + rebase_path("$target_out_dir/$_output_name", root_build_dir),
 | |
|       rebase_path(bundle_root_dir, root_build_dir),
 | |
|     ]
 | |
|     if (!_enable_code_signing) {
 | |
|       code_signing_args += [ "--disable-code-signature" ]
 | |
|     }
 | |
|     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 ]
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Generates Info.plist files for Mac apps and frameworks.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #     info_plist:
 | |
| #         (optional) string, path to the Info.plist file that will be used for
 | |
| #         the bundle.
 | |
| #
 | |
| #     info_plist_target:
 | |
| #         (optional) string, if the info_plist is generated from an action,
 | |
| #         rather than a regular source file, specify the target name in lieu
 | |
| #         of info_plist. The two arguments are mutually exclusive.
 | |
| #
 | |
| #     executable_name:
 | |
| #         string, name of the generated target used for the product
 | |
| #         and executable name as specified in the output Info.plist.
 | |
| #
 | |
| #     extra_substitutions:
 | |
| #         (optional) string array, 'key=value' pairs for extra fields which are
 | |
| #         specified in a source Info.plist template.
 | |
| template("ios_info_plist") {
 | |
|   assert(defined(invoker.info_plist) != defined(invoker.info_plist_target),
 | |
|          "Only one of info_plist or info_plist_target may be specified in " +
 | |
|              target_name)
 | |
| 
 | |
|   if (defined(invoker.info_plist)) {
 | |
|     _info_plist = invoker.info_plist
 | |
|   } else {
 | |
|     _info_plist_target_output = get_target_outputs(invoker.info_plist_target)
 | |
|     _info_plist = _info_plist_target_output[0]
 | |
|   }
 | |
| 
 | |
|   info_plist(target_name) {
 | |
|     format = "binary1"
 | |
|     extra_substitutions = []
 | |
|     if (defined(invoker.extra_substitutions)) {
 | |
|       extra_substitutions = invoker.extra_substitutions
 | |
|     }
 | |
|     extra_substitutions += [
 | |
|       "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix",
 | |
|       "IOS_DEPLOYMENT_TARGET=$ios_deployment_target",
 | |
|       "IOS_PLATFORM_BUILD=$ios_platform_build",
 | |
|       "IOS_PLATFORM_NAME=$ios_sdk_name",
 | |
|       "IOS_PLATFORM_VERSION=$ios_sdk_version",
 | |
|       "IOS_SDK_BUILD=$ios_sdk_build",
 | |
|       "IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version",
 | |
|       "IOS_SUPPORTED_PLATFORM=$ios_sdk_platform",
 | |
|     ]
 | |
|     plist_templates = [
 | |
|       "//build/config/ios/BuildInfo.plist",
 | |
|       _info_plist,
 | |
|     ]
 | |
|     if (defined(invoker.info_plist_target)) {
 | |
|       deps = [
 | |
|         invoker.info_plist_target,
 | |
|       ]
 | |
|     }
 | |
|     forward_variables_from(invoker,
 | |
|                            [
 | |
|                              "executable_name",
 | |
|                              "output_name",
 | |
|                              "visibility",
 | |
|                            ])
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Template to build an application bundle for iOS.
 | |
| #
 | |
| # This should be used instead of "executable" built-in target type on iOS.
 | |
| # As the template forward the generation of the application executable to
 | |
| # an "executable" target, all arguments supported by "executable" targets
 | |
| # are also supported by this template.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #   output_name:
 | |
| #       (optional) string, name of the generated application, if omitted,
 | |
| #       defaults to the target_name.
 | |
| #
 | |
| #   extra_substitutions:
 | |
| #       (optional) list of string in "key=value" format, each value will
 | |
| #       be used as an additional variable substitution rule when generating
 | |
| #       the application Info.plist
 | |
| #
 | |
| #   info_plist:
 | |
| #       (optional) string, path to the Info.plist file that will be used for
 | |
| #       the bundle.
 | |
| #
 | |
| #   info_plist_target:
 | |
| #       (optional) string, if the info_plist is generated from an action,
 | |
| #       rather than a regular source file, specify the target name in lieu
 | |
| #       of info_plist. The two arguments are mutually exclusive.
 | |
| #
 | |
| #   entitlements_path:
 | |
| #       (optional) path to the template to use to generate the application
 | |
| #       entitlements by performing variable substitutions, defaults to
 | |
| #       //build/config/ios/entitlements.plist.
 | |
| #
 | |
| #   entitlements_target:
 | |
| #       (optional) label of the target generating the application
 | |
| #       entitlements (must generate a single file as output); cannot be
 | |
| #       defined if entitlements_path is set.
 | |
| #
 | |
| #   bundle_extension:
 | |
| #       (optional) bundle extension including the dot, default to ".app".
 | |
| #
 | |
| #   product_type
 | |
| #       (optional) string, product type for the generated Xcode project,
 | |
| #       default to "com.apple.product-type.application". Should generally
 | |
| #       not be overridden.
 | |
| #
 | |
| #   enable_code_signing
 | |
| #       (optional) boolean, control whether code signing is enabled or not,
 | |
| #       default to ios_enable_code_signing if not defined.
 | |
| #
 | |
| # For more information, see "gn help executable".
 | |
| template("ios_app_bundle") {
 | |
|   _output_name = target_name
 | |
|   _target_name = target_name
 | |
|   if (defined(invoker.output_name)) {
 | |
|     _output_name = invoker.output_name
 | |
|   }
 | |
| 
 | |
|   _arch_executable_source = _target_name + "_arch_executable_sources"
 | |
|   _arch_executable_target = _target_name + "_arch_executable"
 | |
|   _lipo_executable_target = _target_name + "_executable"
 | |
| 
 | |
|   source_set(_arch_executable_source) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "bundle_deps",
 | |
|                              "bundle_deps_filter",
 | |
|                              "bundle_extension",
 | |
|                              "enable_code_signing",
 | |
|                              "entitlements_path",
 | |
|                              "entitlements_target",
 | |
|                              "extra_substitutions",
 | |
|                              "extra_system_frameworks",
 | |
|                              "info_plist",
 | |
|                              "info_plist_target",
 | |
|                              "output_name",
 | |
|                              "product_type",
 | |
|                              "visibility",
 | |
|                            ])
 | |
| 
 | |
|     visibility = [ ":$_arch_executable_target" ]
 | |
|   }
 | |
| 
 | |
|   if (current_toolchain == default_toolchain || use_ios_simulator) {
 | |
|     _generate_entitlements_target = _target_name + "_gen_entitlements"
 | |
|     _generate_entitlements_output =
 | |
|         get_label_info(":$_generate_entitlements_target($default_toolchain)",
 | |
|                        "target_out_dir") + "/$_output_name.xcent"
 | |
|   }
 | |
| 
 | |
|   executable(_arch_executable_target) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "bundle_deps",
 | |
|                              "bundle_deps_filter",
 | |
|                              "bundle_extension",
 | |
|                              "enable_code_signing",
 | |
|                              "entitlements_path",
 | |
|                              "entitlements_target",
 | |
|                              "extra_substitutions",
 | |
|                              "extra_system_frameworks",
 | |
|                              "info_plist",
 | |
|                              "info_plist_target",
 | |
|                              "output_name",
 | |
|                              "product_type",
 | |
|                              "sources",
 | |
|                              "visibility",
 | |
|                            ])
 | |
| 
 | |
|     visibility = [ ":$_lipo_executable_target($default_toolchain)" ]
 | |
|     if (current_toolchain != default_toolchain) {
 | |
|       visibility += [ ":$_target_name" ]
 | |
|     }
 | |
| 
 | |
|     if (!defined(deps)) {
 | |
|       deps = []
 | |
|     }
 | |
|     deps += [ ":$_arch_executable_source" ]
 | |
| 
 | |
|     if (!defined(libs)) {
 | |
|       libs = []
 | |
|     }
 | |
|     libs += [ "UIKit.framework" ]
 | |
| 
 | |
|     if (!defined(ldflags)) {
 | |
|       ldflags = []
 | |
|     }
 | |
|     ldflags += [
 | |
|       "-Xlinker",
 | |
|       "-rpath",
 | |
|       "-Xlinker",
 | |
|       "@executable_path/Frameworks",
 | |
|       "-Xlinker",
 | |
|       "-objc_abi_version",
 | |
|       "-Xlinker",
 | |
|       "2",
 | |
|     ]
 | |
| 
 | |
|     if (use_ios_simulator) {
 | |
|       deps += [ ":$_generate_entitlements_target($default_toolchain)" ]
 | |
| 
 | |
|       if (!defined(inputs)) {
 | |
|         inputs = []
 | |
|       }
 | |
|       inputs += [ _generate_entitlements_output ]
 | |
| 
 | |
|       if (!defined(ldflags)) {
 | |
|         ldflags = []
 | |
|       }
 | |
|       ldflags += [
 | |
|         "-Xlinker",
 | |
|         "-sectcreate",
 | |
|         "-Xlinker",
 | |
|         "__TEXT",
 | |
|         "-Xlinker",
 | |
|         "__entitlements",
 | |
|         "-Xlinker",
 | |
|         rebase_path(_generate_entitlements_output, root_build_dir),
 | |
|       ]
 | |
|     }
 | |
| 
 | |
|     output_name = _output_name
 | |
|     output_prefix_override = true
 | |
|     output_dir = "$target_out_dir/$current_cpu"
 | |
|   }
 | |
| 
 | |
|   if (current_toolchain != default_toolchain) {
 | |
|     # For fat builds, only the default toolchain will generate an application
 | |
|     # bundle. For the other toolchains, the template is only used for building
 | |
|     # the arch-specific binary, thus the default target is just a group().
 | |
| 
 | |
|     group(_target_name) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "visibility",
 | |
|                                "testonly",
 | |
|                              ])
 | |
|       public_deps = [
 | |
|         ":$_arch_executable_target",
 | |
|       ]
 | |
|     }
 | |
|   } else {
 | |
|     lipo_binary(_lipo_executable_target) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "configs",
 | |
|                                "testonly",
 | |
|                              ])
 | |
| 
 | |
|       visibility = [ ":$_target_name" ]
 | |
|       output_name = _output_name
 | |
|       arch_binary_target = ":$_arch_executable_target"
 | |
|       arch_binary_output = _output_name
 | |
|     }
 | |
| 
 | |
|     _generate_info_plist = target_name + "_generate_info_plist"
 | |
|     ios_info_plist(_generate_info_plist) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "extra_substitutions",
 | |
|                                "info_plist",
 | |
|                                "info_plist_target",
 | |
|                              ])
 | |
| 
 | |
|       executable_name = _output_name
 | |
|     }
 | |
| 
 | |
|     if (current_toolchain == default_toolchain) {
 | |
|       if (!defined(invoker.entitlements_target)) {
 | |
|         _entitlements_path = "//build/config/ios/entitlements.plist"
 | |
|         if (defined(invoker.entitlements_path)) {
 | |
|           _entitlements_path = invoker.entitlements_path
 | |
|         }
 | |
|       } else {
 | |
|         assert(!defined(invoker.entitlements_path),
 | |
|                "Cannot define both entitlements_path and entitlements_target" +
 | |
|                    "for $_target_name")
 | |
| 
 | |
|         _entitlements_target_outputs =
 | |
|             get_target_outputs(invoker.entitlements_target)
 | |
|         _entitlements_path = _entitlements_target_outputs[0]
 | |
|       }
 | |
| 
 | |
|       action(_generate_entitlements_target) {
 | |
|         _gen_info_plist_outputs = get_target_outputs(":$_generate_info_plist")
 | |
|         _info_plist_path = _gen_info_plist_outputs[0]
 | |
| 
 | |
|         script = "//build/config/ios/codesign.py"
 | |
|         deps = [
 | |
|           ":$_generate_info_plist",
 | |
|         ]
 | |
|         if (defined(invoker.entitlements_target)) {
 | |
|           deps += [ invoker.entitlements_target ]
 | |
|         }
 | |
|         sources = [
 | |
|           _entitlements_path,
 | |
|           _info_plist_path,
 | |
|         ]
 | |
|         outputs = [
 | |
|           _generate_entitlements_output,
 | |
|         ]
 | |
| 
 | |
|         args = []
 | |
|         if (!use_system_xcode) {
 | |
|           args += [
 | |
|             "--developer_dir",
 | |
|             hermetic_xcode_path,
 | |
|           ]
 | |
|         }
 | |
|         args += [
 | |
|                   "generate-entitlements",
 | |
|                   "-e=" + rebase_path(_entitlements_path, root_build_dir),
 | |
|                   "-p=" + rebase_path(_info_plist_path, root_build_dir),
 | |
|                 ] + rebase_path(outputs, root_build_dir)
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     _bundle_data_info_plist = target_name + "_bundle_data_info_plist"
 | |
|     bundle_data(_bundle_data_info_plist) {
 | |
|       forward_variables_from(invoker, [ "testonly" ])
 | |
| 
 | |
|       sources = get_target_outputs(":$_generate_info_plist")
 | |
|       outputs = [
 | |
|         "{{bundle_root_dir}}/Info.plist",
 | |
|       ]
 | |
|       public_deps = [
 | |
|         ":$_generate_info_plist",
 | |
|       ]
 | |
|     }
 | |
| 
 | |
|     create_signed_bundle(_target_name) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "bundle_deps",
 | |
|                                "bundle_deps_filter",
 | |
|                                "bundle_extension",
 | |
|                                "data_deps",
 | |
|                                "deps",
 | |
|                                "enable_code_signing",
 | |
|                                "entitlements_path",
 | |
|                                "entitlements_target",
 | |
|                                "extra_system_frameworks",
 | |
|                                "product_type",
 | |
|                                "public_configs",
 | |
|                                "public_deps",
 | |
|                                "testonly",
 | |
|                                "visibility",
 | |
|                              ])
 | |
| 
 | |
|       output_name = _output_name
 | |
|       bundle_binary_target = ":$_lipo_executable_target"
 | |
|       bundle_binary_output = _output_name
 | |
| 
 | |
|       if (!defined(bundle_deps)) {
 | |
|         bundle_deps = []
 | |
|       }
 | |
|       bundle_deps += [ ":$_bundle_data_info_plist" ]
 | |
| 
 | |
|       if (use_ios_simulator) {
 | |
|         if (!defined(data_deps)) {
 | |
|           data_deps = []
 | |
|         }
 | |
|         data_deps += [ "//testing/iossim" ]
 | |
|       }
 | |
| 
 | |
|       if (!defined(product_type)) {
 | |
|         product_type = "com.apple.product-type.application"
 | |
|       }
 | |
| 
 | |
|       if (!defined(bundle_extension)) {
 | |
|         bundle_extension = ".app"
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| set_defaults("ios_app_bundle") {
 | |
|   configs = default_executable_configs
 | |
| }
 | |
| 
 | |
| # Template to build an application extension bundle for iOS.
 | |
| #
 | |
| # This should be used instead of "executable" built-in target type on iOS.
 | |
| # As the template forward the generation of the application executable to
 | |
| # an "executable" target, all arguments supported by "executable" targets
 | |
| # are also supported by this template.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #   output_name:
 | |
| #       (optional) string, name of the generated application, if omitted,
 | |
| #       defaults to the target_name.
 | |
| #
 | |
| #   extra_substitutions:
 | |
| #       (optional) list of string in "key=value" format, each value will
 | |
| #       be used as an additional variable substitution rule when generating
 | |
| #       the application Info.plist
 | |
| #
 | |
| #   info_plist:
 | |
| #       (optional) string, path to the Info.plist file that will be used for
 | |
| #       the bundle.
 | |
| #
 | |
| #   info_plist_target:
 | |
| #       (optional) string, if the info_plist is generated from an action,
 | |
| #       rather than a regular source file, specify the target name in lieu
 | |
| #       of info_plist. The two arguments are mutually exclusive.
 | |
| #
 | |
| # For more information, see "gn help executable".
 | |
| template("ios_appex_bundle") {
 | |
|   ios_app_bundle(target_name) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "bundle_extension",
 | |
|                              "product_type",
 | |
|                            ])
 | |
|     bundle_extension = ".appex"
 | |
|     product_type = "com.apple.product-type.app-extension"
 | |
| 
 | |
|     # Add linker flags required for an application extension (determined by
 | |
|     # inspecting the link command-line when using Xcode 9.0+).
 | |
|     if (!defined(ldflags)) {
 | |
|       ldflags = []
 | |
|     }
 | |
|     ldflags += [
 | |
|       "-e",
 | |
|       "_NSExtensionMain",
 | |
|       "-fapplication-extension",
 | |
|     ]
 | |
|   }
 | |
| }
 | |
| 
 | |
| set_defaults("ios_appex_bundle") {
 | |
|   configs = default_executable_configs
 | |
| }
 | |
| 
 | |
| # Compile a xib or storyboard file and add it to a bundle_data so that it is
 | |
| # available at runtime in the bundle.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #   source:
 | |
| #       string, path of the xib or storyboard to compile.
 | |
| #
 | |
| # Forwards all variables to the bundle_data target.
 | |
| template("bundle_data_xib") {
 | |
|   assert(defined(invoker.source), "source needs to be defined for $target_name")
 | |
| 
 | |
|   _source_extension = get_path_info(invoker.source, "extension")
 | |
|   assert(_source_extension == "xib" || _source_extension == "storyboard",
 | |
|          "source must be a .xib or .storyboard for $target_name")
 | |
| 
 | |
|   _target_name = target_name
 | |
|   _compile_xib = target_name + "_compile_xib"
 | |
| 
 | |
|   compile_xibs(_compile_xib) {
 | |
|     sources = [
 | |
|       invoker.source,
 | |
|     ]
 | |
|     visibility = [ ":$_target_name" ]
 | |
|     ibtool_flags = [
 | |
|       "--minimum-deployment-target",
 | |
|       ios_deployment_target,
 | |
|       "--auto-activate-custom-fonts",
 | |
|       "--target-device",
 | |
|       "iphone",
 | |
|       "--target-device",
 | |
|       "ipad",
 | |
|     ]
 | |
|   }
 | |
| 
 | |
|   bundle_data(_target_name) {
 | |
|     forward_variables_from(invoker, "*", [ "source" ])
 | |
| 
 | |
|     if (!defined(public_deps)) {
 | |
|       public_deps = []
 | |
|     }
 | |
|     public_deps += [ ":$_compile_xib" ]
 | |
| 
 | |
|     sources = get_target_outputs(":$_compile_xib")
 | |
| 
 | |
|     outputs = [
 | |
|       "{{bundle_resources_dir}}/{{source_file_part}}",
 | |
|     ]
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Compile a strings file and add it to a bundle_data so that it is available
 | |
| # at runtime in the bundle.
 | |
| #
 | |
| # Arguments
 | |
| #
 | |
| #   source:
 | |
| #       string, path of the strings file to compile.
 | |
| #
 | |
| #   output:
 | |
| #       string, path of the compiled file in the final bundle.
 | |
| #
 | |
| # Forwards all variables to the bundle_data target.
 | |
| template("bundle_data_strings") {
 | |
|   assert(defined(invoker.source), "source needs to be defined for $target_name")
 | |
|   assert(defined(invoker.output), "output needs to be defined for $target_name")
 | |
| 
 | |
|   _source_extension = get_path_info(invoker.source, "extension")
 | |
|   assert(_source_extension == "strings",
 | |
|          "source must be a .strings for $target_name")
 | |
| 
 | |
|   _target_name = target_name
 | |
|   _convert_target = target_name + "_compile_strings"
 | |
| 
 | |
|   convert_plist(_convert_target) {
 | |
|     visibility = [ ":$_target_name" ]
 | |
|     source = invoker.source
 | |
|     output =
 | |
|         "$target_gen_dir/$_target_name/" + get_path_info(invoker.source, "file")
 | |
|     format = "binary1"
 | |
|   }
 | |
| 
 | |
|   bundle_data(_target_name) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "source",
 | |
|                              "output",
 | |
|                            ])
 | |
| 
 | |
|     if (!defined(public_deps)) {
 | |
|       public_deps = []
 | |
|     }
 | |
|     public_deps += [ ":$_convert_target" ]
 | |
| 
 | |
|     sources = get_target_outputs(":$_convert_target")
 | |
| 
 | |
|     outputs = [
 | |
|       invoker.output,
 | |
|     ]
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Template to package a shared library into an iOS framework bundle.
 | |
| #
 | |
| # 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:
 | |
| #         (optional) string, name of the generated framework without the
 | |
| #         .framework suffix. If omitted, defaults to target_name.
 | |
| #
 | |
| #     public_headers:
 | |
| #         (optional) list of paths to header file that needs to be copied
 | |
| #         into the framework bundle Headers subdirectory. If omitted or
 | |
| #         empty then the Headers subdirectory is not created.
 | |
| #
 | |
| #     sources
 | |
| #         (optional) list of files. Needs to be defined and non-empty if
 | |
| #         public_headers is defined and non-empty.
 | |
| #
 | |
| #   enable_code_signing
 | |
| #       (optional) boolean, control whether code signing is enabled or not,
 | |
| #       default to ios_enable_code_signing if not defined.
 | |
| #
 | |
| # 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") {
 | |
|   _target_name = target_name
 | |
|   _output_name = target_name
 | |
|   if (defined(invoker.output_name)) {
 | |
|     _output_name = invoker.output_name
 | |
|   }
 | |
| 
 | |
|   _has_public_headers =
 | |
|       defined(invoker.public_headers) && invoker.public_headers != []
 | |
| 
 | |
|   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"
 | |
|   }
 | |
| 
 | |
|   _arch_shared_library_source = _target_name + "_arch_shared_library_sources"
 | |
|   _arch_shared_library_target = _target_name + "_arch_shared_library"
 | |
|   _lipo_shared_library_target = _target_name + "_shared_library"
 | |
| 
 | |
|   source_set(_arch_shared_library_source) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "bundle_deps",
 | |
|                              "bundle_deps_filter",
 | |
|                              "data_deps",
 | |
|                              "enable_code_signing",
 | |
|                              "info_plist",
 | |
|                              "info_plist_target",
 | |
|                              "output_name",
 | |
|                              "visibility",
 | |
|                            ])
 | |
| 
 | |
|     visibility = [ ":$_arch_shared_library_target" ]
 | |
| 
 | |
|     if (_has_public_headers) {
 | |
|       configs += [
 | |
|         ":$_framework_headers_config($default_toolchain)",
 | |
|         ":$_headers_map_config($default_toolchain)",
 | |
|       ]
 | |
| 
 | |
|       if (!defined(deps)) {
 | |
|         deps = []
 | |
|       }
 | |
|       deps += [ ":$_framework_headers_target($default_toolchain)" ]
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   shared_library(_arch_shared_library_target) {
 | |
|     forward_variables_from(invoker,
 | |
|                            "*",
 | |
|                            [
 | |
|                              "bundle_deps",
 | |
|                              "bundle_deps_filter",
 | |
|                              "data_deps",
 | |
|                              "enable_code_signing",
 | |
|                              "info_plist",
 | |
|                              "info_plist_target",
 | |
|                              "output_name",
 | |
|                              "sources",
 | |
|                              "visibility",
 | |
|                            ])
 | |
| 
 | |
|     visibility = [ ":$_lipo_shared_library_target($default_toolchain)" ]
 | |
|     if (current_toolchain != default_toolchain) {
 | |
|       visibility += [ ":$_target_name" ]
 | |
|     }
 | |
| 
 | |
|     if (!defined(deps)) {
 | |
|       deps = []
 | |
|     }
 | |
|     deps += [ ":$_arch_shared_library_source" ]
 | |
| 
 | |
|     if (!defined(ldflags)) {
 | |
|       ldflags = []
 | |
|     }
 | |
|     ldflags += [
 | |
|       "-Xlinker",
 | |
|       "-install_name",
 | |
|       "-Xlinker",
 | |
|       "@rpath/$_output_name.framework/$_output_name",
 | |
|       "-Xlinker",
 | |
|       "-objc_abi_version",
 | |
|       "-Xlinker",
 | |
|       "2",
 | |
|     ]
 | |
| 
 | |
|     output_extension = ""
 | |
|     output_name = _output_name
 | |
|     output_prefix_override = true
 | |
|     output_dir = "$target_out_dir/$current_cpu"
 | |
|   }
 | |
| 
 | |
|   if (current_toolchain != default_toolchain) {
 | |
|     # For fat builds, only the default toolchain will generate a framework
 | |
|     # bundle. For the other toolchains, the template is only used for building
 | |
|     # the arch-specific binary, thus the default target is just a group().
 | |
| 
 | |
|     group(_target_name) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "visibility",
 | |
|                                "testonly",
 | |
|                              ])
 | |
|       public_deps = [
 | |
|         ":$_arch_shared_library_target",
 | |
|       ]
 | |
|     }
 | |
| 
 | |
|     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_root = "$root_out_dir/$_output_name.framework"
 | |
| 
 | |
|       _header_map_filename = "$target_gen_dir/$_output_name.headers.hmap"
 | |
| 
 | |
|       _compile_headers_map_target = _target_name + "_compile_headers_map"
 | |
|       action(_compile_headers_map_target) {
 | |
|         visibility = [ ":$_framework_headers_target" ]
 | |
|         script = "//build/config/ios/write_framework_hmap.py"
 | |
|         outputs = [
 | |
|           _header_map_filename,
 | |
|         ]
 | |
| 
 | |
|         # The header map generation only wants the list of headers, not all of
 | |
|         # sources, so filter any non-header source files from "sources". It is
 | |
|         # less error prone that having the developer duplicate the list of all
 | |
|         # headers in addition to "sources".
 | |
|         set_sources_assignment_filter([
 | |
|                                         "*.c",
 | |
|                                         "*.cc",
 | |
|                                         "*.cpp",
 | |
|                                         "*.m",
 | |
|                                         "*.mm",
 | |
|                                       ])
 | |
|         sources = invoker.sources
 | |
|         set_sources_assignment_filter([])
 | |
| 
 | |
|         args = [
 | |
|                  rebase_path(_header_map_filename),
 | |
|                  rebase_path(_framework_root, root_build_dir),
 | |
|                ] + rebase_path(sources, root_build_dir)
 | |
|       }
 | |
| 
 | |
|       _create_module_map_target = _target_name + "_module_map"
 | |
|       action(_create_module_map_target) {
 | |
|         visibility = [ ":$_framework_headers_target" ]
 | |
|         script = "//build/config/ios/write_framework_modulemap.py"
 | |
|         outputs = [
 | |
|           "$_framework_root/Modules/module.modulemap",
 | |
|         ]
 | |
|         args = [ rebase_path("$_framework_root", root_build_dir) ]
 | |
|       }
 | |
| 
 | |
|       _copy_public_headers_target = _target_name + "_copy_public_headers"
 | |
|       copy(_copy_public_headers_target) {
 | |
|         visibility = [ ":$_framework_headers_target" ]
 | |
|         sources = _public_headers
 | |
|         outputs = [
 | |
|           "$_framework_root/Headers/{{source_file_part}}",
 | |
|         ]
 | |
|       }
 | |
| 
 | |
|       config(_headers_map_config) {
 | |
|         visibility = [ ":$_target_name" ]
 | |
|         include_dirs = [ _header_map_filename ]
 | |
|       }
 | |
| 
 | |
|       group(_framework_headers_target) {
 | |
|         deps = [
 | |
|           ":$_compile_headers_map_target",
 | |
|           ":$_copy_public_headers_target",
 | |
|           ":$_create_module_map_target",
 | |
|         ]
 | |
|       }
 | |
| 
 | |
|       config(_framework_headers_config) {
 | |
|         # The link settings are inherited from the framework_bundle config.
 | |
|         cflags = [
 | |
|           "-F",
 | |
|           rebase_path("$root_out_dir/.", root_build_dir),
 | |
|         ]
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     lipo_binary(_lipo_shared_library_target) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "configs",
 | |
|                                "testonly",
 | |
|                              ])
 | |
| 
 | |
|       visibility = [ ":$_target_name" ]
 | |
|       output_name = _output_name
 | |
|       arch_binary_target = ":$_arch_shared_library_target"
 | |
|       arch_binary_output = _output_name
 | |
|     }
 | |
| 
 | |
|     _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 = [ ":$_target_name" ]
 | |
|       ldflags = [
 | |
|         "-F",
 | |
|         rebase_path("$root_out_dir/.", root_build_dir),
 | |
|       ]
 | |
|       lib_dirs = [ root_out_dir ]
 | |
|       libs = [ "$_output_name.framework" ]
 | |
|     }
 | |
| 
 | |
|     _info_plist_target = _target_name + "_info_plist"
 | |
|     _info_plist_bundle = _target_name + "_info_plist_bundle"
 | |
|     ios_info_plist(_info_plist_target) {
 | |
|       visibility = [ ":$_info_plist_bundle" ]
 | |
|       executable_name = _output_name
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "extra_substitutions",
 | |
|                                "info_plist",
 | |
|                                "info_plist_target",
 | |
|                              ])
 | |
|     }
 | |
| 
 | |
|     bundle_data(_info_plist_bundle) {
 | |
|       visibility = [ ":$_target_name" ]
 | |
|       forward_variables_from(invoker, [ "testonly" ])
 | |
|       sources = get_target_outputs(":$_info_plist_target")
 | |
|       outputs = [
 | |
|         "{{bundle_root_dir}}/Info.plist",
 | |
|       ]
 | |
|       public_deps = [
 | |
|         ":$_info_plist_target",
 | |
|       ]
 | |
|     }
 | |
| 
 | |
|     create_signed_bundle(_target_name) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "bundle_deps",
 | |
|                                "bundle_deps_filter",
 | |
|                                "data_deps",
 | |
|                                "deps",
 | |
|                                "enable_code_signing",
 | |
|                                "public_configs",
 | |
|                                "public_deps",
 | |
|                                "testonly",
 | |
|                                "visibility",
 | |
|                              ])
 | |
| 
 | |
|       product_type = "com.apple.product-type.framework"
 | |
|       bundle_extension = ".framework"
 | |
| 
 | |
|       output_name = _output_name
 | |
|       bundle_binary_target = ":$_lipo_shared_library_target"
 | |
|       bundle_binary_output = _output_name
 | |
| 
 | |
|       if (!defined(deps)) {
 | |
|         deps = []
 | |
|       }
 | |
|       deps += [ ":$_info_plist_bundle" ]
 | |
|     }
 | |
| 
 | |
|     group(_target_name + "+link") {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "public_deps",
 | |
|                                "public_configs",
 | |
|                                "testonly",
 | |
|                                "visibility",
 | |
|                              ])
 | |
|       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" ]
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     bundle_data(_target_name + "+bundle") {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "testonly",
 | |
|                                "visibility",
 | |
|                              ])
 | |
|       public_deps = [
 | |
|         ":$_target_name",
 | |
|       ]
 | |
|       sources = [
 | |
|         "$root_out_dir/$_output_name.framework",
 | |
|       ]
 | |
|       outputs = [
 | |
|         "{{bundle_resources_dir}}/Frameworks/$_output_name.framework",
 | |
|       ]
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| 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
 | |
|   }
 | |
| 
 | |
|   _xctest_target = _target_name + "_module"
 | |
|   _xctest_output = _output_name + "_module"
 | |
| 
 | |
|   _host_target = _target_name
 | |
|   _host_output = _output_name
 | |
| 
 | |
|   _xctest_arch_loadable_module_target = _xctest_target + "_arch_loadable_module"
 | |
|   _xctest_lipo_loadable_module_target = _xctest_target + "_loadable_module"
 | |
| 
 | |
|   loadable_module(_xctest_arch_loadable_module_target) {
 | |
|     visibility = [ ":$_xctest_lipo_loadable_module_target($default_toolchain)" ]
 | |
|     if (current_toolchain != default_toolchain) {
 | |
|       visibility += [ ":$_xctest_target" ]
 | |
|     }
 | |
| 
 | |
|     sources = [
 | |
|       "//build/config/ios/xctest_shell.mm",
 | |
|     ]
 | |
|     configs += [ "//build/config/ios:xctest_config" ]
 | |
| 
 | |
|     output_dir = "$target_out_dir/$current_cpu"
 | |
|     output_name = _xctest_output
 | |
|     output_prefix_override = true
 | |
|     output_extension = ""
 | |
|   }
 | |
| 
 | |
|   if (current_toolchain != default_toolchain) {
 | |
|     # For fat builds, only the default toolchain will generate a test bundle.
 | |
|     # For the other toolchains, the template is only used for building the
 | |
|     # arch-specific binary, thus the default target is just a group().
 | |
|     group(_xctest_target) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "visibility",
 | |
|                                "testonly",
 | |
|                              ])
 | |
|       public_deps = [
 | |
|         ":$_xctest_arch_loadable_module_target",
 | |
|       ]
 | |
|     }
 | |
|   } 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"
 | |
|       extra_substitutions = [ "MODULE_NAME=$_xctest_output" ]
 | |
|       executable_name = _host_output
 | |
|     }
 | |
| 
 | |
|     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",
 | |
|       ]
 | |
|     }
 | |
| 
 | |
|     lipo_binary(_xctest_lipo_loadable_module_target) {
 | |
|       forward_variables_from(invoker,
 | |
|                              [
 | |
|                                "configs",
 | |
|                                "testonly",
 | |
|                              ])
 | |
| 
 | |
|       visibility = [ ":$_xctest_target" ]
 | |
|       output_name = _xctest_output
 | |
|       arch_binary_target = ":$_xctest_arch_loadable_module_target"
 | |
|       arch_binary_output = _xctest_output
 | |
|     }
 | |
| 
 | |
|     _xctest_bundle = _xctest_target + "_bundle"
 | |
|     create_signed_bundle(_xctest_target) {
 | |
|       forward_variables_from(invoker, [ "enable_code_signing" ])
 | |
|       visibility = [ ":$_xctest_bundle" ]
 | |
| 
 | |
|       product_type = "com.apple.product-type.bundle.unit-test"
 | |
|       bundle_extension = ".xctest"
 | |
| 
 | |
|       output_name = _xctest_output
 | |
|       bundle_binary_target = ":$_xctest_lipo_loadable_module_target"
 | |
|       bundle_binary_output = _xctest_output
 | |
| 
 | |
|       deps = [
 | |
|         ":$_xctest_info_plist_bundle",
 | |
|       ]
 | |
|     }
 | |
| 
 | |
|     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
 | |
|     configs += [ "//build/config/ios:xctest_config" ]
 | |
| 
 | |
|     if (!defined(invoker.info_plist) && !defined(invoker.info_plist_target)) {
 | |
|       info_plist = "//build/config/ios/Host-Info.plist"
 | |
|     }
 | |
| 
 | |
|     # 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 (current_toolchain == default_toolchain) {
 | |
|       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
 | |
| }
 |