blob: b7797200709a6c1d70674269fab6e8bd500783ac [file] [log] [blame]
# Copyright 2019 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/ios/deployment_target.gni")
declare_args() {
# Configure whether whole module optimization is enabled when compiling
# swift modules.
swift_whole_module_optimization = true
}
template("ios_toolchain") {
toolchain(target_name) {
assert(defined(invoker.toolchain_args),
"Toolchains must declare toolchain_args")
toolchain_args = {
forward_variables_from(invoker.toolchain_args, "*")
}
_sdk_info = exec_script("//build/config/ios/scripts/sdk_info.py",
[
"--target-cpu",
current_cpu,
"--target-environment",
target_environment,
"--deployment-target",
ios_deployment_target,
],
"json")
cc = "clang -target ${_sdk_info.target} -isysroot ${_sdk_info.sdk_path}"
cxx = "clang++ -target ${_sdk_info.target} -isysroot ${_sdk_info.sdk_path}"
swiftmodule_switch = "-Wl,-add_ast_path,"
tool("link") {
output = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
rspfile = output + ".rsp"
rspfile_content = "{{inputs_newline}}"
outputs = [ output ]
command = "$cxx {{ldflags}} -o $output -Wl,-filelist,$rspfile {{libs}} {{solibs}} {{frameworks}} {{swiftmodules}}"
description = "LINK {{output}}"
default_output_dir = "{{root_out_dir}}"
default_output_extension = ""
output_prefix = ""
}
tool("solink") {
dylib = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
rspfile = dylib + ".rsp"
rspfile_content = "{{inputs_newline}}"
outputs = [ dylib ]
command = "$cxx -dynamiclib {{ldflags}} -o $dylib -Wl,-filelist,$rspfile {{libs}} {{solibs}} {{frameworks}} {{swiftmodules}}"
description = "SOLINK {{output}}"
default_output_dir = "{{root_out_dir}}"
default_output_extension = ".dylib"
output_prefix = "lib"
}
tool("cc") {
depfile = "{{output}}.d"
precompiled_header_type = "gcc"
command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CC {{output}}"
outputs = [ "{{target_out_dir}}/{{label_name}}/{{source_name_part}}.o" ]
}
tool("cxx") {
depfile = "{{output}}.d"
precompiled_header_type = "gcc"
command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CXX {{output}}"
outputs = [ "{{target_out_dir}}/{{label_name}}/{{source_name_part}}.o" ]
}
tool("objc") {
depfile = "{{output}}.d"
precompiled_header_type = "gcc"
command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJC {{output}}"
outputs = [ "{{target_out_dir}}/{{label_name}}/{{source_name_part}}.o" ]
}
tool("objcxx") {
depfile = "{{output}}.d"
precompiled_header_type = "gcc"
command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJCXX {{output}}"
outputs = [ "{{target_out_dir}}/{{label_name}}/{{source_name_part}}.o" ]
}
tool("stamp") {
command = "touch {{output}}"
description = "STAMP {{output}}"
}
tool("copy_bundle_data") {
command = "rm -rf {{output}} && cp -PR {{source}} {{output}}"
description = "COPY_BUNDLE_DATA {{output}}"
}
tool("swift") {
depfile = "{{target_out_dir}}/{{module_name}}.d"
depsformat = "gcc"
outputs = [
# The module needs to be the first output to ensure the
# depfile generate works correctly with ninja < 1.9.0.
"{{target_gen_dir}}/{{module_name}}.swiftmodule",
"{{target_gen_dir}}/{{module_name}}.h",
"{{target_gen_dir}}/{{module_name}}.swiftdoc",
"{{target_gen_dir}}/{{module_name}}.swiftsourceinfo",
]
if (swift_whole_module_optimization) {
_extra_flag = "--whole-module-optimization"
_object_dir = "{{target_out_dir}}"
outputs += [ "{{target_out_dir}}/{{module_name}}.o" ]
} else {
_extra_flag = ""
_object_dir = "{{target_out_dir}}/{{label_name}}"
partial_outputs =
[ "{{target_out_dir}}/{{label_name}}/{{source_name_part}}.o" ]
}
_swiftc = rebase_path("//build/toolchain/apple/swiftc.py", root_build_dir)
command = "$_swiftc --target ${_sdk_info.target} --sdk ${_sdk_info.sdk_path} --module-name {{module_name}} --object-dir $_object_dir --module-path {{target_gen_dir}}/{{module_name}}.swiftmodule --header-path {{target_gen_dir}}/{{module_name}}.h --depfile {{target_out_dir}}/{{module_name}}.d --depfile-filter {{target_gen_dir}}/{{module_name}}.swiftmodule --bridge-header {{bridge_header}} $_extra_flag {{defines}} {{swiftflags}} {{include_dirs}} {{module_dirs}} {{inputs}}"
}
}
}
ios_toolchain("clang_x86") {
toolchain_args = {
current_cpu = "x86"
current_os = "ios"
}
}
ios_toolchain("clang_x64") {
toolchain_args = {
current_cpu = "x64"
current_os = "ios"
}
}
ios_toolchain("clang_arm") {
toolchain_args = {
current_cpu = "arm"
current_os = "ios"
}
}
ios_toolchain("clang_arm64") {
toolchain_args = {
current_cpu = "arm64"
current_os = "ios"
}
}