diff --git a/toolchain/triplet/VersionInfo.bzl b/toolchain/VersionInfo.bzl similarity index 100% rename from toolchain/triplet/VersionInfo.bzl rename to toolchain/VersionInfo.bzl diff --git a/toolchain/triplet/VersionedInfo.bzl b/toolchain/VersionedInfo.bzl similarity index 100% rename from toolchain/triplet/VersionedInfo.bzl rename to toolchain/VersionedInfo.bzl diff --git a/toolchain/constraint/BUILD.bazel b/toolchain/constraint/BUILD.bazel index a35ed05a23e70f40d455b310b225645264a387bb..8b0c1d7a245995b6217ad6b37c20016120650219 100644 --- a/toolchain/constraint/BUILD.bazel +++ b/toolchain/constraint/BUILD.bazel @@ -1,3 +1,4 @@ +load("//toolchain/couplet:couplets.bzl", "COUPLETS") load("//toolchain/triplet:triplets.bzl", "TRIPLETS") [ @@ -9,6 +10,15 @@ load("//toolchain/triplet:triplets.bzl", "TRIPLETS") for t in TRIPLETS ] +[ + config_setting( + name = c.value, + constraint_values = c.constraints, + visibility = ["//visibility:public"], + ) + for c in COUPLETS +] + alias( name = "local", actual = "//toolchain/local:constraint", diff --git a/toolchain/couplet/BUILD.bazel b/toolchain/couplet/BUILD.bazel new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/toolchain/couplet/CoupletInfo.bzl b/toolchain/couplet/CoupletInfo.bzl new file mode 100644 index 0000000000000000000000000000000000000000..23980010c6283bbb186f7159449b074975f06ff7 --- /dev/null +++ b/toolchain/couplet/CoupletInfo.bzl @@ -0,0 +1,52 @@ +load("@bazel_skylib//lib:types.bzl", "types") +load("//toolchain:VersionedInfo.bzl", "VersionedInfo") +load("//toolchain:split.bzl", "split") + +visibility("//toolchain/...") + +def init(value): + """ + Initializes a `CoupletInfo` provider. + + Processes `value` into the constituent parts. + + Args: + value: A machine couplet which can be kebab-separated such as `aarch64-linux.6.13` + + Returns: + A mapping of keywords for the `couplet_info` raw constructor. + """ + if not types.is_string(value): + fail("`CoupletInfo.value` must be a `str`: {}".format(value)) + + cpu, vendor, os = split(value, "-", { + 2: lambda c, o: (c, None, o), + 3: lambda c, v, o: (c, v, o), + }) + + os = VersionedInfo(os) + + constraints = [ + "cpu:{}".format(cpu), + "os:{}".format(os.kind), + ] + + if os.version: + constraints.append("os/{}:{}".format(os.kind, os.version.value)) + + return { + "value": value, + "cpu": cpu, + "vendor": vendor, + "os": os, + "constraints": tuple([ + Label("//toolchain/constraint/{}".format(c)) + for c in constraints + ]), + } + +CoupletInfo, couplet_info = provider( + "A machine couplet. Has the associated compatible Bazel constraints.", + fields = ("value", "cpu", "vendor", "os", "constraints"), + init = init, +) diff --git a/toolchain/couplet/couplets.bzl b/toolchain/couplet/couplets.bzl new file mode 100644 index 0000000000000000000000000000000000000000..3a679f2a41d93f5b1693e5377df18f9e617fc241 --- /dev/null +++ b/toolchain/couplet/couplets.bzl @@ -0,0 +1,14 @@ +load("@local//:triplet.bzl", LOCAL = "TRIPLET") +load(":CoupletInfo.bzl", "CoupletInfo") + +visibility("//toolchain/...") + +COUPLETS = ( + CoupletInfo("{}-{}".format(LOCAL.cpu, LOCAL.os.value)), + CoupletInfo("arm64-linux"), + CoupletInfo("amd64-linux"), + CoupletInfo("arm64-windows"), + CoupletInfo("amd64-windows"), + CoupletInfo("arm64-macos"), + CoupletInfo("amd64-macos"), +) diff --git a/toolchain/couplet/defs.bzl b/toolchain/couplet/defs.bzl new file mode 100644 index 0000000000000000000000000000000000000000..cabbcae2a04971aa2a660ece6f1c280f9fa89eb2 --- /dev/null +++ b/toolchain/couplet/defs.bzl @@ -0,0 +1,5 @@ +load(":CoupletInfo.bzl", _CoupletInfo = "CoupletInfo") + +visibility("public") + +ToolchainCoupletInfo = _CoupletInfo diff --git a/toolchain/local/triplet/libc.bzl b/toolchain/local/triplet/libc.bzl index 8847461d98d8926483bed16e45970dcdbbe7c075..828f3b546783af7be654fc8bad84f939f7bff27a 100644 --- a/toolchain/local/triplet/libc.bzl +++ b/toolchain/local/triplet/libc.bzl @@ -1,5 +1,5 @@ -load("//toolchain/triplet:split.bzl", "split") -load("//toolchain/triplet:VersionedInfo.bzl", "VersionedInfo") +load("//toolchain:split.bzl", "split") +load("//toolchain:VersionedInfo.bzl", "VersionedInfo") visibility("//toolchain/local/triplet/...") diff --git a/toolchain/local/triplet/os.bzl b/toolchain/local/triplet/os.bzl index b2a9afcb70bd78209cb10d20b3d1f8a3c790502f..206238e6e601725f2d6624319030b1a73ed6d77b 100644 --- a/toolchain/local/triplet/os.bzl +++ b/toolchain/local/triplet/os.bzl @@ -1,5 +1,5 @@ -load("//toolchain/triplet:split.bzl", "split") -load("//toolchain/triplet:VersionedInfo.bzl", "VersionedInfo") +load("//toolchain:split.bzl", "split") +load("//toolchain:VersionedInfo.bzl", "VersionedInfo") visibility("//toolchain/local/triplet/...") diff --git a/toolchain/platform/BUILD.bazel b/toolchain/platform/BUILD.bazel index dec518b8ec1566382a6a192d4aad0c39079ce121..7941575580d6b478a5af214ef044603aa11a2220 100644 --- a/toolchain/platform/BUILD.bazel +++ b/toolchain/platform/BUILD.bazel @@ -1,3 +1,4 @@ +load("//toolchain/couplet:couplets.bzl", "COUPLETS") load("//toolchain/triplet:triplets.bzl", "TRIPLETS") [ @@ -11,20 +12,11 @@ load("//toolchain/triplet:triplets.bzl", "TRIPLETS") [ platform( - name = "{}-{}".format(cpu, os), - constraint_values = [ - "//toolchain/constraint/cpu:{}".format(cpu), - "//toolchain/constraint/os:{}".format(os), - ], - ) - for cpu, os in ( - ("amd64", "linux"), - ("arm64", "linux"), - ("amd64", "windows"), - ("arm64", "windows"), - ("amd64", "macos"), - ("arm64", "macos"), + name = c.value, + constraint_values = c.constraints, + visibility = ["//visibility:public"], ) + for c in COUPLETS ] alias( diff --git a/toolchain/triplet/split.bzl b/toolchain/split.bzl similarity index 100% rename from toolchain/triplet/split.bzl rename to toolchain/split.bzl diff --git a/toolchain/triplet/TripletInfo.bzl b/toolchain/triplet/TripletInfo.bzl index 99ee803ba1da869eece508f9db424ba120dfe202..bb92fac9abf302c20e763cb7208eba155351763f 100644 --- a/toolchain/triplet/TripletInfo.bzl +++ b/toolchain/triplet/TripletInfo.bzl @@ -1,6 +1,6 @@ load("@bazel_skylib//lib:types.bzl", "types") -load(":VersionedInfo.bzl", "VersionedInfo") -load(":split.bzl", "split") +load("//toolchain:VersionedInfo.bzl", "VersionedInfo") +load("//toolchain:split.bzl", "split") visibility("//toolchain/...") diff --git a/toolchain/triplet/triplets.bzl b/toolchain/triplet/triplets.bzl index 213651e1d740060049826573cce1200242f863bb..163839193b6270117cab01634859ddcbb5dfc8d1 100644 --- a/toolchain/triplet/triplets.bzl +++ b/toolchain/triplet/triplets.bzl @@ -7,4 +7,10 @@ TRIPLETS = ( LOCAL, TripletInfo("arm64-linux-gnu"), TripletInfo("amd64-linux-gnu"), + TripletInfo("arm64-linux-musl"), + TripletInfo("amd64-linux-musl"), + TripletInfo("arm64-macos-darwin"), + TripletInfo("amd64-macos-darwin"), + TripletInfo("arm64-windows-ucrt"), + TripletInfo("amd64-windows-ucrt"), )