blob: 5d8ca1f0b6658681d94136d5dc1256d2dd8b408c [file] [log] [blame]
# Copyright 2019 Google LLC.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("skia.gni")
if (is_ios) {
# Template to compile .xib and .storyboard files.
#
# Arguments
#
# sources:
# list of string, sources to compile
#
# ibtool_flags:
# (optional) list of string, additional flags to pass to the ibtool
template("compile_ib_files") {
action_foreach(target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
assert(defined(invoker.sources),
"sources must be specified for $target_name")
assert(defined(invoker.output_extension),
"output_extension must be specified for $target_name")
ibtool_flags = []
if (defined(invoker.ibtool_flags)) {
ibtool_flags = invoker.ibtool_flags
}
_output_extension = invoker.output_extension
script = "//gn/compile_ib_files.py"
sources = invoker.sources
outputs = [
"$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension",
]
args = [
"--input",
"{{source}}",
"--output",
rebase_path(
"$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension",
root_build_dir),
]
# if (!use_system_xcode) {
# args += [
# "--developer_dir",
# hermetic_xcode_path,
# ]
# }
args += ibtool_flags
}
}
template("bundle_data_ib_file") {
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
if (_source_extension == "xib") {
_compile_ib_file = target_name + "_compile_xib"
_output_extension = "nib"
} else {
_compile_ib_file = target_name + "_compile_storyboard"
_output_extension = "storyboardc"
}
compile_ib_files(_compile_ib_file) {
sources = [ invoker.source ]
output_extension = _output_extension
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_ib_file" ]
sources = get_target_outputs(":$_compile_ib_file")
outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
}
}
template("ios_app_bundle") {
app_name = target_name
gen_path = target_gen_dir
bundle_prefix = "com.google"
plist_string = string_join(
"$0x0A",
[
"<plist version=\"1.0\">",
" <dict>",
" <key>CFBundleVersion</key> <string>0.1.0</string>",
" <key>CFBundleShortVersionString</key> <string>0.1.0</string>",
" <key>CFBundleName</key> <string>${app_name}</string>",
" <key>CFBundleExecutable</key> <string>${app_name}</string>",
" <key>CFBundleIdentifier</key> <string>${bundle_prefix}.${app_name}</string>",
" <key>CFBundlePackageType</key> <string>APPL</string>",
" <key>LSRequiresIPhoneOS</key> <true/>",
" <key>UILaunchStoryboardName</key> <string>LaunchScreen</string>",
" </dict>",
"</plist>",
])
write_file("$gen_path/${app_name}_Info.plist", plist_string)
bundle_data("${app_name}_bundle_info_plist") {
sources = [ "$gen_path/${app_name}_Info.plist" ]
outputs = [ "{{bundle_resources_dir}}/Info.plist" ]
}
if (defined(invoker.data_sources)) {
bundle_data("${app_name}_bundle_resources_and_skps") {
sources = invoker.data_sources
# iOS reserves the folders 'Resources' and 'resources' so store one level deeper
outputs = [ "{{bundle_resources_dir}}/data/{{source_file_part}}" ]
}
}
if (defined(invoker.launchscreen)) {
bundle_data_ib_file("${app_name}_bundle_launchscreen") {
source = invoker.launchscreen
}
}
executable("${app_name}_generate_executable") {
if (!defined(configs)) {
configs = []
}
forward_variables_from(invoker,
"*",
[
"output_name",
"visibility",
"is_shared_library",
"data_sources",
"extra_configs",
"configs",
])
if (defined(invoker.configs)) {
configs += invoker.configs
}
if (defined(invoker.extra_configs)) {
configs += invoker.extra_configs
}
output_name = rebase_path("$gen_path/$app_name", root_build_dir)
}
action("${app_name}_dsymutil") {
public_deps = [ ":${app_name}_generate_executable" ]
sources = [ "$gen_path/$app_name" ]
script = "//gn/call.py"
args = [
"dsymutil",
rebase_path("$gen_path/$app_name"),
]
outputs = [ "$gen_path/${app_name}.dSYM" ]
testonly = defined(invoker.testonly) && invoker.testonly
pool = "//gn/toolchain:dsymutil_pool($default_toolchain)"
}
bundle_data("${app_name}_bundle_executable_and_symbols") {
public_deps = [
":${app_name}_dsymutil",
":${app_name}_generate_executable",
]
sources = [
"$gen_path/${app_name}",
"$gen_path/${app_name}.dSYM",
]
outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]
testonly = defined(invoker.testonly) && invoker.testonly
}
create_bundle("$app_name") {
product_type = "com.apple.product-type.application"
testonly = defined(invoker.testonly) && invoker.testonly
bundle_root_dir = "${root_build_dir}/${target_name}.app"
bundle_resources_dir = bundle_root_dir
bundle_executable_dir = bundle_root_dir
xcode_extra_attributes = {
PRODUCT_BUNDLE_IDENTIFIER = "${bundle_prefix}.${app_name}"
if (ios_min_target != "") {
IPHONEOS_DEPLOYMENT_TARGET = ios_min_target
}
INFOPLIST_FILE = rebase_path("${target_gen_dir}/${app_name}_Info.plist")
}
deps = [
":${app_name}_bundle_executable_and_symbols",
":${app_name}_bundle_info_plist",
]
if (defined(invoker.launchscreen)) {
deps += [ ":${app_name}_bundle_launchscreen" ]
}
if (defined(invoker.data_sources)) {
deps += [ ":${app_name}_bundle_resources_and_skps" ]
}
# should only code sign when running on a device, not the simulator
if (!ios_use_simulator) {
code_signing_script = "//gn/codesign_ios.py"
code_signing_sources = [ "$target_gen_dir/$app_name" ]
code_signing_outputs = [
"$bundle_root_dir/_CodeSignature/CodeResources",
"$bundle_root_dir/embedded.mobileprovision",
]
code_signing_args = [
rebase_path("$bundle_root_dir", root_build_dir),
skia_ios_identity,
skia_ios_profile,
]
}
}
}
}