diff --git a/MODULE.bazel b/MODULE.bazel index 843dd77095764c2ac2d1966e0e47e0e9e2b1a5ab..ddfaaaa22ad457ab8813d165d41c5321e6b01419 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,7 +2,7 @@ module( name = "toolchain_utils", version = "0.0.0", bazel_compatibility = [ - ">=7.1.0", + ">=7.0.0", ], ) diff --git a/toolchain/export/symlink/repository.bzl b/toolchain/export/symlink/repository.bzl index 672e4eab092dd38d4115a6321b25a3227f81aaf6..a9dcbc9d4a67016435c1d4d506e49ff73e95dd2f 100644 --- a/toolchain/export/symlink/repository.bzl +++ b/toolchain/export/symlink/repository.bzl @@ -1,3 +1,5 @@ +load("//toolchain/repository:root.bzl", "root") + visibility("//toolchain/export/...") DOC = "Symlinks a repository to another." @@ -11,13 +13,11 @@ ATTRS = { def implementation(rctx): label = rctx.attr.target - workspace = label.relative(":REPO.bazel") - path = rctx.path(workspace) - if not path.exists: - fail("Failed to find `{}`, can only symlink repository labels.".format(path, label)) - target = path.dirname + path = root(rctx, label) + if not path: + fail("Can only symlink repository labels.".format(label)) rctx.delete(".") - rctx.symlink(target, ".") + rctx.symlink(path, ".") symlink = repository_rule( doc = DOC, diff --git a/toolchain/local/select/repository.bzl b/toolchain/local/select/repository.bzl index 4597e5c6aaa573d3ae0fcccae71a4b8f1e9227d5..57258bb5fe24a1296314256db788043bae9de1f4 100644 --- a/toolchain/local/select/repository.bzl +++ b/toolchain/local/select/repository.bzl @@ -1,3 +1,4 @@ +load("//toolchain/repository:root.bzl", "root") load("//toolchain:separator.bzl", "SEPARATOR") load(":resolve.bzl", resolve = "key") @@ -34,19 +35,17 @@ toolchian_local_select( def canonical(rctx, label): prefix = SEPARATOR.join(rctx.name.split(SEPARATOR)[:-1]) - return "@@{}{}{}".format(prefix, SEPARATOR, label.removeprefix("@")) + return Label("@@{}{}{}".format(prefix, SEPARATOR, label.removeprefix("@"))) def implementation(rctx): label = resolve(rctx.attr.map, no_match_error = rctx.attr.no_match_error) canon = canonical(rctx, label) - workspace = Label("{}//:REPO.bazel".format(canon)) - path = rctx.path(workspace) - - if not path.exists: - fail("Missing `{}` for `{}`: {}".format(canon, rctx.name, path)) + path = root(rctx, canon) + if not path: + fail("Missing `{}` for `{}`".format(canon, rctx.name)) rctx.delete(".") - rctx.symlink(path.dirname, ".") + rctx.symlink(path, ".") select = repository_rule( doc = DOC, diff --git a/toolchain/repository/BUILD.bazel b/toolchain/repository/BUILD.bazel new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/toolchain/repository/root.bzl b/toolchain/repository/root.bzl new file mode 100644 index 0000000000000000000000000000000000000000..b3a0b4adba0e3daeddc92121a637c69ea9c88c6e --- /dev/null +++ b/toolchain/repository/root.bzl @@ -0,0 +1,14 @@ +visibility("//...") + +def root(rctx, label): + workspace = label.relative("WORKSPACE") + path = rctx.path(workspace) + if path.exists: + return path.dirname + + repo = label.relative("REPO.bazel") + path = rctx.path(repo) + if path.exists: + return path.dirname + + return None