blob: 45c9db04de2dc708497a0f08113857562cedece5 [file] [log] [blame]
# Copyright 2016 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.
# This file contains rules that are shared between Mac and iOS.
import("//build/config/mac/symbols.gni")
import("//build/toolchain/toolchain.gni")
if (is_mac) {
import("//build/config/mac/mac_sdk.gni")
} else if (is_ios) {
import("//build/config/ios/ios_sdk.gni")
}
# Convert plist file to given format.
#
# Arguments
#
# source:
# string, path to the plist file to convert
#
# output:
# string, path to the converted plist, must be under $root_build_dir
#
# format:
# string, the format to `plutil -convert` the plist to.
template("convert_plist") {
assert(defined(invoker.source), "source must be defined for $target_name")
assert(defined(invoker.output), "output must be defined for $target_name")
assert(defined(invoker.format), "format must be defined for $target_name")
action(target_name) {
forward_variables_from(invoker,
[
"visibility",
"testonly",
"deps",
])
script = "//build/gn_run_binary.py"
sources = [
invoker.source,
]
outputs = [
invoker.output,
]
# /usr/bin/plutil is present on all images of macOS. If at some point in the
# future we need to ship our own copy [e.g. for cross-compile], we can add a
# layer of indirection.
args = [
"/usr/bin/plutil",
"-convert",
invoker.format,
"-o",
rebase_path(invoker.output, root_build_dir),
rebase_path(invoker.source, root_build_dir),
]
}
}
# Template to merge multiple plist files and perform variable substitutions.
#
# Arguments
#
# plist_templates:
# string array, paths to plist files which will be used for the bundle.
#
# format:
# string, the format to `plutil -convert` the plist to when
# generating the output.
#
# substitutions:
# string array, 'key=value' pairs used to replace ${key} by value
# when generating the output plist file.
#
# output_name:
# string, name of the generated plist file.
template("compile_plist") {
assert(defined(invoker.plist_templates),
"A list of template plist files must be specified for $target_name")
assert(defined(invoker.format),
"The plist format must be specified for $target_name")
assert(defined(invoker.substitutions),
"A list of key=value pairs must be specified for $target_name")
assert(defined(invoker.output_name),
"The name of the output file must be specified for $target_name")
_output_name = invoker.output_name
_merged_name = get_path_info(_output_name, "dir") + "/" +
get_path_info(_output_name, "name") + "_merged." +
get_path_info(_output_name, "extension")
_merge_target = target_name + "_merge"
action(_merge_target) {
forward_variables_from(invoker,
[
"deps",
"testonly",
])
script = "//build/config/mac/plist_util.py"
sources = invoker.plist_templates
outputs = [
_merged_name,
]
args = [
"merge",
"-f=" + invoker.format,
"-o=" + rebase_path(_merged_name, root_build_dir),
] + rebase_path(invoker.plist_templates, root_build_dir)
}
action(target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
script = "//build/config/mac/plist_util.py"
sources = [
_merged_name,
]
outputs = [
_output_name,
]
args = [
"substitute",
"-f=" + invoker.format,
"-o=" + rebase_path(_output_name, root_build_dir),
"-t=" + rebase_path(_merged_name, root_build_dir),
]
foreach(_substitution, invoker.substitutions) {
args += [ "-s=$_substitution" ]
}
deps = [
":$_merge_target",
]
}
}
# Template to merge multiple .entitlements files performing variable
# substitutions.
#
# Arguments
#
# entitlements_templates:
# string array, paths to entitlements files which will be used for the
# bundle.
#
# substitutions:
# string array, 'key=value' pairs used to replace ${key} by value
# when generating the output plist file.
#
# output_name:
# string, name of the generated entitlements file.
template("compile_entitlements") {
assert(defined(invoker.entitlements_templates),
"A list of template plist files must be specified for $target_name")
compile_plist(target_name) {
forward_variables_from(invoker,
"*",
[
"entitlements_templates",
"format",
"plist_templates",
])
plist_templates = invoker.entitlements_templates
# Entitlements files are always encoded in xml1.
format = "xml1"
# Entitlements files use unsubstitued variables, so define substitutions
# to leave those variables untouched.
if (!defined(substitutions)) {
substitutions = []
}
substitutions += [
"AppIdentifierPrefix=\$(AppIdentifierPrefix)",
"CFBundleIdentifier=\$(CFBundleIdentifier)",
]
}
}
# The base template used to generate Info.plist files for iOS and Mac apps and
# frameworks.
#
# Arguments
#
# plist_templates:
# string array, paths to plist files which will be used for the bundle.
#
# executable_name:
# string, name of the generated target used for the product
# and executable name as specified in the output Info.plist.
#
# format:
# string, the format to `plutil -convert` the plist to when
# generating the output.
#
# extra_substitutions:
# (optional) string array, 'key=value' pairs for extra fields which are
# specified in a source Info.plist template.
#
# output_name:
# (optional) string, name of the generated plist file, default to
# "$target_gen_dir/$target_name.plist".
template("info_plist") {
assert(defined(invoker.executable_name),
"The executable_name must be specified for $target_name")
executable_name = invoker.executable_name
compile_plist(target_name) {
forward_variables_from(invoker,
[
"plist_templates",
"testonly",
"deps",
"visibility",
"format",
])
if (defined(invoker.output_name)) {
output_name = invoker.output_name
} else {
output_name = "$target_gen_dir/$target_name.plist"
}
substitutions = [
"BUILD_MACHINE_OS_BUILD=$machine_os_build",
"EXECUTABLE_NAME=$executable_name",
"GCC_VERSION=com.apple.compilers.llvm.clang.1_0",
"PRODUCT_NAME=$executable_name",
"XCODE_BUILD=$xcode_build",
"XCODE_VERSION=$xcode_version",
]
if (is_mac) {
substitutions += [
"MACOSX_DEPLOYMENT_TARGET=$mac_deployment_target",
"CHROMIUM_MIN_SYSTEM_VERSION=$mac_min_system_version",
]
} else if (is_ios) {
substitutions += [ "IOS_DEPLOYMENT_TARGET=$ios_deployment_target" ]
}
if (defined(invoker.extra_substitutions)) {
substitutions += invoker.extra_substitutions
}
}
}