Index: build/config/ios/rules.gni |
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni |
index 7d9cfa204cd4d351a5fc0419714941188a81a916..d4898cda03fe00267c13bde18d84ac7bea0419c8 100644 |
--- a/build/config/ios/rules.gni |
+++ b/build/config/ios/rules.gni |
@@ -2,191 +2,162 @@ |
# 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" ] |
+ } |
+ } |
+ response_file_contents = |
+ 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) |
+ args = [ "@{{response_file_name}}" ] |
} |
-} |
- |
-# 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) { |
- forward_variables_from(invoker, [ "visibility" ]) |
- 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_unittests.app" work as |
+ # an alias to "ninja -C out/Default base_unittests" (for convenience |
+ # and compatibility with gyp), |
+ # - implement //testing/iossim(//build/toolchain/mac:clang_x64) and then |
+ # add a depency to that target. |
} |