433 lines
13 KiB
Text
433 lines
13 KiB
Text
# 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/mac/base_rules.gni")
|
|
|
|
# Generates Info.plist files for Mac apps and frameworks.
|
|
#
|
|
# Arguments
|
|
#
|
|
# info_plist:
|
|
# string, the path to an plist file that will be included in the final
|
|
# Info.plist generated.
|
|
#
|
|
# 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") {
|
|
info_plist(target_name) {
|
|
format = "binary1"
|
|
extra_substitutions = []
|
|
if (defined(invoker.extra_substitutions)) {
|
|
extra_substitutions = invoker.extra_substitutions
|
|
}
|
|
extra_substitutions += [
|
|
"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",
|
|
invoker.info_plist,
|
|
]
|
|
forward_variables_from(invoker,
|
|
[
|
|
"executable_name",
|
|
"visibility",
|
|
])
|
|
}
|
|
}
|
|
|
|
# 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
|
|
#
|
|
# 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:
|
|
# path to the template to use to generate the application Info.plist
|
|
# by performing variable substitutions.
|
|
#
|
|
# For more information, see "gn help executable".
|
|
template("ios_app_bundle") {
|
|
assert(defined(invoker.info_plist),
|
|
"info_plist must be specified for target $target_name")
|
|
|
|
_output_name = target_name
|
|
_target_name = target_name
|
|
if (defined(invoker.output_name)) {
|
|
_output_name = invoker.output_name
|
|
}
|
|
|
|
_generate_info_plist = target_name + "_generate_info_plist"
|
|
_bundle_data_info_plist = target_name + "_bundle_data_info_plist"
|
|
|
|
ios_info_plist(_generate_info_plist) {
|
|
executable_name = _output_name
|
|
forward_variables_from(invoker,
|
|
[
|
|
"extra_substitutions",
|
|
"info_plist",
|
|
])
|
|
}
|
|
|
|
bundle_data(_bundle_data_info_plist) {
|
|
forward_variables_from(invoker, [ "testonly" ])
|
|
visibility = [ ":$_target_name" ]
|
|
sources = get_target_outputs(":$_generate_info_plist")
|
|
outputs = [
|
|
"{{bundle_root_dir}}/Info.plist",
|
|
]
|
|
public_deps = [
|
|
":$_generate_info_plist",
|
|
]
|
|
}
|
|
|
|
_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,
|
|
"*",
|
|
[
|
|
"assert_no_deps",
|
|
"code_signing_identity",
|
|
"data_deps",
|
|
"entitlements_path",
|
|
"info_plist",
|
|
"output_name",
|
|
"visibility",
|
|
])
|
|
|
|
output_name = rebase_path("$target_gen_dir/$_output_name", root_out_dir)
|
|
if (!defined(libs)) {
|
|
libs = []
|
|
}
|
|
libs += [ "UIKit.framework" ]
|
|
}
|
|
|
|
bundle_data(_bundle_data_executable) {
|
|
forward_variables_from(invoker, [ "testonly" ])
|
|
visibility = [ ":$_target_name" ]
|
|
sources = [
|
|
"$target_gen_dir/$_output_name",
|
|
]
|
|
outputs = [
|
|
"{{bundle_executable_dir}}/$_output_name",
|
|
]
|
|
public_deps = [
|
|
":$_generate_executable",
|
|
]
|
|
}
|
|
|
|
create_bundle(target_name) {
|
|
forward_variables_from(invoker,
|
|
[
|
|
"data_deps",
|
|
"deps",
|
|
"public_deps",
|
|
"testonly",
|
|
"visibility",
|
|
])
|
|
|
|
if (!defined(deps)) {
|
|
deps = []
|
|
}
|
|
deps += [
|
|
":$_bundle_data_executable",
|
|
":$_bundle_data_info_plist",
|
|
]
|
|
|
|
if (use_ios_simulator) {
|
|
if (!defined(data_deps)) {
|
|
data_deps = []
|
|
}
|
|
data_deps += [ "//testing/iossim" ]
|
|
}
|
|
|
|
product_type = "com.apple.product-type.application"
|
|
bundle_root_dir = "$root_out_dir/$_output_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),
|
|
}
|
|
|
|
# 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}}",
|
|
]
|
|
}
|
|
}
|
|
|
|
# Template to package a shared library into an iOS framework bundle.
|
|
#
|
|
# This template provides two targets to control whether the framework is
|
|
# merely built when targets depend on it, or whether it is linked as well:
|
|
# "$target_name" and "$target_name+link".
|
|
#
|
|
# See the //build/config/mac/base_rules.gni:framework_bundle for a discussion
|
|
# and examples.
|
|
#
|
|
# Arguments
|
|
#
|
|
# output_name:
|
|
# (optional) string, name of the generated framework without the
|
|
# .framework suffix. If omitted, defaults to target_name.
|
|
#
|
|
# framework_version:
|
|
# (optional) string, version of the framework. Typically this is a
|
|
# single letter, like "A". If omitted, the Versions/ subdirectory
|
|
# structure will not be created, and build output will go directly
|
|
# into the framework subdirectory.
|
|
#
|
|
# 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.
|
|
#
|
|
# 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
|
|
}
|
|
_framework_target = _target_name
|
|
|
|
if (defined(invoker.public_headers) && invoker.public_headers != []) {
|
|
_public_headers = invoker.public_headers
|
|
_framework_name = _output_name + ".framework"
|
|
_framework_root = "$root_out_dir/$_framework_name"
|
|
_framework_target = target_name + "_internal"
|
|
|
|
_header_map_filename = "$target_gen_dir/$_output_name.headers.hmap"
|
|
_framework_headers_target = _target_name + "_framework_headers"
|
|
|
|
_compile_headers_map_target = _target_name + "_compile_headers_map"
|
|
action(_compile_headers_map_target) {
|
|
visibility = [ ":$_framework_headers_target" ]
|
|
script = "$root_out_dir/gyp-mac-tool"
|
|
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 = [
|
|
"compile-ios-framework-header-map",
|
|
rebase_path(_header_map_filename),
|
|
rebase_path(_framework_root, root_out_dir),
|
|
] + rebase_path(sources, root_out_dir)
|
|
}
|
|
|
|
_create_module_map_target = _target_name + "_module_map"
|
|
action(_create_module_map_target) {
|
|
visibility = [ ":$_framework_headers_target" ]
|
|
script = "$root_out_dir/gyp-mac-tool"
|
|
outputs = [
|
|
"$_framework_root/Modules/module.modulemap",
|
|
]
|
|
args = [
|
|
"package-ios-framework",
|
|
rebase_path("$_framework_root", root_out_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}}",
|
|
]
|
|
}
|
|
|
|
_headers_map_config = _target_name + "_headers_map"
|
|
config(_headers_map_config) {
|
|
visibility = [ ":$_target_name" ]
|
|
include_dirs = [ _header_map_filename ]
|
|
ldflags = [
|
|
"-install_name",
|
|
"@rpath/$_framework_name/$_output_name",
|
|
]
|
|
}
|
|
|
|
group(_framework_headers_target) {
|
|
deps = [
|
|
":$_compile_headers_map_target",
|
|
":$_copy_public_headers_target",
|
|
":$_create_module_map_target",
|
|
]
|
|
}
|
|
}
|
|
|
|
_framework_public_config = _target_name + "_ios_public_config"
|
|
config(_framework_public_config) {
|
|
visibility = [ ":$_framework_public_config" ]
|
|
if (defined(_public_headers)) {
|
|
common_flags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ]
|
|
cflags_objc = common_flags
|
|
cflags_objcc = common_flags
|
|
}
|
|
|
|
# The link settings are inherited from the framework_bundle config.
|
|
}
|
|
|
|
framework_bundle(_framework_target) {
|
|
forward_variables_from(invoker,
|
|
"*",
|
|
[
|
|
"output_name",
|
|
"public_headers",
|
|
"visibility",
|
|
])
|
|
output_name = _output_name
|
|
|
|
if (!defined(public_configs)) {
|
|
public_configs = []
|
|
}
|
|
public_configs += [ ":$_framework_public_config" ]
|
|
|
|
if (defined(_public_headers)) {
|
|
visibility = [
|
|
":$_target_name",
|
|
":$_target_name+link",
|
|
]
|
|
configs += [ ":$_headers_map_config" ]
|
|
|
|
if (!defined(deps)) {
|
|
deps = []
|
|
}
|
|
deps += [ ":$_framework_headers_target" ]
|
|
} else {
|
|
if (defined(invoker.visibility)) {
|
|
visibility = invoker.visibility
|
|
visibility += [ ":$_target_name+link" ]
|
|
}
|
|
}
|
|
}
|
|
|
|
if (defined(_public_headers)) {
|
|
group(_target_name) {
|
|
forward_variables_from(invoker,
|
|
[
|
|
"testonly",
|
|
"public_configs",
|
|
])
|
|
|
|
if (defined(invoker.visibility)) {
|
|
visibility = invoker.visibility
|
|
visibility += [ ":$_target_name+link" ]
|
|
}
|
|
|
|
public_deps = [
|
|
":$_framework_target",
|
|
]
|
|
}
|
|
|
|
group(_target_name + "+link") {
|
|
forward_variables_from(invoker,
|
|
[
|
|
"testonly",
|
|
"visibility",
|
|
])
|
|
public_deps = [
|
|
":$_framework_target+link",
|
|
]
|
|
}
|
|
}
|
|
}
|