Chromium Code Reviews| Index: build/config/ios/rules.gni |
| diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni |
| index c18c06554e94f6d62c573c2c1048e809c84ad0f1..2089d1fb4288a568ef30204f518610aeb1aeb9c4 100644 |
| --- a/build/config/ios/rules.gni |
| +++ b/build/config/ios/rules.gni |
| @@ -2,190 +2,158 @@ |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| -ios_app_script = "//build/config/ios/ios_app.py" |
| +import("//build/config/ios/ios_sdk.gni") |
| + |
| +# TODO(crbug.com/297668): refactor this template to extract common behaviour |
| +# between OS X and iOS bundle generation, then create a generic "app" template |
| +# that forward to "executable" on all platform except iOS/OS X. |
| + |
| +# 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 |
| +# |
| +# app_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: |
| +# path to the template to use to generate the application Info.plist |
| +# by performing variable substitutions. |
| +# |
| +# For more information, see "gn help executable". |
| +template("app") { |
| + assert(defined(invoker.info_plist), |
| + "info_plist must be specified for target $target_name") |
| -template("code_sign_ios") { |
| - assert(defined(invoker.entitlements_path), |
| - "The path to the entitlements .xcent file") |
| - assert(defined(invoker.identity), "The code signing identity") |
| - assert(defined(invoker.application_path), "The application to code sign") |
| - assert(defined(invoker.deps)) |
| + _app_name = target_name |
| + _target_name = target_name |
| + if (defined(invoker.app_name)) { |
| + _app_name = invoker.app_name |
| + } |
| - action(target_name) { |
| + _generate_info_plist = target_name + "_generate_info_plist" |
| + _bundle_data_info_plist = target_name + "_bundle_data_info_plist" |
| + |
| + action(_generate_info_plist) { |
| + visibility = [ ":$_bundle_data_info_plist" ] |
| + script = "//build/config/ios/ios_gen_plist.py" |
| sources = [ |
| - invoker.entitlements_path, |
| + "//build/config/ios/BuildInfo.plist", |
| + invoker.info_plist, |
| ] |
| - |
| - _application_path = invoker.application_path |
| - |
| - script = ios_app_script |
| - |
| outputs = [ |
| - "$_application_path/_CodeSignature/CodeResources", |
| - ] |
| - |
| - args = [ |
| - "codesign", |
| - "-p", |
| - rebase_path(invoker.application_path, root_build_dir), |
| - "-i", |
| - invoker.identity, |
| - "-e", |
| - rebase_path(invoker.entitlements_path, root_build_dir), |
| + "$target_gen_dir/$target_name/Info.plist", |
| ] |
| - |
| - forward_variables_from(invoker, |
| - [ |
| - "deps", |
| - "public_deps", |
| - "testonly", |
| - ]) |
| + extra_args = [] |
| + if (defined(invoker.extra_substitutions)) { |
| + foreach(substitution, invoker.extra_substitutions) { |
| + extra_args += [ "-s=$substitution" ] |
| + } |
| + } |
| + args = extra_args + [ |
| + "-s=BUILD_MACHINE_OS_BUILD=$machine_os_build", |
| + "-s=EXECUTABLE_NAME=$_app_name", |
| + "-s=GCC_VERSION=com.apple.compilers.llvm.clang.1_0", |
| + "-s=IOS_DEPLOYMENT_TARGET=$ios_deployment_target", |
| + "-s=IOS_PLATFORM_BUILD=$ios_platform_build", |
| + "-s=IOS_PLATFORM_NAME=$ios_sdk_name", |
| + "-s=IOS_PLATFORM_VERSION=$ios_sdk_version", |
| + "-s=IOS_SDK_BUILD=$ios_sdk_build", |
| + "-s=IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version", |
| + "-s=IOS_SUPPORTED_PLATFORM=$ios_sdk_platform", |
| + "-s=PRODUCT_NAME=$_app_name", |
| + "-s=XCODE_BUILD=$xcode_build", |
| + "-s=XCODE_VERSION=$xcode_version", |
| + "-o=" + rebase_path(outputs[0], root_build_dir), |
| + ] + rebase_path(sources, root_build_dir) |
| } |
| -} |
| - |
| -# TODO(GYP), TODO(dpranke): Should this be part of ios_app? |
| -template("resource_copy_ios") { |
| - assert(defined(invoker.resources), |
| - "The source list of resources to copy over") |
| - assert(defined(invoker.bundle_directory), |
| - "The directory within the bundle to place the sources in") |
| - assert(defined(invoker.app_name), "The name of the application") |
| - _bundle_directory = invoker.bundle_directory |
| - _app_name = invoker.app_name |
| - _resources = invoker.resources |
| - |
| - copy(target_name) { |
| - set_sources_assignment_filter([]) |
| - sources = _resources |
| + bundle_data(_bundle_data_info_plist) { |
| + forward_variables_from(invoker, [ "testonly" ]) |
| + visibility = [ ":$_target_name" ] |
| + sources = get_target_outputs(":$_generate_info_plist") |
| outputs = [ |
| - "$root_build_dir/$_app_name.app/$_bundle_directory/{{source_file_part}}", |
| + "{{bundle_root_dir}}/Info.plist", |
| + ] |
| + public_deps = [ |
| + ":$_generate_info_plist", |
| ] |
| } |
| -} |
| - |
| -template("ios_app") { |
| - assert(defined(invoker.deps), |
| - "Dependencies must be specified for $target_name") |
| - assert(defined(invoker.info_plist), |
| - "The application plist file must be specified for $target_name") |
| - assert(defined(invoker.entitlements_path), |
| - "The entitlements path must be specified for $target_name") |
| - assert(defined(invoker.code_signing_identity), |
| - "The code_signing_identity must be specified for $target_name") |
| - |
| - # We just create a variable so we can use the same in interpolation |
| - if (defined(invoker.app_name)) { |
| - _app_name = invoker.app_name |
| - } else { |
| - _app_name = target_name |
| - } |
| - |
| - forward_variables_from(invoker, [ "testonly" ]) |
| - |
| - plist_gen_target_name = target_name + "_plist" |
| - bin_gen_target_name = target_name + "_bin" |
| - group_target_name = target_name |
| - # Generate the executable |
| - executable(bin_gen_target_name) { |
| - visibility = [ ":$group_target_name" ] |
| - |
| - output_name = "${_app_name}.app/${_app_name}" |
| + _generate_executable = target_name + "_generate_executable" |
| + _bundle_data_executable = target_name + "_bundle_data_executable" |
| + executable(_generate_executable) { |
| + visibility = [ ":$_bundle_data_executable" ] |
| forward_variables_from(invoker, |
| + "*", |
| [ |
| - "all_dependent_configs", |
| - "allow_circular_includes_from", |
| - "cflags", |
| - "cflags_c", |
| - "cflags_cc", |
| - "cflags_objc", |
| - "cflags_objcc", |
| - "configs", |
| - "check_includes", |
| - "data", |
| + "app_name", |
| + "code_signing_identity", |
| "data_deps", |
| - "defines", |
| - "include_dirs", |
| - "ldflags", |
| - "public", |
| - "public_configs", |
| - "public_deps", |
| - "sources", |
| + "entitlements_path", |
| + "info_plist", |
| + "visibility", |
| ]) |
| - if (defined(invoker.libs)) { |
| - libs = invoker.libs |
| - } else { |
| + output_name = rebase_path("$target_gen_dir/$_app_name", root_build_dir) |
| + if (!defined(libs)) { |
| libs = [] |
| } |
| - libs += [ |
| - "UIKit.framework", |
| - "QuartzCore.framework", |
| - "OpenGLES.framework", |
| - ] |
| - |
| - if (defined(invoker.deps)) { |
| - deps = invoker.deps |
| - } else { |
| - deps = [] |
| - } |
| - deps += [ ":$plist_gen_target_name" ] |
| + libs += [ "UIKit.framework" ] |
| } |
| - # Process the Info.plist |
| - action(plist_gen_target_name) { |
| - visibility = [ |
| - ":$group_target_name", |
| - ":$bin_gen_target_name", |
| - ] |
| - |
| - script = ios_app_script |
| - |
| + bundle_data(_bundle_data_executable) { |
| + forward_variables_from(invoker, [ "testonly" ]) |
| + visibility = [ ":$_target_name" ] |
| sources = [ |
| - invoker.info_plist, |
| + "$target_gen_dir/$_app_name", |
| ] |
| outputs = [ |
| - "$root_build_dir/${_app_name}.app/Info.plist", |
| + "{{bundle_executable_dir}}/$_app_name", |
| ] |
| - |
| - args = [ |
| - "plist", |
| - "-i", |
| - rebase_path(invoker.info_plist, root_build_dir), |
| - "-o", |
| - rebase_path("$root_build_dir/${_app_name}.app"), |
| + public_deps = [ |
| + ":$_generate_executable", |
| ] |
| } |
| - # Perform Code Signing |
| - entitlements_path = invoker.entitlements_path |
| - if (invoker.code_signing_identity != "") { |
| - code_sign_gen_target_name = target_name + "_codesign" |
| - code_sign_ios(code_sign_gen_target_name) { |
| - visibility = [ ":$target_name" ] |
| + create_bundle(target_name) { |
| + forward_variables_from(invoker, |
| + [ |
| + "data_deps", |
| + "deps", |
| + "public_deps", |
| + "testonly", |
| + "visibility", |
| + ]) |
| - identity = invoker.code_signing_identity |
| - application_path = "$root_build_dir/$app_name.app" |
| - deps = [ |
| - ":$bin_gen_target_name", |
| - ":$plist_gen_target_name", |
| - ] |
| + if (!defined(deps)) { |
| + deps = [] |
| } |
| - } else { |
| - # This avoids a potential unused variable warning in the caller. |
| - entitlements_path = entitlements_path |
| - } |
| - |
| - # Top level group |
| - group(target_name) { |
| - deps = [ |
| - ":$bin_gen_target_name", |
| - ":$plist_gen_target_name", |
| + deps += [ |
| + ":$_bundle_data_executable", |
| + ":$_bundle_data_info_plist", |
| ] |
| - if (invoker.code_signing_identity != "") { |
| - deps += [ ":$code_sign_gen_target_name" ] |
| - } |
| + |
| + bundle_root_dir = "$root_out_dir/$_app_name.app" |
| + bundle_resources_dir = bundle_root_dir |
| + bundle_executable_dir = bundle_root_dir |
| + bundle_plugins_dir = "$bundle_root_dir/Plugins" |
| } |
| + |
| + # TODO(crbug.com/297668): |
| + # - add support for codesigning, |
| + # - find a way to make "ninja -C out/Default base_unittest.app" work |
|
Dirk Pranke
2016/03/11 20:56:21
This should actually be `base_unittests.app`, righ
sdefresne
2016/03/14 09:52:48
Right.
|
| + # - implement //testing/iossim(//build/toolchain/mac:clang_x64) and then |
| + # add a depency to that target. |
| } |