blob: 163218d7131e3dc4904d57c635445a2e00f33823 [file] [log] [blame]
# Copyright 2020 The Kythe Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Implements a rule for testing the Rust extractor
Generates a test source file and sets the proper environment variables to run
the extractor
"""
load("@bazel_skylib//lib:paths.bzl", "paths")
def _rust_extractor_test_impl(ctx):
test_binary = ctx.executable.src
extractor = ctx.executable._extractor
# Rust toolchain
rust_toolchain = ctx.toolchains["@rules_rust//rust:toolchain"]
rustc_lib = rust_toolchain.rustc_lib.to_list()
rust_std = rust_toolchain.rust_std.to_list()
source_file = ctx.actions.declare_file("main.rs")
# sha256 digest = 7cb3b3c74ecdf86f434548ba15c1651c92bf03b6690fd0dfc053ab09d094cf03
source_content = """
fn main() {
println!("Hello, world!");
}
"""
ctx.actions.write(
output = source_file,
content = source_content,
)
out_dir_input = ctx.actions.declare_file("out_dir/input.rs")
# sha256 digest = 75d66361585a3ca351b88047de1e1ddbbd3f85b070be2faf8f53f5e886447cf7
input_content = """
pub fn hello() {
println!("I'm a generated input!");
}
"""
ctx.actions.write(
output = out_dir_input,
content = input_content,
)
rustc_lib_path = paths.dirname(rustc_lib[0].short_path)
rust_lib_path = paths.dirname(rust_std[0].short_path)
script = "\n".join(
["export DYLD_FALLBACK_LIBRARY_PATH=${DYLD_FALLBACK_LIBRARY_PATH:+$DYLD_FALLBACK_LIBRARY_PATH:}%s:%s" % (rustc_lib_path, rust_lib_path)] +
["export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}%s:%s" % (rustc_lib_path, rust_lib_path)] +
["export SYSROOT=%s" % rust_lib_path] +
["export TEST_FILE=%s" % source_file.short_path] +
["export EXTRACTOR_PATH=%s" % extractor.short_path] +
["export KYTHE_CORPUS=test_corpus"] +
["export CARGO_OUT_DIR='${pwd}/%s'" % paths.dirname(out_dir_input.short_path)] +
["./%s" % test_binary.short_path],
)
ctx.actions.write(
output = ctx.outputs.executable,
content = script,
)
runfiles = ctx.runfiles(
files = [test_binary, source_file, extractor, ctx.outputs.executable, out_dir_input] + rustc_lib + rust_std,
)
runfiles = runfiles.merge(ctx.attr.src[DefaultInfo].data_runfiles)
return [DefaultInfo(runfiles = runfiles)]
rust_extractor_test = rule(
implementation = _rust_extractor_test_impl,
attrs = {
"src": attr.label(
mandatory = True,
executable = True,
cfg = "target",
doc = "The Rust binary to be executed",
),
"_extractor": attr.label(
default = Label("//kythe/rust/extractor:extractor"),
executable = True,
cfg = "target",
),
},
test = True,
toolchains = ["@rules_rust//rust:toolchain"],
)