Support building multiple versions of a rust crate

This is only to be used in exceptional cases.
Generally we don't allow using multiple versions of a crate.
This commit is contained in:
Bert Belder 2018-08-09 00:42:14 +02:00
parent 58b2362a24
commit 4b75dd7cf5
No known key found for this signature in database
GPG key ID: 7A77887B2E2ED461

View file

@ -43,8 +43,10 @@ template("run_rustc") {
"cfg",
"crate_name",
"crate_type",
"crate_version",
"deps",
"extern",
"extern_version",
"features",
"is_test",
"source_root",
@ -75,21 +77,27 @@ template("run_rustc") {
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 == "staticlib") {
output_file = "$target_out_dir/$crate_name.a"
output_file = "$target_out_dir/$crate_name_and_version.a"
emit_type = "link"
} else if (crate_type == "bin") {
output_file = "$target_out_dir/$crate_name.o"
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.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.d"
depfile = "$target_out_dir/$crate_name_and_version.d"
args += [
"--emit=dep-info=" + rebase_path(depfile, root_build_dir),
@ -99,6 +107,13 @@ template("run_rustc") {
"--output_file=" + output_file_rel,
]
if (defined(crate_version)) {
args += [
"-C",
"metadata=$crate_version",
]
}
if (is_debug) {
args += [ "-g" ]
}
@ -137,48 +152,77 @@ template("run_rustc") {
deps = []
}
# Convert all 'extern' and 'extern_version' items to a single format.
extern_infos = []
if (defined(extern)) {
deps += extern
foreach(label, extern) {
name = get_label_info(label, "name")
dir = get_label_info(label, "target_out_dir")
rlib = "$dir/lib$name.rlib"
args += [
"--extern",
"$name=" + rebase_path(rlib, root_build_dir),
]
# This is needed for transitive dependencies.
args += [
"-L",
"dependency=" + rebase_path(dir, root_build_dir),
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
crate_name = target_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",
"cfg",
"crate_name",
"crate_type",
"crate_version",
"deps",
"extern",
"extern_version",
"features",
"is_test",
"source_root",
"testonly",
])
if (!defined(invoker.crate_type)) {
crate_type = "rlib"
}
}
crate_outputs = get_target_outputs(rustc_label)
@ -208,7 +252,9 @@ template("rust_staticlib") {
[
"cfg",
"crate_name",
"crate_version",
"extern",
"extern_version",
"features",
"source_root",
"testonly",
@ -244,6 +290,11 @@ template("rust_executable") {
if (defined(extern)) {
deps += extern
}
if (defined(extern_version)) {
foreach(info, extern_version) {
deps += [ info.label ]
}
}
}
}