aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2018-02-20 09:30:39 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-20 09:32:33 -0800
commitcc16e7cb3e7203f5033928f1348722cad6d8e59d (patch)
treed9563cda0af7936aa091e0b10440dd07ded275ad /src
parent1001141f0674ff4b611814edcb00a5183680ef4a (diff)
External repositories: document label expansion
Add a test demonstrating how a repository can provide a rule with an implicit dependency on a target in its own repository in a way that works both, locally and remotely without the need to know the name of the repository the rule resides in. Change-Id: I2446be1ba16a382576800f8141da17331e64f8b1 PiperOrigin-RevId: 186314462
Diffstat (limited to 'src')
-rwxr-xr-xsrc/test/shell/bazel/external_path_test.sh138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/test/shell/bazel/external_path_test.sh b/src/test/shell/bazel/external_path_test.sh
index 0182ced2d7..7e9edc12db 100755
--- a/src/test/shell/bazel/external_path_test.sh
+++ b/src/test/shell/bazel/external_path_test.sh
@@ -262,4 +262,142 @@ EOF
|| fail "Expected output 'Hello World'"
}
+repo_with_local_implicit_dependencies() {
+ # create, in the current working directory, a package called rule
+ # that has an implicit dependency on a target in the same repository;
+ # the point here is that this dependency can be named without knowlege
+ # of the repository name.
+ mkdir -p rule
+ cat > rule/BUILD <<'EOF'
+exports_files(["to_upper.sh"])
+EOF
+ cat > rule/to_upper.sh <<'EOF'
+cat $1 | tr 'a-z' 'A-Z' > $2
+EOF
+ cat > rule/to_upper.bzl <<'EOF'
+def _to_upper_impl(ctx):
+ output = ctx.new_file(ctx.label.name + ".txt")
+ ctx.action(
+ inputs = ctx.files.src + ctx.files._toupper_sh,
+ outputs = [output],
+ command = ["/bin/sh"] + [f.path for f in ctx.files._toupper_sh] \
+ + [f.path for f in ctx.files.src] + [output.path],
+ use_default_shell_env = True,
+ mnemonic = "ToUpper",
+ progress_message = "Uppercasing %s" % ctx.label,
+ )
+
+to_upper = rule(
+ implementation = _to_upper_impl,
+ attrs = {
+ "src" : attr.label(allow_files=True),
+ "_toupper_sh" : attr.label(cfg="host", allow_files=True,
+ default = Label("//rule:to_upper.sh")),
+ },
+ outputs = {"upper": "%{name}.txt"},
+ )
+EOF
+}
+
+test_local_rules() {
+ WRKDIR=$(mktemp -d "${TEST_TMPDIR}/testXXXXXX")
+ cd "${WRKDIR}"
+
+ mkdir main
+ cd main
+ touch WORKSPACE
+ repo_with_local_implicit_dependencies
+ mkdir call
+ echo hello world > call/hello.txt
+ cat > call/BUILD <<'EOF'
+load("//rule:to_upper.bzl", "to_upper")
+to_upper(
+ name = "upper_hello",
+ src = "hello.txt"
+)
+EOF
+
+ bazel build -s //call:upper_hello || fail "Expected success"
+ cat `bazel info bazel-bin`/call/upper_hello.txt | grep 'HELLO WORLD' \
+ || fail "not the expected output"
+
+}
+
+test_remote_rules() {
+ WRKDIR=$(mktemp -d "${TEST_TMPDIR}/testXXXXXX")
+ cd "${WRKDIR}"
+
+ mkdir remote
+ (cd remote && repo_with_local_implicit_dependencies)
+ tar cvf remote.tar remote
+ rm -rf remote
+
+ mkdir main
+ cd main
+ cat > WORKSPACE <<EOF
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+ name="r",
+ strip_prefix="remote",
+ urls=["file://${WRKDIR}/remote.tar"],
+)
+EOF
+ mkdir call
+ echo hello world > call/hello.txt
+ cat > call/BUILD <<'EOF'
+load("@r//rule:to_upper.bzl", "to_upper")
+to_upper(
+ name = "upper_hello",
+ src = "hello.txt"
+)
+EOF
+
+ bazel build -s //call:upper_hello || fail "Expected success"
+ cat `bazel info bazel-bin`/call/upper_hello.txt | grep 'HELLO WORLD' \
+ || fail "not the expected output"
+}
+
+test_remote_remote_rules() {
+ WRKDIR=$(mktemp -d "${TEST_TMPDIR}/testXXXXXX")
+ cd "${WRKDIR}"
+
+ mkdir a
+ (cd a && repo_with_local_implicit_dependencies)
+ tar cvf a.tar a
+ rm -rf a
+
+ mkdir b
+ (cd b
+ mkdir call
+ echo hello world > call/hello.txt
+ cat > call/BUILD <<'EOF'
+load("@a//rule:to_upper.bzl", "to_upper")
+to_upper(
+ name = "upper_hello",
+ src = "hello.txt"
+)
+EOF
+ )
+ tar cvf b.tar b
+ rm -rf b
+
+ mkdir main
+ cd main
+ cat > WORKSPACE <<EOF
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+ name="a",
+ strip_prefix="a",
+ urls=["file://${WRKDIR}/a.tar"],
+)
+http_archive(
+ name="b",
+ strip_prefix="b",
+ urls=["file://${WRKDIR}/b.tar"],
+)
+EOF
+
+ bazel build -s @b//call:upper_hello || fail "Expected success"
+}
+
run_suite "path tests for multiple repositories"