blob: 0a8cdc13970ea5157bdec400efeb1e0d74a766fe [file] [log] [blame]
# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
_dart_root = get_path_info("../..", "abspath")
template("rust_library") {
manifest = rebase_path("Cargo.toml")
if (defined(invoker.manifest)) {
manifest = invoker.manifest
}
debug = defined(invoker.debug) && invoker.debug
shared = defined(invoker.shared) && invoker.shared
cmd = [
rebase_path("//buildtools/${host_os}-${host_cpu}/rust/bin/cargo"),
"build",
"--target-dir",
rebase_path(target_out_dir),
"--manifest-path",
manifest,
]
# For cross compilation, figure out the target triple. You can get a full list
# of the targets that rust supports like this: rustc --print target-list
cargo_out_dir = target_out_dir
if (is_linux) {
rust_os = "unknown-linux-gnu"
} else if (is_mac) {
rust_os = "apple-darwin"
} else if (is_win) {
rust_os = "pc-windows-gnu"
} else if (is_android) {
rust_os = "linux-android"
} else if (is_fuchsia) {
rust_os = "fuchsia"
}
if (defined(rust_os)) {
if (current_cpu == "x86") {
rust_target = "i686-${rust_os}"
} else if (current_cpu == "x64") {
rust_target = "x86_64-${rust_os}"
} else if (current_cpu == "arm") {
rust_target = "arm-${rust_os}eabi"
} else if (current_cpu == "arm64") {
rust_target = "aarch64-${rust_os}"
}
}
if (defined(rust_target)) {
cmd += [
"--target",
rust_target,
]
cargo_out_dir += "/${rust_target}"
}
if (debug) {
cargo_out_dir += "/debug"
} else {
cargo_out_dir += "/release"
cmd += [ "--release" ]
}
output_file = ""
if (shared) {
if (is_win) {
output_file = "${invoker.lib_name}.dll"
} else if (is_mac) {
output_file = "lib${invoker.lib_name}.dylib"
} else {
output_file = "lib${invoker.lib_name}.so"
}
} else {
if (is_win) {
output_file = "${invoker.lib_name}.lib"
} else {
output_file = "lib${invoker.lib_name}.a"
}
}
action("${target_name}_cargo") {
script = "${_dart_root}/build/rust/run.py"
args = cmd
outputs = [ "${cargo_out_dir}/${output_file}" ]
public_configs = [ ":${target_name}_config" ]
}
config("${target_name}_cargo_config") {
if (!shared) {
libs = [ invoker.lib_name ]
lib_dirs = [ target_out_dir ]
}
}
# Cargo leaves the library in cargo_out_dir, which varies based on the target.
# So we need to copy it to target_out_dir to make it easier for dependees to
# locate the library.
copy(target_name) {
public_deps = [ ":${target_name}_cargo" ]
sources = [ "${cargo_out_dir}/${output_file}" ]
outputs = [ "${target_out_dir}/${output_file}" ]
}
}