mirror of
https://github.com/denoland/deno.git
synced 2025-01-05 05:49:20 -05:00
69ee336840
It's never been used for anything other than enabling crate features. Use the 'features' variable instead, it's more readable and more terse.
276 lines
7.3 KiB
Text
276 lines
7.3 KiB
Text
declare_args() {
|
|
# Absolute path of rust build files.
|
|
rust_build = "//build_extra/rust/"
|
|
}
|
|
|
|
if (is_win) {
|
|
executable_suffix = ".exe"
|
|
} else {
|
|
executable_suffix = ""
|
|
}
|
|
|
|
# The official way of building Rust executables is to to let rustc do the
|
|
# linking. However, we'd prefer to leave it in the hands of gn/ninja:
|
|
# * It allows us to use source sets.
|
|
# * It allows us to use the bundled lld that Chromium and V8 use.
|
|
# * We have more control over build flags.
|
|
# * To sidestep rustc weirdness (e.g. on Windows, it always links with the
|
|
# release C runtime library, even for debug builds).
|
|
#
|
|
# The `get_rust_ldflags` tool outputs the linker flags that are needed to
|
|
# successfully link rustc object code into an executable.
|
|
# We generate two sets of ldflags:
|
|
# `rust_bin_ldflags`: Used for rust_executable targets.
|
|
# `rust_test_ldflags`: Used for rust_test targets; includes the test harness.
|
|
#
|
|
# The tool works by compiling and linking something with rustc, and analyzing
|
|
# the arguments it passes to the system linker. That's what dummy.rs is for.
|
|
dummy_rs_path = rebase_path("dummy.rs", root_build_dir)
|
|
rust_bin_ldflags =
|
|
exec_script("get_rust_ldflags.py", [ dummy_rs_path ], "list lines")
|
|
rust_test_ldflags = exec_script("get_rust_ldflags.py",
|
|
[
|
|
dummy_rs_path,
|
|
"--test",
|
|
],
|
|
"list lines")
|
|
|
|
template("run_rustc") {
|
|
action(target_name) {
|
|
assert(defined(invoker.source_root), "Must specify source_root")
|
|
forward_variables_from(invoker,
|
|
[
|
|
"crate_name",
|
|
"crate_type",
|
|
"crate_version",
|
|
"deps",
|
|
"extern",
|
|
"extern_version",
|
|
"features",
|
|
"is_test",
|
|
"source_root",
|
|
"testonly",
|
|
])
|
|
if (!defined(crate_name)) {
|
|
crate_name = target_name
|
|
}
|
|
if (!defined(is_test)) {
|
|
is_test = false
|
|
}
|
|
|
|
sources = [
|
|
source_root,
|
|
]
|
|
outputs = []
|
|
script = "//tools/run_rustc.py"
|
|
|
|
# TODO: We want to apply "-Dwarnings" only when treat_warnings_as_errors is not false
|
|
# https://github.com/denoland/deno/pull/379
|
|
args = [
|
|
rebase_path(source_root, root_build_dir),
|
|
"--crate-name=$crate_name",
|
|
"--crate-type=$crate_type",
|
|
]
|
|
|
|
if (!is_win) {
|
|
args += [ "--color=always" ]
|
|
}
|
|
|
|
if (!defined(crate_version)) {
|
|
crate_name_and_version = crate_name
|
|
} else {
|
|
crate_name_and_version = "$crate_name-$crate_version"
|
|
}
|
|
|
|
if (crate_type == "bin") {
|
|
output_file = "$target_out_dir/$crate_name_and_version.o"
|
|
emit_type = "obj"
|
|
} else if (crate_type == "rlib") {
|
|
output_file = "$target_out_dir/lib$crate_name_and_version.rlib"
|
|
emit_type = "link"
|
|
}
|
|
outputs += [ output_file ]
|
|
output_file_rel = rebase_path(output_file, root_build_dir)
|
|
args += [ "--emit=$emit_type=$output_file_rel" ]
|
|
|
|
depfile = "$target_out_dir/$crate_name_and_version.d"
|
|
args += [
|
|
"--emit=dep-info=" + rebase_path(depfile, root_build_dir),
|
|
|
|
# The following two args are used by run_rustc.py to fix
|
|
# the depfile on the fly. They are not passed thru to rustc.
|
|
"--depfile=" + rebase_path(depfile, root_build_dir),
|
|
"--output_file=" + output_file_rel,
|
|
]
|
|
|
|
if (defined(crate_version)) {
|
|
args += [
|
|
"-C",
|
|
"metadata=$crate_version",
|
|
]
|
|
}
|
|
|
|
if (is_debug) {
|
|
args += [ "-g" ]
|
|
}
|
|
|
|
if (is_official_build) {
|
|
args += [ "-O" ]
|
|
}
|
|
|
|
if (is_test) {
|
|
args += [ "--test" ]
|
|
}
|
|
|
|
if (defined(features)) {
|
|
foreach(f, features) {
|
|
args += [
|
|
"--cfg",
|
|
"feature=\"" + f + "\"",
|
|
]
|
|
}
|
|
}
|
|
|
|
if (defined(invoker.args)) {
|
|
args += invoker.args
|
|
}
|
|
|
|
if (!defined(deps)) {
|
|
deps = []
|
|
}
|
|
|
|
# Convert all 'extern' and 'extern_version' items to a single format.
|
|
extern_infos = []
|
|
if (defined(extern)) {
|
|
foreach(label, extern) {
|
|
extern_infos += [
|
|
{
|
|
label = label
|
|
crate_name = get_label_info(label, "name")
|
|
crate_name_and_version = crate_name
|
|
},
|
|
]
|
|
}
|
|
}
|
|
if (defined(extern_version)) {
|
|
foreach(info, extern_version) {
|
|
extern_infos += [
|
|
{
|
|
forward_variables_from(info, "*")
|
|
crate_name_and_version = "$crate_name-$crate_version"
|
|
},
|
|
]
|
|
}
|
|
}
|
|
|
|
# Build the list of '--extern' arguments from the 'extern_infos' array.
|
|
foreach(info, extern_infos) {
|
|
dir = get_label_info(info.label, "target_out_dir")
|
|
rlib = "$dir/lib${info.crate_name_and_version}.rlib"
|
|
args += [
|
|
"--extern",
|
|
info.crate_name + "=" + rebase_path(rlib, root_build_dir),
|
|
|
|
# This is needed for transitive dependencies.
|
|
"-L",
|
|
"dependency=" + rebase_path(dir, root_build_dir),
|
|
]
|
|
deps += [ info.label ]
|
|
}
|
|
}
|
|
}
|
|
|
|
template("rust_component") {
|
|
rustc_name = target_name + "_rustc"
|
|
rustc_label = ":" + rustc_name
|
|
|
|
forward_variables_from(invoker,
|
|
[
|
|
"crate_name",
|
|
"crate_type",
|
|
])
|
|
if (!defined(crate_name)) {
|
|
crate_name = target_name
|
|
}
|
|
if (!defined(crate_type)) {
|
|
crate_type = "rlib"
|
|
}
|
|
|
|
run_rustc(rustc_name) {
|
|
forward_variables_from(invoker,
|
|
[
|
|
"args",
|
|
"crate_version",
|
|
"deps",
|
|
"extern",
|
|
"extern_version",
|
|
"features",
|
|
"is_test",
|
|
"source_root",
|
|
"testonly",
|
|
])
|
|
}
|
|
|
|
crate_outputs = get_target_outputs(rustc_label)
|
|
crate_obj = crate_outputs[0]
|
|
|
|
component(target_name) {
|
|
forward_variables_from(invoker,
|
|
[
|
|
"deps",
|
|
"libs",
|
|
"testonly",
|
|
])
|
|
if (!defined(deps)) {
|
|
deps = []
|
|
}
|
|
if (!defined(libs)) {
|
|
libs = []
|
|
}
|
|
libs += [ crate_obj ]
|
|
deps += [ rustc_label ]
|
|
}
|
|
}
|
|
|
|
template("rust_executable") {
|
|
bin_name = target_name + "_bin"
|
|
bin_label = ":" + bin_name
|
|
|
|
rust_component(bin_name) {
|
|
crate_type = "bin"
|
|
forward_variables_from(invoker, "*")
|
|
}
|
|
|
|
executable(target_name) {
|
|
forward_variables_from(invoker, "*")
|
|
|
|
if (defined(is_test) && is_test) {
|
|
ldflags = rust_test_ldflags
|
|
} else {
|
|
ldflags = rust_bin_ldflags
|
|
}
|
|
|
|
if (!defined(deps)) {
|
|
deps = []
|
|
}
|
|
|
|
deps += [ bin_label ]
|
|
|
|
if (defined(extern)) {
|
|
deps += extern
|
|
}
|
|
if (defined(extern_version)) {
|
|
foreach(info, extern_version) {
|
|
deps += [ info.label ]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template("rust_test") {
|
|
rust_executable(target_name) {
|
|
forward_variables_from(invoker, "*")
|
|
is_test = true
|
|
testonly = true
|
|
}
|
|
}
|