| # 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" |
| } |
| } |