diff --git a/.bazelignore b/.bazelignore
index c52920b24..bf4b8b95f 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -13,3 +13,4 @@ bazel-testlogs
bazel-nativelink
local-remote-execution/generated-cc
local-remote-execution/generated-java
+local-remote-execution/lre-rs
diff --git a/.bazelrc b/.bazelrc
index fd9a1d20f..a1b212f59 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -70,10 +70,7 @@ build:tsan --run_under=//tools:tsan.sh
startup --windows_enable_symlinks
build:windows --cxxopt=/std:c++14 --host_cxxopt=/std:c++14
build:windows --enable_runfiles
-
-# Global rust toolchain configuration. Deferred to here so that the cc
-# toolchains are resolved before the rust toolchains.
-build --extra_toolchains=@rust_toolchains//:all
+build:windows --extra_toolchains=@rust_toolchains//:all # Doesn't support LRE.
# Generated by the LRE flake module.
try-import %workspace%/lre.bazelrc
diff --git a/.github/workflows/lre.yaml b/.github/workflows/lre.yaml
index 25387cf1e..2e184bc47 100644
--- a/.github/workflows/lre.yaml
+++ b/.github/workflows/lre.yaml
@@ -20,8 +20,12 @@ jobs:
strategy:
fail-fast: false
matrix:
- os: [ubuntu-22.04]
- name: Local / ${{ matrix.os }}
+ os: [ubuntu-24.04, macos-14]
+ toolchain: [lre-cc, lre-rs]
+ exclude:
+ - os: macos-14
+ toolchain: lre-cc
+ name: Local / ${{ matrix.toolchain }} / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 45
steps:
@@ -46,19 +50,22 @@ jobs:
uses: >- # v4
DeterminateSystems/magic-nix-cache-action@fc6aaceb40b9845a02b91e059ec147e78d1b4e41
- - name: Build hello_lre with LRE toolchain.
+ - name: Build example with ${{ matrix.toolchain }} toolchain
+ env:
+ TOOLCHAIN: ${{ matrix.toolchain }}
run: >
nix develop --impure --command
bash -c "bazel run \
--verbose_failures \
- @local-remote-execution//examples:hello_lre"
+ @local-remote-execution//examples:${TOOLCHAIN}"
remote:
strategy:
fail-fast: false
matrix:
os: [large-ubuntu-22.04]
- name: Remote / ${{ matrix.os }}
+ toolchain: [lre-cc, lre-rs]
+ name: Remote / ${{ matrix.toolchain }} / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 45
steps:
@@ -92,12 +99,17 @@ jobs:
REPO_URL: ${{ github.event.pull_request.head.repo.clone_url || format('https://github.com/{0}.git', github.repository) }}
BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name }}
COMMIT: ${{ github.event.pull_request.head.sha || github.sha }}
+ TOOLCHAIN: ${{ matrix.toolchain }}
run: |
nix develop --impure --command bash -c 'cat > kustomization.yaml << EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- - deploy/kubernetes-example
+ - kubernetes/resources/flux
+ - kubernetes/resources/nativelink-core
+ - kubernetes/resources/gateway-routes
+ - kubernetes/workers/resources/worker-init
+ - kubernetes/workers/resources/${TOOLCHAIN}
patches:
- patch: |-
- op: replace
@@ -112,6 +124,27 @@ jobs:
target:
kind: GitRepository
name: nativelink
+ - patch: |-
+ - op: replace
+ path: /spec/postBuild/substitute/PLACEHOLDER_FLAKE_OUTPUT
+ value: ./src_root#image
+ target:
+ kind: Kustomization
+ name: nativelink-alert-core
+ - patch: |-
+ - op: replace
+ path: /spec/postBuild/substitute/PLACEHOLDER_FLAKE_OUTPUT
+ value: ./src_root#nativelink-worker-init
+ target:
+ kind: Kustomization
+ name: nativelink-alert-worker-init
+ - patch: |-
+ - op: replace
+ path: /spec/postBuild/substitute/PLACEHOLDER_FLAKE_OUTPUT
+ value: ./src_root#nativelink-worker-${TOOLCHAIN}
+ target:
+ kind: Kustomization
+ name: nativelink-alert-${TOOLCHAIN}
EOF
kubectl apply -k . &&
rm kustomization.yaml'
@@ -124,6 +157,8 @@ jobs:
nativelink-tekton-resources"
- name: Wait for alerts
+ env:
+ TOOLCHAIN: ${{ matrix.toolchain }}
run: >
nix develop --impure --command
bash -c "flux reconcile kustomization -n default \
@@ -134,7 +169,7 @@ jobs:
nativelink-alert-worker-init && \
flux reconcile kustomization -n default \
--timeout=15m \
- nativelink-alert-lre-cc"
+ nativelink-alert-${TOOLCHAIN}"
- name: Trigger pipelines
run: |
@@ -181,11 +216,13 @@ jobs:
nativelink-core"
- name: Wait for Worker Kustomization
+ env:
+ TOOLCHAIN: ${{ matrix.toolchain }}
run: >
nix develop --impure --command
bash -c "flux reconcile kustomization -n default \
--timeout=15m \
- nativelink-lre-cc"
+ nativelink-${TOOLCHAIN}"
- name: Wait for NativeLink
run: >
@@ -193,9 +230,11 @@ jobs:
bash -c "kubectl rollout status deploy/nativelink"
- name: Wait for worker
+ env:
+ TOOLCHAIN: ${{ matrix.toolchain }}
run: >
nix develop --impure --command
- bash -c "kubectl rollout status deploy/nativelink-worker-lre-cc"
+ bash -c "kubectl rollout status deploy/nativelink-worker-${TOOLCHAIN}"
- name: Get gateway IPs
id: gateway-ips
@@ -215,10 +254,12 @@ jobs:
kubectl logs -l app=nativelink-worker
- name: Build hello_lre with LRE toolchain.
+ env:
+ TOOLCHAIN: ${{ matrix.toolchain }}
run: >
nix develop --impure --command
bash -c "bazel run \
--remote_cache=grpc://$nativelink_ip \
--remote_executor=grpc://$nativelink_ip \
--verbose_failures \
- @local-remote-execution//examples:hello_lre"
+ @local-remote-execution//examples:${TOOLCHAIN}"
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index ff698c82c..0a467c39c 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -159,6 +159,7 @@ jobs:
docker run --rm --net=host -w /root/nativelink -v $PWD:/root/nativelink trace_machina/nativelink:builder sh -c ' \
bazel clean && \
bazel test //... \
+ --extra_toolchains=@rust_toolchains//:all \
--remote_cache=grpc://127.0.0.1:50051 \
--remote_executor=grpc://127.0.0.1:50052 \
--remote_default_exec_properties=cpu_count=1 \
@@ -166,6 +167,7 @@ jobs:
docker run --rm --net=host -w /root/nativelink -v $PWD:/root/nativelink trace_machina/nativelink:builder sh -c ' \
bazel clean && \
bazel test //... \
+ --extra_toolchains=@rust_toolchains//:all \
--remote_cache=grpc://127.0.0.1:50051 \
--remote_executor=grpc://127.0.0.1:50052 \
--remote_default_exec_properties=cpu_count=1 \
@@ -195,6 +197,7 @@ jobs:
build-args: |
OPT_LEVEL=fastbuild
OS_VERSION=${{ matrix.os_version }}
+ ADDITIONAL_BAZEL_FLAGS=--extra_toolchains=@rust_toolchains//:all
load: true # This brings the build into `docker images` from buildx.
tags: trace_machina/nativelink:latest
diff --git a/.github/workflows/native-bazel.yaml b/.github/workflows/native-bazel.yaml
index b01c09898..8c588e08e 100644
--- a/.github/workflows/native-bazel.yaml
+++ b/.github/workflows/native-bazel.yaml
@@ -72,7 +72,9 @@ jobs:
- name: Run Bazel tests
run: |
if [ "$RUNNER_OS" == "Linux" ] || [ "$RUNNER_OS" == "macOS" ]; then
- bazel test //... --verbose_failures
+ bazel test //... \
+ --extra_toolchains=@rust_toolchains//:all \
+ --verbose_failures
elif [ "$RUNNER_OS" == "Windows" ]; then
bazel \
--output_user_root=${{ steps.bazel-cache.outputs.mountpoint }} \
diff --git a/MODULE.bazel b/MODULE.bazel
index b40d261fb..ecc336b15 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -6,7 +6,7 @@ module(
bazel_dep(name = "rules_cc", version = "0.0.17")
bazel_dep(name = "platforms", version = "0.0.10")
-bazel_dep(name = "rules_python", version = "0.36.0")
+bazel_dep(name = "rules_python", version = "0.40.0")
python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
@@ -19,10 +19,50 @@ python.toolchain(
use_repo(python, python = "python_versions")
bazel_dep(name = "rules_rust", version = "0.54.1")
+archive_override(
+ module_name = "rules_rust",
+ integrity = "sha256-r09Wyq5QqZpov845sUG1Cd1oVIyCBLmKt6HK/JTVuwI=",
+ patch_strip = 1,
+ patches = ["//tools:rules_rust-musl-platforms.diff"],
+ urls = [
+ "https://github.com/bazelbuild/rules_rust/releases/download/0.54.1/rules_rust-v0.54.1.tar.gz",
+ ],
+)
+
+crate = use_extension("@rules_rust//crate_universe:extension.bzl", "crate")
+crate.from_cargo(
+ name = "crates",
+ cargo_lockfile = "//:Cargo.lock",
+ manifests = ["//:Cargo.toml"],
+ supported_platform_triples = [
+ "aarch64-apple-darwin",
+ "aarch64-unknown-linux-gnu",
+ "aarch64-unknown-linux-musl",
+ "arm-unknown-linux-gnueabi",
+ "armv7-unknown-linux-gnueabi",
+ "x86_64-apple-darwin",
+ "x86_64-pc-windows-msvc",
+ "x86_64-unknown-linux-gnu",
+ "x86_64-unknown-linux-musl",
+ ],
+)
+use_repo(crate, "crates")
+# NativeLink uses Local Remote Execution for Rust by default which automatically
+# handles Rust toolchain configuration via Nix.
+#
+# If you build outside of Nix you'll have to register these toolchains
+# explicitly by passing `--extra_toolchains=@rust_toolchains//:all` to your
+# Bazel invocation.
+#
+# WARNING: This configuration exists entirely as a convenience option and
+# migration and is not a supported way of building production
+# grade nativelink executables. It may be removed at any point in time.
rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
rust.toolchain(
edition = "2021",
+
+ # These should always follow the versions from LRE.
rust_analyzer_version = "nightly/2024-11-23",
rustfmt_version = "nightly/2024-11-23",
sha256s = {
@@ -44,43 +84,10 @@ rust.toolchain(
"nightly/2024-11-23",
],
)
-
-rust_host_tools = use_extension(
- "@rules_rust//rust:extension.bzl",
- "rust_host_tools",
-)
-rust_host_tools.host_tools(
- edition = "2021",
- version = "1.82.0",
-)
-
use_repo(rust, "rust_toolchains")
-crate = use_extension("@rules_rust//crate_universe:extension.bzl", "crate")
-crate.from_cargo(
- name = "crates",
- cargo_lockfile = "//:Cargo.lock",
- manifests = ["//:Cargo.toml"],
- supported_platform_triples = [
- "aarch64-apple-darwin",
- "aarch64-unknown-linux-gnu",
- "arm-unknown-linux-gnueabi",
- "armv7-unknown-linux-gnueabi",
- "x86_64-apple-darwin",
- "x86_64-pc-windows-msvc",
- "x86_64-unknown-linux-gnu",
- ],
-)
-use_repo(crate, "crates")
-
-rust_analyzer = use_extension(
- "@rules_rust//tools/rust_analyzer:extension.bzl",
- "rust_analyzer_dependencies",
-)
-rust_analyzer.rust_analyzer_dependencies()
-
-bazel_dep(name = "protobuf", version = "27.5", repo_name = "com_google_protobuf")
-bazel_dep(name = "toolchains_protoc", version = "0.3.3")
+bazel_dep(name = "protobuf", version = "29.0", repo_name = "com_google_protobuf")
+bazel_dep(name = "toolchains_protoc", version = "0.3.4")
protoc = use_extension("@toolchains_protoc//protoc:extensions.bzl", "protoc")
protoc.toolchain(
diff --git a/deploy/dev/kustomization.yaml b/deploy/dev/kustomization.yaml
index d87736ac0..cdcce9888 100644
--- a/deploy/dev/kustomization.yaml
+++ b/deploy/dev/kustomization.yaml
@@ -2,7 +2,12 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
-- ../kubernetes-example
+- ../../kubernetes/resources/flux
+- ../../kubernetes/resources/nativelink-core
+- ../../kubernetes/resources/gateway-routes
+- ../../kubernetes/workers/resources/worker-init
+- ../../kubernetes/workers/resources/lre-cc
+- ../../kubernetes/workers/resources/lre-rs
# Modify this value to change the repository containing the deployment files.
#
@@ -52,3 +57,10 @@ patches:
target:
kind: Kustomization
name: nativelink-alert-lre-cc
+- patch: |-
+ - op: replace
+ path: /spec/postBuild/substitute/PLACEHOLDER_FLAKE_OUTPUT
+ value: ./src_root#nativelink-worker-lre-rs
+ target:
+ kind: Kustomization
+ name: nativelink-alert-lre-rs
diff --git a/flake.nix b/flake.nix
index f4db47604..5d009f95a 100644
--- a/flake.nix
+++ b/flake.nix
@@ -52,54 +52,8 @@
system,
...
}: let
- stable-rust-version = "1.82.0";
- nightly-rust-version = "2024-11-23";
-
- llvmPackages = pkgs.llvmPackages_19;
-
- nixSystemToRustTriple = nixSystem:
- {
- "x86_64-linux" = "x86_64-unknown-linux-musl";
- "aarch64-linux" = "aarch64-unknown-linux-musl";
- "x86_64-darwin" = "x86_64-apple-darwin";
- "aarch64-darwin" = "aarch64-apple-darwin";
- }
- .${nixSystem}
- or (throw "Unsupported Nix system: ${nixSystem}");
-
- # Calling `pkgs.pkgsCross` changes the host and target platform to the
- # cross-target but leaves the build platform the same as pkgs.
- #
- # For instance, calling `pkgs.pkgsCross.aarch64-multiplatform` on an
- # `x86_64-linux` host sets `host==target==aarch64-linux` but leaves the
- # build platform at `x86_64-linux`.
- #
- # On aarch64-darwin the same `pkgs.pkgsCross.aarch64-multiplatform`
- # again sets `host==target==aarch64-linux` but now with a build platform
- # of `aarch64-darwin`.
- #
- # For optimal cache reuse of different crosscompilation toolchains we
- # take our rust toolchain from the host's `pkgs` and remap the rust
- # target to the target platform of the `pkgsCross` target. This lets us
- # reuse the same executables (for instance rustc) to build artifacts for
- # different target platforms.
- stableRustFor = p:
- p.rust-bin.stable.${stable-rust-version}.default.override {
- targets = [
- "${nixSystemToRustTriple p.stdenv.targetPlatform.system}"
- ];
- };
-
- nightlyRustFor = p:
- p.rust-bin.nightly.${nightly-rust-version}.default.override {
- extensions = ["llvm-tools"];
- targets = [
- "${nixSystemToRustTriple p.stdenv.targetPlatform.system}"
- ];
- };
-
- craneLibFor = p: (crane.mkLib p).overrideToolchain stableRustFor;
- nightlyCraneLibFor = p: (crane.mkLib p).overrideToolchain nightlyRustFor;
+ craneLibFor = p: (crane.mkLib p).overrideToolchain pkgs.lre.stableRustFor;
+ nightlyCraneLibFor = p: (crane.mkLib p).overrideToolchain pkgs.lre.nightlyRustFor;
src = pkgs.lib.cleanSourceWith {
src = (craneLibFor pkgs).path ./.;
@@ -110,18 +64,32 @@
# Warning: The different usages of `p` and `pkgs` are intentional as we
# use crosscompilers and crosslinkers whose packagesets collapse with
- # the host's packageset. If you change this, take care that you don't
+ # the host's packageset. If you change this take care that you don't
# accidentally explode the global closure size.
commonArgsFor = p: let
isLinuxBuild = p.stdenv.buildPlatform.isLinux;
isLinuxTarget = p.stdenv.targetPlatform.isLinux;
- targetArch = nixSystemToRustTriple p.stdenv.targetPlatform.system;
+ # Map the nix system to the Rust target triple that we'd want to target
+ # by default.
+ targetArch =
+ (
+ nixSystem:
+ {
+ "x86_64-linux" = "x86_64-unknown-linux-musl";
+ "aarch64-linux" = "aarch64-unknown-linux-musl";
+ "x86_64-darwin" = "x86_64-apple-darwin";
+ "aarch64-darwin" = "aarch64-apple-darwin";
+ }
+ .${nixSystem}
+ or (throw "Unsupported Nix host platform: ${nixSystem}")
+ )
+ p.stdenv.targetPlatform.system;
# Full path to the linker for CARGO_TARGET_XXX_LINKER
linkerPath =
if isLinuxBuild && isLinuxTarget
then "${pkgs.mold}/bin/ld.mold"
- else "${llvmPackages.lld}/bin/ld.lld";
+ else "${pkgs.llvmPackages_19.lld}/bin/ld.lld";
linkerEnvVar = "CARGO_TARGET_${pkgs.lib.toUpper (pkgs.lib.replaceStrings ["-"] ["_"] targetArch)}_LINKER";
in
@@ -142,7 +110,7 @@
(
if isLinuxBuild
then [pkgs.mold]
- else [llvmPackages.lld]
+ else [pkgs.llvmPackages_19.lld]
)
++ pkgs.lib.optionals p.stdenv.targetPlatform.isDarwin [
p.darwin.apple_sdk.frameworks.Security
@@ -202,7 +170,7 @@
"build-chromium-tests"
./deploy/chromium-example/build_chromium_tests.sh;
- docs = pkgs.callPackage ./tools/docs.nix {rust = stableRustFor pkgs;};
+ docs = pkgs.callPackage ./tools/docs.nix {rust = pkgs.lre.stable-rust;};
inherit (nix2container.packages.${system}.nix2container) pullImage;
inherit (nix2container.packages.${system}.nix2container) buildImage;
@@ -366,12 +334,14 @@
nativelink-x86_64-linux
publish-ghcr
;
+
default = nativelink;
nativelink-worker-lre-cc = createWorker pkgs.lre.lre-cc.image;
lre-java = pkgs.callPackage ./local-remote-execution/lre-java.nix {inherit buildImage;};
rbe-autogen-lre-java = pkgs.rbe-autogen lre-java;
nativelink-worker-lre-java = createWorker lre-java;
+ nativelink-worker-lre-rs = createWorker pkgs.lre.lre-rs.image;
nativelink-worker-siso-chromium = createWorker siso-chromium;
nativelink-worker-toolchain-drake = createWorker toolchain-drake;
nativelink-worker-toolchain-buck2 = createWorker toolchain-buck2;
@@ -405,15 +375,18 @@
pre-commit.settings = {
hooks = import ./tools/pre-commit-hooks.nix {
inherit pkgs;
- nightly-rust = pkgs.rust-bin.nightly.${nightly-rust-version};
+ nightly-rust = pkgs.rust-bin.nightly.${pkgs.lre.nightly-rust.meta.version};
};
};
local-remote-execution.settings = {
Env = with pkgs.lre;
if pkgs.stdenv.isDarwin
- then [] # Doesn't support Darwin yet.
- else lre-cc.meta.Env;
- prefix = "linux";
+ then lre-rs.meta.Env # C++ doesn't support Darwin yet.
+ else (lre-cc.meta.Env ++ lre-rs.meta.Env);
+ prefix =
+ if pkgs.stdenv.isDarwin
+ then "macos"
+ else "linux";
};
nixos.settings = {
path = with pkgs; [
@@ -438,8 +411,9 @@
pkgs.pre-commit
# Rust
- (stableRustFor pkgs)
bazel
+ pkgs.lre.stable-rust
+ pkgs.lre.lre-rs.lre-rs-configs-gen
## Infrastructure
pkgs.awscli2
diff --git a/kubernetes/components/worker/worker.json5 b/kubernetes/components/worker/worker.json5
index 21dcb6f95..284a6beef 100644
--- a/kubernetes/components/worker/worker.json5
+++ b/kubernetes/components/worker/worker.json5
@@ -73,6 +73,11 @@
// `local-remote-execution/generated-cc/config/BUILD`.
"${NATIVELINK_WORKER_PLATFORM:-undefined_platform}"
]
+ },
+ "lre-rs": {
+ "values": [
+ "${NATIVELINK_WORKER_LRE_RS:-undefined}"
+ ]
}
}
}
diff --git a/kubernetes/nativelink/nativelink-config.json5 b/kubernetes/nativelink/nativelink-config.json5
index 528b625e6..e06d78269 100644
--- a/kubernetes/nativelink/nativelink-config.json5
+++ b/kubernetes/nativelink/nativelink-config.json5
@@ -63,7 +63,8 @@
"cpu_model": "priority",
"kernel_version": "priority",
"OSFamily": "priority",
- "container-image": "priority"
+ "container-image": "priority",
+ "lre-rs": "priority"
}
}
}
diff --git a/kubernetes/workers/lre-rs/kustomization.yaml b/kubernetes/workers/lre-rs/kustomization.yaml
new file mode 100644
index 000000000..38d7568cf
--- /dev/null
+++ b/kubernetes/workers/lre-rs/kustomization.yaml
@@ -0,0 +1,17 @@
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+nameSuffix: -lre-rs
+
+components:
+- ../../components/worker
+
+patches:
+- path: worker-lre-rs.yaml
+ target:
+ kind: Deployment
+ name: nativelink-worker
+
+images:
+- name: nativelink-worker
+ newName: nativelink-worker-lre-rs
diff --git a/kubernetes/workers/lre-rs/worker-lre-rs.yaml b/kubernetes/workers/lre-rs/worker-lre-rs.yaml
new file mode 100644
index 000000000..eab188f1f
--- /dev/null
+++ b/kubernetes/workers/lre-rs/worker-lre-rs.yaml
@@ -0,0 +1,40 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nativelink-worker-lre-rs
+spec:
+ replicas: 1
+ template:
+ spec:
+ initContainers:
+ - name: setup-entrypoint
+ image: nixpkgs/nix-flakes:latest
+ command: ["/bin/sh", "-c"]
+ # The kind setup mounts the nativelink repository into the kind nodes
+ # at `/mnt/src_root`. This ensures that the tags between the worker
+ # configs and bazel toolchains match when this setup is run in CI.
+ args:
+ - |
+ git config --global --add safe.directory "*"
+ NATIVELINK_WORKER_LRE_RS=$(nix eval /mnt/src_root#nativelink-worker-lre-rs.imageTag --raw) &&
+ printf '#!/bin/sh\nexport NATIVELINK_WORKER_LRE_RS=%s\nexec "$@"' "$NATIVELINK_WORKER_LRE_RS" > /entrypoint/entrypoint.sh &&
+ chmod +x /entrypoint/entrypoint.sh
+ volumeMounts:
+ - name: entrypoint
+ mountPath: /entrypoint
+ - name: mnt
+ mountPath: /mnt
+ containers:
+ - name: nativelink-worker
+ volumeMounts:
+ - name: entrypoint
+ mountPath: /entrypoint
+ command: ["/entrypoint/entrypoint.sh"]
+ args: ["/shared/nativelink", "/worker.json5"]
+ volumes:
+ - name: entrypoint
+ emptyDir: {}
+ - name: mnt
+ hostPath:
+ path: /mnt
diff --git a/kubernetes/workers/resources/lre-rs/kustomization.yaml b/kubernetes/workers/resources/lre-rs/kustomization.yaml
new file mode 100644
index 000000000..d0a46d696
--- /dev/null
+++ b/kubernetes/workers/resources/lre-rs/kustomization.yaml
@@ -0,0 +1,60 @@
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+nameSuffix: -lre-rs
+
+resources:
+ - ../../../resources/alert-kustomization
+
+components:
+ - ../../../components/kustomization
+
+replacements:
+ - source:
+ kind: Kustomization
+ name: nativelink
+ fieldPath: metadata.name
+ targets:
+ - select:
+ kind: Kustomization
+ name: nativelink-alert
+ fieldPaths:
+ - spec.postBuild.substitute.PLACEHOLDER_CONFIG_MAP_NAME
+ - select:
+ kind: Kustomization
+ name: nativelink
+ fieldPaths:
+ - spec.postBuild.substituteFrom.0.name
+
+patches:
+- patch: |-
+ - op: replace
+ path: /spec/postBuild/substitute/PLACEHOLDER_FLAKE_OUTPUT
+ value: github:TraceMachina/nativelink#nativelink-worker-lre-rs
+ - op: add
+ path: /spec/nameSuffix
+ value: -lre-rs
+ target:
+ kind: Kustomization
+ name: nativelink-alert
+- patch: |-
+ - op: replace
+ path: /spec/path
+ value: ./kubernetes/workers/lre-rs
+ - op: add
+ path: /spec/postBuild/substituteFrom/1
+ value:
+ kind: ConfigMap
+ name: nativelink-worker-init
+ - op: add
+ path: /spec/images
+ value:
+ - name: nativelink-worker-init
+ newName: localhost:5001/nativelink-worker-init
+ newTag: ${NATIVELINK_WORKER_INIT_TAG}
+ - name: nativelink-worker-lre-rs
+ newName: localhost:5001/nativelink-worker-lre-rs
+ newTag: ${NATIVELINK_WORKER_LRE_RS_TAG}
+ target:
+ kind: Kustomization
+ name: nativelink
diff --git a/local-remote-execution/MODULE.bazel b/local-remote-execution/MODULE.bazel
index fed578399..c0d1dcbb9 100644
--- a/local-remote-execution/MODULE.bazel
+++ b/local-remote-execution/MODULE.bazel
@@ -14,3 +14,18 @@ bazel_dep(name = "rules_cc", version = "0.0.17")
# Use the starlark implementation of Java rules instead of the builtin ones.
bazel_dep(name = "rules_java", version = "8.5.1")
+bazel_dep(name = "rules_rust", version = "0.54.1")
+bazel_dep(name = "bazel_skylib", version = "1.7.1")
+
+lre_rs = use_extension("//lre-rs:extension.bzl", "lre_rs")
+use_repo(
+ lre_rs,
+ "lre-rs-nightly-aarch64-darwin",
+ "lre-rs-nightly-aarch64-linux",
+ "lre-rs-nightly-x86_64-darwin",
+ "lre-rs-nightly-x86_64-linux",
+ "lre-rs-stable-aarch64-darwin",
+ "lre-rs-stable-aarch64-linux",
+ "lre-rs-stable-x86_64-darwin",
+ "lre-rs-stable-x86_64-linux",
+)
diff --git a/local-remote-execution/README.md b/local-remote-execution/README.md
index f3c06f7b2..4d1da9a52 100644
--- a/local-remote-execution/README.md
+++ b/local-remote-execution/README.md
@@ -275,15 +275,15 @@ bazel build \
--remote_instance_name=main \
--remote_cache=grpc://$CACHE:50051 \
--remote_executor=grpc://$SCHEDULER:50052 \
- //local-remote-execution/examples:hello_lre
+ //local-remote-execution/examples:lre-cc
```
The target builds remotely:
```bash
INFO: Found 1 target...
-Target //local-remote-execution/examples:hello_lre up-to-date:
- bazel-bin/local-remote-execution/examples/hello_lre
+Target //local-remote-execution/examples:lre-cc up-to-date:
+ bazel-bin/local-remote-execution/examples/lre-cc
INFO: Elapsed time: 3.004s, Critical Path: 2.23s
INFO: 11 processes: 9 internal, <<<2 remote>>>.
INFO: Build completed successfully, 11 total actions
@@ -304,16 +304,16 @@ bazel build \
--config=lre \
--remote_instance_name=main \
--remote_cache=grpc://$CACHE:50051 \
- //local-remote-execution/examples:hello_lre
+ //local-remote-execution/examples:lre-cc
```
You'll get a cache hit on the target despite using a local build:
```bash
-INFO: Analyzed target //local-remote-execution/examples:hello_lre (91 packages loaded, 1059 targets configured).
+INFO: Analyzed target //local-remote-execution/examples:lre-cc (91 packages loaded, 1059 targets configured).
INFO: Found 1 target...
-Target //local-remote-execution/examples:hello_lre up-to-date:
- bazel-bin/local-remote-execution/examples/hello_lre
+Target //local-remote-execution/examples:lre-cc up-to-date:
+ bazel-bin/local-remote-execution/examples/lre-cc
INFO: Elapsed time: 0.767s, Critical Path: 0.18s
INFO: 11 processes: <<<2 remote cache hit>>>, 9 internal.
INFO: Build completed successfully, 11 total actions
diff --git a/local-remote-execution/examples/BUILD.bazel b/local-remote-execution/examples/BUILD.bazel
index b7efedad8..10d5c0c97 100644
--- a/local-remote-execution/examples/BUILD.bazel
+++ b/local-remote-execution/examples/BUILD.bazel
@@ -1,12 +1,26 @@
load("@rules_cc//cc:defs.bzl", "cc_binary")
+load("@rules_rust//rust:defs.bzl", "rust_binary")
-# This example matches the config of the lre platform
cc_binary(
- name = "hello_lre",
+ name = "lre-cc",
srcs = ["hello.cpp"],
copts = ["--verbose"],
- target_compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:x86_64",
+ linkopts = ["-Wl,--verbose"],
+ target_compatible_with = select({
+ "@local-remote-execution//nix-system:x86_64-linux": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
+)
+
+rust_binary(
+ name = "lre-rs",
+ srcs = ["hello.rs"],
+ rustc_flags = [
+ "--print",
+ "link-args",
],
+ target_compatible_with = select({
+ "@local-remote-execution//nix-system:any": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
)
diff --git a/local-remote-execution/examples/hello.rs b/local-remote-execution/examples/hello.rs
new file mode 100644
index 000000000..47ad8c634
--- /dev/null
+++ b/local-remote-execution/examples/hello.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello World!");
+}
diff --git a/local-remote-execution/flake-module.nix b/local-remote-execution/flake-module.nix
index 2741b3d55..ae9228815 100644
--- a/local-remote-execution/flake-module.nix
+++ b/local-remote-execution/flake-module.nix
@@ -49,6 +49,7 @@
config = {
perSystem = {pkgs, ...}: {
packages = {
+ inherit (pkgs.lre) stable-rust nightly-rust;
rbe-autogen-lre-cc = pkgs.rbe-autogen pkgs.lre.lre-cc.image;
};
};
diff --git a/local-remote-execution/libc/BUILD.bazel b/local-remote-execution/libc/BUILD.bazel
new file mode 100644
index 000000000..766554cb1
--- /dev/null
+++ b/local-remote-execution/libc/BUILD.bazel
@@ -0,0 +1,13 @@
+constraint_setting(name = "libc")
+
+constraint_value(
+ name = "glibc",
+ constraint_setting = ":libc",
+ visibility = ["//visibility:public"],
+)
+
+constraint_value(
+ name = "musl",
+ constraint_setting = ":libc",
+ visibility = ["//visibility:public"],
+)
diff --git a/local-remote-execution/lre-rs/BUILD.bazel b/local-remote-execution/lre-rs/BUILD.bazel
new file mode 100644
index 000000000..ba0cd85de
--- /dev/null
+++ b/local-remote-execution/lre-rs/BUILD.bazel
@@ -0,0 +1,242 @@
+# Copyright 2024 The NativeLink 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.
+
+load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
+load(
+ "@rules_rust//rust:toolchain.bzl",
+ "rust_toolchain",
+ "rustfmt_toolchain",
+)
+
+string_flag(
+ name = "channel",
+ build_setting_default = "stable",
+ values = [
+ "stable",
+ "nightly",
+ ],
+ visibility = ["//visibility:public"],
+)
+
+config_setting(
+ name = "stable",
+ flag_values = {":channel": "stable"},
+)
+
+config_setting(
+ name = "nightly",
+ flag_values = {":channel": "nightly"},
+)
+
+string_flag(
+ name = "rustfmt-channel",
+ # It's a common use case (and matching with rules_rust's default behavior)
+ # to use nightly rustfmt with a stable rust toolchain, so we default to
+ # nightly here.
+ build_setting_default = "nightly",
+ values = [
+ "stable",
+ "nightly",
+ ],
+ visibility = ["//visibility:public"],
+)
+
+config_setting(
+ name = "rustfmt-stable",
+ flag_values = {":rustfmt-channel": "stable"},
+)
+
+config_setting(
+ name = "rustfmt-nightly",
+ flag_values = {":rustfmt-channel": "nightly"},
+)
+
+[
+ rust_toolchain(
+ name = "rust-{}-{}_impl".format(channel, nix_system),
+ allocator_library = select({
+ "@local-remote-execution//libc:musl": None,
+ "//conditions:default": "@rules_rust//ffi/cc/allocator_library",
+ }),
+ binary_ext = "",
+ cargo = "@lre-rs-{}-{}//:cargo".format(channel, nix_system),
+ cargo_clippy = "@lre-rs-{}-{}//:cargo-clippy".format(channel, nix_system),
+ clippy_driver = "@lre-rs-{}-{}//:clippy-driver".format(channel, nix_system),
+ debug_info = {
+ "dbg": "2",
+ "fastbuild": "0",
+ "opt": "0",
+ },
+ default_edition = "2021",
+ dylib_ext = select({
+ "@platforms//os:linux": ".so",
+ "@platforms//os:macos": ".dylib",
+ "//conditions:default": "@platforms//:incompatible",
+ }),
+ env = {},
+ exec_triple = {
+ "x86_64-linux": "x86_64-unknown-linux-gnu",
+ "aarch64-linux": "aarch64-unknown-linux-gnu",
+ "x86_64-darwin": "x86_64-apple-darwin",
+ "aarch64-darwin": "aarch64-apple-darwin",
+ }[nix_system],
+
+ # TODO(aaronmondal): Make these easily configurable.
+ extra_exec_rustc_flags = [],
+ extra_rustc_flags = [],
+ extra_rustc_flags_for_crate_types = {},
+ global_allocator_library = select({
+ "@local-remote-execution//libc:musl": None,
+ "//conditions:default": "@rules_rust//ffi/cc/global_allocator_library",
+ }),
+
+ # TODO(aaronmondal): Implement these.
+ # llvm_cov,
+ # llvm_profdata,
+ # llvm_tools,
+ opt_level = {
+ "dbg": "0",
+ "fastbuild": "0",
+ "opt": "3",
+ },
+ per_crate_rustc_flags = [],
+ rust_doc = "@lre-rs-{}-{}//:rustdoc".format(channel, nix_system),
+ rust_std = "@lre-rs-{}-{}//:rust_std".format(channel, nix_system),
+ rustc = "@lre-rs-{}-{}//:rustc".format(channel, nix_system),
+ rustc_lib = "@lre-rs-{}-{}//:rustc_lib".format(channel, nix_system),
+ rustfmt = None, # Rustfmt actions use the rustfmt-toolchain.
+ staticlib_ext = ".a",
+ stdlib_linkflags = select(
+ {
+ "@local-remote-execution//libc:glibc": [
+ "-fuse-ld=mold",
+ "-lpthread",
+ "-ldl",
+ ],
+ "@local-remote-execution//libc:musl": [
+ "-fuse-ld=mold",
+ ],
+ "@platforms//os:macos": [],
+ },
+ no_match_error = "Linking for unset libc on linux isn't implemented yet.",
+ ),
+ strip_level = {
+ "dbg": "none",
+ "fastbuild": "none",
+ "opt": "debuginfo",
+ },
+ target_json = "",
+ target_triple = select(
+ {
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": "aarch64-unknown-linux-gnu",
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": "aarch64-unknown-linux-musl",
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": "x86_64-unknown-linux-gnu",
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": "x86_64-unknown-linux-musl",
+ } | ({
+ "@local-remote-execution//lre-rs/triple:x86_64-apple-darwin": "x86_64-apple-darwin",
+ "@local-remote-execution//lre-rs/triple:aarch64-apple-darwin": "aarch64-apple-darwin",
+ } if nix_system in [
+ "aarch64-darwin",
+ "x86_64-darwin",
+ ] else {}),
+ no_match_error = "Incompatible target triple supplied to lre-rs-toolchain running on {}.".format(nix_system),
+ ),
+ )
+ for channel in [
+ "stable",
+ "nightly",
+ ]
+ for nix_system in [
+ "x86_64-linux",
+ "aarch64-linux",
+ "x86_64-darwin",
+ "aarch64-darwin",
+ ]
+]
+
+[
+ toolchain(
+ name = "rust-{}-{}".format(arch, os),
+ exec_compatible_with = [
+ "@platforms//os:{}".format(os if os == "linux" else "macos"),
+ "@platforms//cpu:{}".format(arch),
+ "@bazel_tools//tools/cpp:clang",
+ ],
+ target_compatible_with =
+ # Linux toolchains can only target other linux systems.
+ # Darwin toolchains can target everything.
+ ["@platforms//os:linux"] if os == "linux" else [],
+ toolchain = select({
+ ":stable": ":rust-stable-{}-{}_impl".format(arch, os),
+ ":nightly": ":rust-nightly-{}-{}_impl".format(arch, os),
+ }),
+ toolchain_type = "@rules_rust//rust:toolchain_type",
+ )
+ for arch in [
+ "aarch64",
+ "x86_64",
+ ]
+ for os in [
+ "linux",
+ "darwin",
+ ]
+]
+
+[
+ rustfmt_toolchain(
+ name = "rustfmt-{}-{}_impl".format(channel, nix_system),
+ rustc = "@lre-rs-{}-{}//:rustc".format(channel, nix_system),
+ rustc_lib = "@lre-rs-{}-{}//:rustc_lib".format(channel, nix_system),
+ rustfmt = "@lre-rs-{}-{}//:rustfmt".format(channel, nix_system),
+ )
+ for nix_system in [
+ "x86_64-linux",
+ "aarch64-linux",
+ "x86_64-darwin",
+ "aarch64-darwin",
+ ]
+ for channel in [
+ "stable",
+ "nightly",
+ ]
+]
+
+# Limit rustfmt to exec == target until we find a good reason to do otherwise.
+[
+ toolchain(
+ name = "rustfmt-{}-{}".format(arch, os),
+ exec_compatible_with = [
+ "@platforms//os:{}".format(os if os == "linux" else "macos"),
+ "@platforms//cpu:{}".format(arch),
+ "@bazel_tools//tools/cpp:clang",
+ ],
+ target_compatible_with = [
+ "@platforms//os:{}".format(os if os == "linux" else "macos"),
+ "@platforms//cpu:{}".format(arch),
+ ],
+ toolchain = select({
+ ":rustfmt-stable": ":rustfmt-stable-{}-{}_impl".format(arch, os),
+ ":rustfmt-nightly": ":rustfmt-nightly-{}-{}_impl".format(arch, os),
+ }),
+ toolchain_type = "@rules_rust//rust/rustfmt:toolchain_type",
+ )
+ for arch in [
+ "aarch64",
+ "x86_64",
+ ]
+ for os in [
+ "darwin",
+ "linux",
+ ]
+]
diff --git a/local-remote-execution/lre-rs/aarch64-darwin.BUILD.bazel b/local-remote-execution/lre-rs/aarch64-darwin.BUILD.bazel
new file mode 100644
index 000000000..d72b70d44
--- /dev/null
+++ b/local-remote-execution/lre-rs/aarch64-darwin.BUILD.bazel
@@ -0,0 +1,125 @@
+# Copyright 2024 The NativeLink 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.
+
+# This file is @generated by lre-rs.
+
+"""Tool repository for lre-rs executing on aarch64-darwin."""
+
+load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
+
+[
+ filegroup(
+ name = tool,
+ srcs = [
+ "bin/{}".format(tool),
+ ],
+ visibility = ["//visibility:public"],
+ )
+ for tool in [
+ "rustc",
+ "rustfmt",
+ "cargo",
+ "cargo-clippy",
+ "clippy-driver",
+ "rustdoc",
+ ]
+]
+
+filegroup(
+ name = "rustc_lib",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-apple-darwin": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-apple-darwin/codegen-backends/*.so",
+ "lib/rustlib/aarch64-apple-darwin/bin/rust-lld",
+ "lib/rustlib/aarch64-apple-darwin/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-apple-darwin": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-apple-darwin/codegen-backends/*.so",
+ "lib/rustlib/x86_64-apple-darwin/bin/rust-lld",
+ "lib/rustlib/x86_64-apple-darwin/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
+
+rust_stdlib_filegroup(
+ name = "rust_std",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-apple-darwin": glob([
+ "lib/rustlib/aarch64-apple-darwin/lib/*.rlib",
+ "lib/rustlib/aarch64-apple-darwin/lib/*.so",
+ "lib/rustlib/aarch64-apple-darwin/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-apple-darwin": glob([
+ "lib/rustlib/x86_64-apple-darwin/lib/*.rlib",
+ "lib/rustlib/x86_64-apple-darwin/lib/*.so",
+ "lib/rustlib/x86_64-apple-darwin/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
diff --git a/local-remote-execution/lre-rs/aarch64-linux.BUILD.bazel b/local-remote-execution/lre-rs/aarch64-linux.BUILD.bazel
new file mode 100644
index 000000000..7a5474a64
--- /dev/null
+++ b/local-remote-execution/lre-rs/aarch64-linux.BUILD.bazel
@@ -0,0 +1,101 @@
+# Copyright 2024 The NativeLink 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.
+
+# This file is @generated by lre-rs.
+
+"""Tool repository for lre-rs executing on aarch64-linux."""
+
+load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
+
+[
+ filegroup(
+ name = tool,
+ srcs = [
+ "bin/{}".format(tool),
+ ],
+ visibility = ["//visibility:public"],
+ )
+ for tool in [
+ "rustc",
+ "rustfmt",
+ "cargo",
+ "cargo-clippy",
+ "clippy-driver",
+ "rustdoc",
+ ]
+]
+
+filegroup(
+ name = "rustc_lib",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
+
+rust_stdlib_filegroup(
+ name = "rust_std",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
diff --git a/local-remote-execution/lre-rs/extension.bzl b/local-remote-execution/lre-rs/extension.bzl
new file mode 100644
index 000000000..f40abda65
--- /dev/null
+++ b/local-remote-execution/lre-rs/extension.bzl
@@ -0,0 +1,71 @@
+# Copyright 2024 The NativeLink 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.
+
+# This file is @generated by lre-rs.
+
+"""Module extension to register different lre-rs tool repositories."""
+
+load("@bazel_tools//tools/build_defs/repo:local.bzl", "new_local_repository")
+
+# TODO(aaronmondal): Using module extensions here isn't optimal as it doesn't
+# allow overriding tools via environment variables.
+# Unfortunately rules_rust's rust_toolchain currently
+# requires tools to be declared via labels to filegroups,
+# so we need the new_local_repository approach here.
+# Add support for raw strings to rules_rust upstream so
+# that we can remove this module extension entirely.
+
+def _lre_rs_impl(_mctx):
+ new_local_repository(
+ name = "lre-rs-stable-aarch64-darwin",
+ build_file = "@local-remote-execution//lre-rs:aarch64-darwin.BUILD.bazel",
+ path = "/nix/store/59m1dvvnr0imcwdd0xiqaljis9ybvy24-rust-default-1.82.0",
+ )
+ new_local_repository(
+ name = "lre-rs-nightly-aarch64-darwin",
+ build_file = "@local-remote-execution//lre-rs:aarch64-darwin.BUILD.bazel",
+ path = "/nix/store/pjd6k6zj8blkxr551bkpz0xq3ycj9yhn-rust-default-1.85.0-nightly-2024-11-23",
+ )
+ new_local_repository(
+ name = "lre-rs-stable-aarch64-linux",
+ build_file = "@local-remote-execution//lre-rs:aarch64-linux.BUILD.bazel",
+ path = "/nix/store/pyr87frpmb04bh3s5sf7vszz9855w603-rust-default-1.82.0",
+ )
+ new_local_repository(
+ name = "lre-rs-nightly-aarch64-linux",
+ build_file = "@local-remote-execution//lre-rs:aarch64-linux.BUILD.bazel",
+ path = "/nix/store/afdl7canh5p6krqzw5vm1g4kihhqfvsr-rust-default-1.85.0-nightly-2024-11-23",
+ )
+ new_local_repository(
+ name = "lre-rs-stable-x86_64-darwin",
+ build_file = "@local-remote-execution//lre-rs:x86_64-darwin.BUILD.bazel",
+ path = "/nix/store/x030cxhzj00bw41yaqiy2ihjj1mgi6mr-rust-default-1.82.0",
+ )
+ new_local_repository(
+ name = "lre-rs-nightly-x86_64-darwin",
+ build_file = "@local-remote-execution//lre-rs:x86_64-darwin.BUILD.bazel",
+ path = "/nix/store/g1irmsn6x1gndkjisal978jfs5s0dqb2-rust-default-1.85.0-nightly-2024-11-23",
+ )
+ new_local_repository(
+ name = "lre-rs-stable-x86_64-linux",
+ build_file = "@local-remote-execution//lre-rs:x86_64-linux.BUILD.bazel",
+ path = "/nix/store/kl18sr2a45vyyqv39clrjclmadacy9mc-rust-default-1.82.0",
+ )
+ new_local_repository(
+ name = "lre-rs-nightly-x86_64-linux",
+ build_file = "@local-remote-execution//lre-rs:x86_64-linux.BUILD.bazel",
+ path = "/nix/store/902a168nsh4vha014j538abaji3lpwa2-rust-default-1.85.0-nightly-2024-11-23",
+ )
+
+lre_rs = module_extension(implementation = _lre_rs_impl)
diff --git a/local-remote-execution/lre-rs/platforms/BUILD.bazel b/local-remote-execution/lre-rs/platforms/BUILD.bazel
new file mode 100644
index 000000000..e2993dcf3
--- /dev/null
+++ b/local-remote-execution/lre-rs/platforms/BUILD.bazel
@@ -0,0 +1,78 @@
+# Copyright 2024 The NativeLink 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.
+
+# This file is @generated by lre-rs.
+
+# Some toolchains, like the darwin ones, don't have an actual container image.
+# We still map them to the output of the tag of the corresponding theoretical
+# worker image so that bare metal metal workers can advertise exact
+# exec_properties to schedulers.
+
+platform(
+ name = "aarch64-apple-darwin",
+ exec_properties = {
+ # nix eval .#packages.aarch64-darwin.nativelink-worker-lre-rs.imageTag
+ "lre-rs": "xbwngvrnr7ygazcr20a3mddsx05l3nxn",
+ },
+ parents = ["@local-remote-execution//platforms:aarch64-darwin"],
+)
+
+platform(
+ name = "aarch64-unknown-linux-gnu",
+ constraint_values = ["@local-remote-execution//libc:glibc"],
+ exec_properties = {
+ # nix eval .#packages.aarch64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": "j8gd39m51074dgm3d82bm68dda8lbg62",
+ },
+ parents = ["@local-remote-execution//platforms:aarch64-linux"],
+)
+
+platform(
+ name = "aarch64-unknown-linux-musl",
+ constraint_values = ["@local-remote-execution//libc:musl"],
+ exec_properties = {
+ # nix eval .#packages.aarch64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": "j8gd39m51074dgm3d82bm68dda8lbg62",
+ },
+ parents = ["@local-remote-execution//platforms:aarch64-linux"],
+)
+
+platform(
+ name = "x86_64-apple-darwin",
+ exec_properties = {
+ # nix eval .#packages.x86_64-darwin.nativelink-worker-lre-rs.imageTag
+ "lre-rs": "ywhklqs9l7lz59c1l2fzqp2nzza1c75q",
+ },
+ parents = ["@local-remote-execution//platforms:x86_64-darwin"],
+)
+
+platform(
+ name = "x86_64-unknown-linux-gnu",
+ constraint_values = ["@local-remote-execution//libc:glibc"],
+ exec_properties = {
+ # nix eval .#packages.x86_64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": "phg85ss1hq298ixjn8iqnbrhh5x5x384",
+ },
+ parents = ["@local-remote-execution//platforms:x86_64-linux"],
+)
+
+platform(
+ name = "x86_64-unknown-linux-musl",
+ constraint_values = ["@local-remote-execution//libc:musl"],
+ exec_properties = {
+ # nix eval .#packages.x86_64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": "phg85ss1hq298ixjn8iqnbrhh5x5x384",
+ },
+ parents = ["@local-remote-execution//platforms:x86_64-linux"],
+)
diff --git a/local-remote-execution/lre-rs/triple/BUILD.bazel b/local-remote-execution/lre-rs/triple/BUILD.bazel
new file mode 100644
index 000000000..3a60ceade
--- /dev/null
+++ b/local-remote-execution/lre-rs/triple/BUILD.bazel
@@ -0,0 +1,69 @@
+# Copyright 2024 The NativeLink 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.
+
+# These config settings correspond to rust triples.
+
+load("@bazel_skylib//lib:selects.bzl", "selects")
+
+selects.config_setting_group(
+ name = "aarch64-apple-darwin",
+ match_all = [
+ "@platforms//cpu:aarch64",
+ "@platforms//os:macos",
+ ],
+)
+
+selects.config_setting_group(
+ name = "aarch64-unknown-linux-gnu",
+ match_all = [
+ "@platforms//cpu:aarch64",
+ "@platforms//os:linux",
+ "@local-remote-execution//libc:glibc",
+ ],
+)
+
+selects.config_setting_group(
+ name = "aarch64-unknown-linux-musl",
+ match_all = [
+ "@platforms//cpu:aarch64",
+ "@platforms//os:linux",
+ "@local-remote-execution//libc:musl",
+ ],
+)
+
+selects.config_setting_group(
+ name = "x86_64-apple-darwin",
+ match_all = [
+ "@platforms//cpu:x86_64",
+ "@platforms//os:macos",
+ ],
+)
+
+selects.config_setting_group(
+ name = "x86_64-unknown-linux-gnu",
+ match_all = [
+ "@platforms//cpu:x86_64",
+ "@platforms//os:linux",
+ "@local-remote-execution//libc:glibc",
+ ],
+)
+
+selects.config_setting_group(
+ name = "x86_64-unknown-linux-musl",
+ match_all = [
+ "@platforms//cpu:x86_64",
+ "@platforms//os:linux",
+ "@local-remote-execution//libc:musl",
+ ],
+)
diff --git a/local-remote-execution/lre-rs/x86_64-darwin.BUILD.bazel b/local-remote-execution/lre-rs/x86_64-darwin.BUILD.bazel
new file mode 100644
index 000000000..016833c6b
--- /dev/null
+++ b/local-remote-execution/lre-rs/x86_64-darwin.BUILD.bazel
@@ -0,0 +1,125 @@
+# Copyright 2024 The NativeLink 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.
+
+# This file is @generated by lre-rs.
+
+"""Tool repository for lre-rs executing on x86_64-darwin."""
+
+load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
+
+[
+ filegroup(
+ name = tool,
+ srcs = [
+ "bin/{}".format(tool),
+ ],
+ visibility = ["//visibility:public"],
+ )
+ for tool in [
+ "rustc",
+ "rustfmt",
+ "cargo",
+ "cargo-clippy",
+ "clippy-driver",
+ "rustdoc",
+ ]
+]
+
+filegroup(
+ name = "rustc_lib",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-apple-darwin": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-apple-darwin/codegen-backends/*.so",
+ "lib/rustlib/aarch64-apple-darwin/bin/rust-lld",
+ "lib/rustlib/aarch64-apple-darwin/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-apple-darwin": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-apple-darwin/codegen-backends/*.so",
+ "lib/rustlib/x86_64-apple-darwin/bin/rust-lld",
+ "lib/rustlib/x86_64-apple-darwin/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
+
+rust_stdlib_filegroup(
+ name = "rust_std",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-apple-darwin": glob([
+ "lib/rustlib/aarch64-apple-darwin/lib/*.rlib",
+ "lib/rustlib/aarch64-apple-darwin/lib/*.so",
+ "lib/rustlib/aarch64-apple-darwin/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-apple-darwin": glob([
+ "lib/rustlib/x86_64-apple-darwin/lib/*.rlib",
+ "lib/rustlib/x86_64-apple-darwin/lib/*.so",
+ "lib/rustlib/x86_64-apple-darwin/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
diff --git a/local-remote-execution/lre-rs/x86_64-linux.BUILD.bazel b/local-remote-execution/lre-rs/x86_64-linux.BUILD.bazel
new file mode 100644
index 000000000..000925c3e
--- /dev/null
+++ b/local-remote-execution/lre-rs/x86_64-linux.BUILD.bazel
@@ -0,0 +1,101 @@
+# Copyright 2024 The NativeLink 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.
+
+# This file is @generated by lre-rs.
+
+"""Tool repository for lre-rs executing on x86_64-linux."""
+
+load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
+
+[
+ filegroup(
+ name = tool,
+ srcs = [
+ "bin/{}".format(tool),
+ ],
+ visibility = ["//visibility:public"],
+ )
+ for tool in [
+ "rustc",
+ "rustfmt",
+ "cargo",
+ "cargo-clippy",
+ "clippy-driver",
+ "rustdoc",
+ ]
+]
+
+filegroup(
+ name = "rustc_lib",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "bin/*.so",
+ "lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/codegen-backends/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/bin/rust-lld",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
+
+rust_stdlib_filegroup(
+ name = "rust_std",
+ srcs = select({
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-gnu": glob([
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:aarch64-unknown-linux-musl": glob([
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/aarch64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-gnu": glob([
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-gnu/lib/*.a",
+ ]),
+ "@local-remote-execution//lre-rs/triple:x86_64-unknown-linux-musl": glob([
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.rlib",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.so",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/*.a",
+ "lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained/**",
+ ]),
+ }),
+ visibility = ["//visibility:public"],
+)
diff --git a/local-remote-execution/modules/lre.nix b/local-remote-execution/modules/lre.nix
index 4d3f08582..3e9936ac4 100644
--- a/local-remote-execution/modules/lre.nix
+++ b/local-remote-execution/modules/lre.nix
@@ -4,6 +4,30 @@
pkgs,
...
}: let
+ nixExecToRustExec = p: let
+ inherit (p.stdenv.buildPlatform) system;
+ in
+ {
+ "aarch64-darwin" = "aarch64-apple-darwin";
+ "aarch64-linux" = "aarch64-unknown-linux-gnu";
+ "x86_64-darwin" = "x86_64-apple-darwin";
+ "x86_64-linux" = "x86_64-unknown-linux-gnu";
+ }
+ .${system}
+ or (throw "Unsupported Nix exec platform: ${system}");
+
+ nixExecToDefaultRustTarget = p: let
+ inherit (p.stdenv.targetPlatform) system;
+ in
+ {
+ "aarch64-darwin" = "aarch64-apple-darwin";
+ "aarch64-linux" = "aarch64-unknown-linux-musl";
+ "x86_64-darwin" = "x86_64-apple-darwin";
+ "x86_64-linux" = "x86_64-unknown-linux-musl";
+ }
+ .${system}
+ or (throw "Unsupported Nix target platform: ${system}");
+
# These flags cause a Bazel build to use LRE toolchains regardless of whether
# the build is running in local or remote configuration.
#
@@ -21,27 +45,61 @@
# '';
# };
# ```
- defaultConfig = [
- # TODO(aaronmondal): Remove after resolution of:
- # https://github.com/bazelbuild/bazel/issues/19714#issuecomment-1745604978
- "--action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1"
-
- # TODO(aaronmondal): Remove after resolution of:
- # https://github.com/bazelbuild/bazel/issues/7254
- "--define=EXECUTOR=remote"
-
- # Set up the default toolchains.
- # TODO(aaronmondal): Implement a mechanism that autogenerates these values
- # and generalizes to extensions of the lre-cc base
- # toolchain (such as CUDA extensions).
- "--extra_execution_platforms=@local-remote-execution//generated-cc/config:platform"
- "--extra_toolchains=@local-remote-execution//generated-cc/config:cc-toolchain"
- ];
+ defaultConfig =
+ [
+ # Global configuration.
+
+ # TODO(aaronmondal): Remove after resolution of:
+ # https://github.com/bazelbuild/bazel/issues/7254
+ "--define=EXECUTOR=remote"
+ ]
+ # C++.
+ # TODO(aaronmondal): At the moment lre-cc only supports x86_64-linux.
+ # Extend this to more nix systems.
+ # See: https://github.com/bazelbuild/bazel/issues/19714#issuecomment-1745604978
+ ++ lib.optionals pkgs.stdenv.isLinux [
+ "--action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1"
+
+ # TODO(aaronmondal): Reimplement rbe-configs-gen for C++ so that we can
+ # support more execution and target platforms here.
+
+ # Explicitly duplicate the host as an execution platform. This way local
+ # execution is treated the same as remote execution.
+ "--extra_execution_platforms=@local-remote-execution//generated-cc/config:platform"
+ # The C++ toolchain running on the execution platform.
+ "--extra_toolchains=@local-remote-execution//generated-cc/config:cc-toolchain"
+
+ # TODO(aaronmondal): Support different target platforms in lre-cc and add
+ # `--platforms` settings here.
+ ]
+ # Rust.
+ ++ [
+ # Explicitly duplicate the host as an execution platform. This way local
+ # execution is treated the same as remote execution.
+ #
+ # When using remote executors that differ from the host this needs to be
+ # manually extended via the `--extra_execution_platforms` flag.
+ "--extra_execution_platforms=@local-remote-execution//lre-rs/platforms:${nixExecToRustExec pkgs}"
+
+ # The rust toolchains executing on the execution platform. We default to the
+ # platforms corresponding to the host. When using remote executors that
+ # differ from the platform corresponding to the host this should be extended
+ # via manual `--extra_toolchains` arguments.
+ "--extra_toolchains=@local-remote-execution//lre-rs:rust-${pkgs.system}"
+ "--extra_toolchains=@local-remote-execution//lre-rs:rustfmt-${pkgs.system}"
+
+ # Defaults for rust target platforms. This is a convenience setting that
+ # may be overridden by manual `--platforms` arguments.
+ #
+ # TODO(aaronmondal): At the moment these platforms are "rust-specific".
+ # Generalize this to all languages.
+ "--platforms=@local-remote-execution//lre-rs/platforms:${nixExecToDefaultRustTarget pkgs}"
+ ];
maybeEnv =
if config.Env == []
then ["#" "# WARNING: No environment set. LRE will not work locally."]
- else ["#"] ++ (map (x: "# " + x) config.Env);
+ else ["#"] ++ (map (x: "# " + x) (lib.lists.unique config.Env));
# If the `local-remote-execution.settings.prefix` is set to a nonempty string,
# prefix the Bazel build commands with that string. This will disable LRE
diff --git a/local-remote-execution/nix-system/BUILD.bazel b/local-remote-execution/nix-system/BUILD.bazel
new file mode 100644
index 000000000..6eb97fd48
--- /dev/null
+++ b/local-remote-execution/nix-system/BUILD.bazel
@@ -0,0 +1,53 @@
+# Copyright 2024 The NativeLink 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.
+
+# These constraints correspond to nix systems.
+load("@bazel_skylib//lib:selects.bzl", "selects")
+
+constraint_setting(name = "nix-system")
+
+constraint_value(
+ name = "aarch64-darwin",
+ constraint_setting = ":nix-system",
+ visibility = ["//visibility:public"],
+)
+
+constraint_value(
+ name = "aarch64-linux",
+ constraint_setting = ":nix-system",
+ visibility = ["//visibility:public"],
+)
+
+constraint_value(
+ name = "x86_64-darwin",
+ constraint_setting = ":nix-system",
+ visibility = ["//visibility:public"],
+)
+
+constraint_value(
+ name = "x86_64-linux",
+ constraint_setting = ":nix-system",
+ visibility = ["//visibility:public"],
+)
+
+selects.config_setting_group(
+ name = "any",
+ match_any = [
+ ":aarch64-darwin",
+ ":aarch64-linux",
+ ":x86_64-darwin",
+ ":x86_64-linux",
+ ],
+ visibility = ["//visibility:public"],
+)
diff --git a/local-remote-execution/overlays/default.nix b/local-remote-execution/overlays/default.nix
index 875fb2f73..fecc65cae 100644
--- a/local-remote-execution/overlays/default.nix
+++ b/local-remote-execution/overlays/default.nix
@@ -7,16 +7,40 @@
inherit (final.lre) stdenv;
};
- lre = {
- stdenv = final.callPackage ./stdenv.nix {
- llvmPackages = final.llvmPackages_19;
- targetPackages = final;
- };
+ lre =
+ {
+ stdenv = final.callPackage ./stdenv.nix {
+ llvmPackages = final.llvmPackages_19;
+ targetPackages = final;
+ };
- clang = final.callPackage ./clang.nix {
- inherit (final.lre) stdenv;
- };
+ clang = final.callPackage ./clang.nix {
+ inherit (final.lre) stdenv;
+ };
- lre-cc = final.callPackage ./lre-cc.nix {};
- };
+ lre-cc = final.callPackage ./lre-cc.nix {};
+ }
+ // (let
+ rustConfig = import ./rust-config.nix;
+
+ stableRustFor = p: (rustConfig.mkRust {
+ execPkgs = p;
+ channel = "stable";
+ });
+
+ nightlyRustFor = p: (rustConfig.mkRust {
+ execPkgs = p;
+ channel = "nightly";
+ extensions = ["llvm-tools"];
+ });
+
+ stable-rust = stableRustFor final;
+ nightly-rust = nightlyRustFor final;
+ in {
+ inherit stable-rust nightly-rust stableRustFor nightlyRustFor;
+
+ lre-rs = final.callPackage ./lre-rs.nix {
+ inherit (rustConfig) nixSystemToRustTargets;
+ };
+ });
}
diff --git a/local-remote-execution/overlays/lre-rs.nix b/local-remote-execution/overlays/lre-rs.nix
new file mode 100644
index 000000000..f2a37d728
--- /dev/null
+++ b/local-remote-execution/overlays/lre-rs.nix
@@ -0,0 +1,248 @@
+{
+ lib,
+ nixSystemToRustTargets,
+ writeShellScriptBin,
+ nix2container,
+ lre,
+ rust-toolchains ? [lre.stable-rust lre.nightly-rust],
+}: let
+ copyright = ''
+ # Copyright 2024 The NativeLink 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.
+
+ # This file is @generated by lre-rs.
+ '';
+
+ systems = [
+ "aarch64-darwin"
+ "aarch64-linux"
+ "x86_64-darwin"
+ "x86_64-linux"
+ ];
+ channels = [
+ "stable"
+ "nightly"
+ ];
+
+ makeRepoDefinition = system: channel: ''
+ ${" "} new_local_repository(
+ ${" "} name = "lre-rs-${channel}-${system}",
+ ${" "} build_file = "@local-remote-execution//lre-rs:${system}.BUILD.bazel",
+ ${" "} path = "$(nix eval .#packages.${system}.${channel}-rust.outPath --raw)",
+ ${" "} )
+ '';
+
+ allRepoDefinitions = lib.concatStrings (lib.flatten (
+ map (system: map (channel: makeRepoDefinition system channel) channels) systems
+ ));
+
+ buildFile = system: let
+ rustTargets = nixSystemToRustTargets.${system};
+
+ # Generate select entry for a target
+ mkSelectEntry = target: ''
+ ${" "} "@local-remote-execution//lre-rs/triple:${target}": glob([
+ ${" "} "bin/*.so",
+ ${" "} "lib/*.so",
+ ${" "} "lib/rustlib/${target}/codegen-backends/*.so",
+ ${" "} "lib/rustlib/${target}/bin/rust-lld",
+ ${" "} "lib/rustlib/${target}/lib/*.so",
+ ${" "} ]),'';
+
+ # Generate stdlib select entry for a target
+ mkStdlibSelectEntry = target:
+ ''
+ ${" "} "@local-remote-execution//lre-rs/triple:${target}": glob([
+ ${" "} "lib/rustlib/${target}/lib/*.rlib",
+ ${" "} "lib/rustlib/${target}/lib/*.so",
+ ${" "} "lib/rustlib/${target}/lib/*.a",''
+ + (lib.optionalString (builtins.match ".*-musl" target != null)
+ ''${"\n "} "lib/rustlib/${target}/lib/self-contained/**",'')
+ + ''${"\n "} ]),'';
+
+ selectEntries = builtins.concatStringsSep "\n" (map mkSelectEntry rustTargets);
+ stdlibSelectEntries = builtins.concatStringsSep "\n" (map mkStdlibSelectEntry rustTargets);
+ in ''
+ ${copyright}
+ """Tool repository for lre-rs executing on ${system}."""
+
+ load("@rules_rust//rust:toolchain.bzl", "rust_stdlib_filegroup")
+
+ [
+ filegroup(
+ name = tool,
+ srcs = [
+ "bin/{}".format(tool),
+ ],
+ visibility = ["//visibility:public"],
+ )
+ for tool in [
+ "rustc",
+ "rustfmt",
+ "cargo",
+ "cargo-clippy",
+ "clippy-driver",
+ "rustdoc",
+ ]
+ ]
+
+ filegroup(
+ name = "rustc_lib",
+ srcs = select({
+ ${selectEntries}
+ }),
+ visibility = ["//visibility:public"],
+ )
+
+ rust_stdlib_filegroup(
+ name = "rust_std",
+ srcs = select({
+ ${stdlibSelectEntries}
+ }),
+ visibility = ["//visibility:public"],
+ )'';
+
+ lre-rs-configs-gen = writeShellScriptBin "lre-rs" ''
+ set -euo pipefail
+
+ SRC_ROOT=$(git rev-parse --show-toplevel)/local-remote-execution
+
+ cd "''${SRC_ROOT}"
+
+ cat > ''${SRC_ROOT}/lre-rs/extension.bzl << EOF
+ ${copyright}
+ """Module extension to register different lre-rs tool repositories."""
+
+ load("@bazel_tools//tools/build_defs/repo:local.bzl", "new_local_repository")
+
+ # TODO(aaronmondal): Using module extensions here isn't optimal as it doesn't
+ # allow overriding tools via environment variables.
+ # Unfortunately rules_rust's rust_toolchain currently
+ # requires tools to be declared via labels to filegroups,
+ # so we need the new_local_repository approach here.
+ # Add support for raw strings to rules_rust upstream so
+ # that we can remove this module extension entirely.
+
+ def _lre_rs_impl(_mctx):
+ ${allRepoDefinitions}
+ lre_rs = module_extension(implementation = _lre_rs_impl)
+ EOF
+
+ cat > ''${SRC_ROOT}/lre-rs/platforms/BUILD.bazel << EOF
+ ${copyright}
+ # Some toolchains, like the darwin ones, don't have an actual container image.
+ # We still map them to the output of the tag of the corresponding theoretical
+ # worker image so that bare metal metal workers can advertise exact
+ # exec_properties to schedulers.
+
+ platform(
+ name = "aarch64-apple-darwin",
+ exec_properties = {
+ # nix eval .#packages.aarch64-darwin.nativelink-worker-lre-rs.imageTag
+ "lre-rs": $(nix eval .#packages.aarch64-darwin.nativelink-worker-lre-rs.imageTag),
+ },
+ parents = ["@local-remote-execution//platforms:aarch64-darwin"],
+ )
+
+ platform(
+ name = "aarch64-unknown-linux-gnu",
+ constraint_values = ["@local-remote-execution//libc:glibc"],
+ exec_properties = {
+ # nix eval .#packages.aarch64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": $(nix eval .#packages.aarch64-linux.nativelink-worker-lre-rs.imageTag),
+ },
+ parents = ["@local-remote-execution//platforms:aarch64-linux"],
+ )
+
+ platform(
+ name = "aarch64-unknown-linux-musl",
+ constraint_values = ["@local-remote-execution//libc:musl"],
+ exec_properties = {
+ # nix eval .#packages.aarch64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": $(nix eval .#packages.aarch64-linux.nativelink-worker-lre-rs.imageTag),
+ },
+ parents = ["@local-remote-execution//platforms:aarch64-linux"],
+ )
+
+ platform(
+ name = "x86_64-apple-darwin",
+ exec_properties = {
+ # nix eval .#packages.x86_64-darwin.nativelink-worker-lre-rs.imageTag
+ "lre-rs": $(nix eval .#packages.x86_64-darwin.nativelink-worker-lre-rs.imageTag),
+ },
+ parents = ["@local-remote-execution//platforms:x86_64-darwin"],
+ )
+
+ platform(
+ name = "x86_64-unknown-linux-gnu",
+ constraint_values = ["@local-remote-execution//libc:glibc"],
+ exec_properties = {
+ # nix eval .#packages.x86_64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": $(nix eval .#packages.x86_64-linux.nativelink-worker-lre-rs.imageTag),
+ },
+ parents = ["@local-remote-execution//platforms:x86_64-linux"],
+ )
+
+ platform(
+ name = "x86_64-unknown-linux-musl",
+ constraint_values = ["@local-remote-execution//libc:musl"],
+ exec_properties = {
+ # nix eval .#packages.x86_64-linux.nativelink-worker-lre-rs.imageTag
+ "lre-rs": $(nix eval .#packages.x86_64-linux.nativelink-worker-lre-rs.imageTag),
+ },
+ parents = ["@local-remote-execution//platforms:x86_64-linux"],
+ )
+ EOF
+
+ cat > ''${SRC_ROOT}/lre-rs/aarch64-darwin.BUILD.bazel << EOF
+ ${buildFile "aarch64-darwin"}
+ EOF
+
+ cat > ''${SRC_ROOT}/lre-rs/aarch64-linux.BUILD.bazel << EOF
+ ${buildFile "aarch64-linux"}
+ EOF
+
+ cat > ''${SRC_ROOT}/lre-rs/x86_64-darwin.BUILD.bazel << EOF
+ ${buildFile "x86_64-darwin"}
+ EOF
+
+ cat > ''${SRC_ROOT}/lre-rs/x86_64-linux.BUILD.bazel << EOF
+ ${buildFile "x86_64-linux"}
+ EOF'';
+
+ Env =
+ # Rust requires a functional C++ toolchain.
+ lre.lre-cc.image.meta.Env
+ ++ [
+ # This causes the rust toolchains to be available under `/nix/store/*`
+ # paths but not under "generic" paths like `/bin` or `/usr/bin`.
+ # This way we're guaranteed to use binary identical toolchains during
+ # local and remote execution.
+ "RUST=${lib.concatStringsSep ":" rust-toolchains}"
+ ];
+
+ image = nix2container.buildImage {
+ name = "lre-rs";
+ maxLayers = 100;
+ config = {inherit Env;};
+ # Passthrough so that other images can reuse the environment.
+ meta = {inherit Env;};
+
+ # Don't set a tag here so that the image is tagged by its derivation hash.
+ # tag = null;
+ };
+in {
+ inherit lre-rs-configs-gen image;
+ meta = {inherit Env;};
+}
diff --git a/local-remote-execution/overlays/rust-config.nix b/local-remote-execution/overlays/rust-config.nix
new file mode 100644
index 000000000..6cb9e69e8
--- /dev/null
+++ b/local-remote-execution/overlays/rust-config.nix
@@ -0,0 +1,76 @@
+let
+ defaultStableVersion = "1.82.0";
+ defaultNightlyVersion = "2024-11-23";
+in rec {
+ # This map translates execution platforms to sensible targets that can
+ # be built on such a platform. For instance, an x86_64-linux execution
+ # platform can target aarch64-linux and musl targets, but not darwin.
+ #
+ # On the Bazel side each key maps to a dedicated toolchain capture the
+ # cross-compile capabilities on the different exec platforms.
+ nixSystemToRustTargets = {
+ "aarch64-darwin" = [
+ "aarch64-apple-darwin"
+ "aarch64-unknown-linux-gnu"
+ "aarch64-unknown-linux-musl"
+ "x86_64-apple-darwin"
+ "x86_64-unknown-linux-gnu"
+ "x86_64-unknown-linux-musl"
+ ];
+ "aarch64-linux" = [
+ "aarch64-unknown-linux-gnu"
+ "aarch64-unknown-linux-musl"
+ "x86_64-unknown-linux-gnu"
+ "x86_64-unknown-linux-musl"
+ ];
+ "x86_64-darwin" = [
+ "aarch64-apple-darwin"
+ "aarch64-unknown-linux-gnu"
+ "aarch64-unknown-linux-musl"
+ "x86_64-apple-darwin"
+ "x86_64-unknown-linux-gnu"
+ "x86_64-unknown-linux-musl"
+ ];
+ "x86_64-linux" = [
+ "aarch64-unknown-linux-gnu"
+ "aarch64-unknown-linux-musl"
+ "x86_64-unknown-linux-gnu"
+ "x86_64-unknown-linux-musl"
+ ];
+ };
+
+ # Changing execPkgs here allows creating custom cross-compilation toolchains:
+ #
+ # custom-rust = rustConfig.mkRust {
+ # execPkgs = pkgs;
+ # channel = "stable";
+ # version = "1.83.0"; # You can override the version as well, but you'll
+ # # need to run lre-rs afterwards to regenerate the
+ # # Bazel-side rust toolchains.
+ # }
+ #
+ mkRust = {
+ execPkgs,
+ channel,
+ extensions ? [],
+ }: let
+ version =
+ if channel == "stable"
+ then defaultStableVersion
+ else defaultNightlyVersion;
+ inherit (execPkgs.stdenv.buildPlatform) system;
+ targets =
+ nixSystemToRustTargets.${system}
+ or (throw "Unsupported Nix exec platform: ${system}");
+ in
+ execPkgs.rust-bin.${channel}.${version}.default.override {
+ inherit extensions targets;
+ }
+ // {
+ # The version identifier generated by rust-bin can't be used by
+ # `pkgs.rust-bin.${channel}.version`. This passthrough allows using the
+ # version in classic rust imports like so:
+ # `pkgs.rust-bin.${pkgs.lre.stable-rust.meta.version;}`
+ meta = {inherit version;};
+ };
+}
diff --git a/local-remote-execution/platforms/BUILD.bazel b/local-remote-execution/platforms/BUILD.bazel
new file mode 100644
index 000000000..6d1487264
--- /dev/null
+++ b/local-remote-execution/platforms/BUILD.bazel
@@ -0,0 +1,91 @@
+# Copyright 2024 The NativeLink 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.
+
+# These platforms correspond to nix systems.
+
+# The exec_properties correspond to kubernetes properties that help RBE systems
+# to determine on which nodes in a cluster the platform could realistically be
+# deployed to. For instance, you'll likely always need to match the CPU and
+# you'll always want to run mac platforms on mac nodes. However, you can deploy
+# linux containers onto mac systems as long as the cpu architecture matches, so
+# we don't constrain "kubernetes.io/os" for the linux platforms.
+
+# If these defaults don't work for you you can unset exec_properties by
+# overriding them with empty strings in child platforms.
+# See: https://bazel.build/versions/7.4.0/reference/be/platforms-and-toolchains
+
+# The sensible values for "kubernetes.io/arch" and "kubernetes.io/os" correspond
+# to those of GOOS and GOARCH.
+# See: https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63.
+
+# TODO(aaronmondal): Reevaluate this implementation once Bazel 8 is released
+# which adds support for platform-specific flags.
+
+platform(
+ name = "aarch64-darwin",
+ constraint_values = [
+ "@bazel_tools//tools/cpp:clang",
+ "@local-remote-execution//nix-system:aarch64-darwin",
+ "@platforms//cpu:aarch64",
+ "@platforms//os:macos",
+ ],
+ exec_properties = {
+ "kubernetes.io/arch": "arm64",
+ "kubernetes.io/os": "darwin",
+ },
+ visibility = ["//visibility:public"],
+)
+
+platform(
+ name = "aarch64-linux",
+ constraint_values = [
+ "@bazel_tools//tools/cpp:clang",
+ "@local-remote-execution//nix-system:aarch64-linux",
+ "@platforms//cpu:aarch64",
+ "@platforms//os:linux",
+ ],
+ exec_properties = {
+ "kubernetes.io/arch": "arm64",
+ },
+ visibility = ["//visibility:public"],
+)
+
+platform(
+ name = "x86_64-darwin",
+ constraint_values = [
+ "@bazel_tools//tools/cpp:clang",
+ "@local-remote-execution//nix-system:x86_64-darwin",
+ "@platforms//cpu:x86_64",
+ "@platforms//os:macos",
+ ],
+ exec_properties = {
+ "kubernetes.io/arch": "amd64",
+ "kubernetes.io/os": "darwin",
+ },
+ visibility = ["//visibility:public"],
+)
+
+platform(
+ name = "x86_64-linux",
+ constraint_values = [
+ "@bazel_tools//tools/cpp:clang",
+ "@local-remote-execution//nix-system:x86_64-linux",
+ "@platforms//cpu:x86_64",
+ "@platforms//os:linux",
+ ],
+ exec_properties = {
+ "kubernetes.io/arch": "amd64",
+ },
+ visibility = ["//visibility:public"],
+)
diff --git a/nativelink-config/BUILD.bazel b/nativelink-config/BUILD.bazel
index 3d36b2998..19b590b5e 100644
--- a/nativelink-config/BUILD.bazel
+++ b/nativelink-config/BUILD.bazel
@@ -57,6 +57,10 @@ rust_doc(
"--output-format=json",
"-Zunstable-options",
],
+ target_compatible_with = select({
+ "@local-remote-execution//lre-rs:nightly": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
)
rust_doc_test(
diff --git a/tools/rules_rust-musl-platforms.diff b/tools/rules_rust-musl-platforms.diff
new file mode 100644
index 000000000..e7429170c
--- /dev/null
+++ b/tools/rules_rust-musl-platforms.diff
@@ -0,0 +1,13 @@
+diff --git a/rust/platform/triple_mappings.bzl b/rust/platform/triple_mappings.bzl
+index b6191056..1261b529 100644
+--- a/rust/platform/triple_mappings.bzl
++++ b/rust/platform/triple_mappings.bzl
+@@ -66,6 +66,8 @@ SUPPORTED_T2_PLATFORM_TRIPLES = {
+ "x86_64-unknown-freebsd": _support(std = True, host_tools = True),
+ "x86_64-unknown-fuchsia": _support(std = True, host_tools = False),
+ "x86_64-unknown-none": _support(std = True, host_tools = False),
++ "x86_64-unknown-linux-musl": _support(std = True, host_tools = False),
++ "aarch64-unknown-linux-musl": _support(std = True, host_tools = False),
+ }
+
+ _T3_PLATFORM_TRIPLES = {
diff --git a/web/platform/package.json b/web/platform/package.json
index 2e348368e..fdaec4cee 100644
--- a/web/platform/package.json
+++ b/web/platform/package.json
@@ -10,7 +10,7 @@
"build": "bun fix && astro build",
"docs": "bun run build.docs && bun run generate.docs",
"generate.docs": "bun run utils/md_to_mdx_aot.ts",
- "build.docs": "cd ../.. && unset TMPDIR TMP; bazel build nativelink-config:docs_json && cd web/platform && bun run utils/metaphase_aot.ts",
+ "build.docs": "cd ../.. && unset TMPDIR TMP; bazel build --@local-remote-execution//lre-rs:channel=nightly nativelink-config:docs_json && cd web/platform && bun run utils/metaphase_aot.ts",
"check": "biome ci . && astro check",
"check.format": "biome format .",
"check.lint": "biome check .",
diff --git a/web/platform/src/content/docs/docs/contribute/bazel.mdx b/web/platform/src/content/docs/docs/contribute/bazel.mdx
index 6b7782536..109da2362 100644
--- a/web/platform/src/content/docs/docs/contribute/bazel.mdx
+++ b/web/platform/src/content/docs/docs/contribute/bazel.mdx
@@ -10,7 +10,10 @@ If you're using the Nix flake you're all set.
If you're running outside of nix, install [bazelisk](https://github.com/bazelbuild/bazelisk/tree/master)
manually and make sure you have a recent functional C++ toolchain with LLD as
-linker.
+linker. On Unix you'll also have to add
+`--extra_toolchains=@rust_toolchains//:all` to all of your Bazel invocations to
+allow the use of non-hermetic Rust toolchains. Windows is non-hermetic by
+default.
## Build
@@ -26,6 +29,12 @@ import { Tabs, TabItem } from '@astrojs/starlight/components';
$(pwd)/nativelink-config/examples/basic_cas.json
```
+
+ ```sh
+ bazel run --extra_toolchains=@rust_toolchains//:all nativelink -- \
+ $(pwd)/nativelink-config/examples/basic_cas.json
+ ```
+
```sh
bazel run --config=windows nativelink -- \
@@ -43,6 +52,12 @@ For optimized builds:
$(pwd)/nativelink-config/examples/basic_cas.json
```
+
+ ```sh
+ bazel run -c opt --extra_toolchains=@rust_toolchains//:all nativelink -- \
+ $(pwd)/nativelink-config/examples/basic_cas.json
+ ```
+
```sh
bazel run --config=windows -c opt nativelink -- \
@@ -75,6 +90,11 @@ To run tests with Bazel:
bazel test //... --verbose_failures
```
+
+ ```sh
+ bazel test --extra_toolchains=@rust_toolchains//:all //... --verbose_failures
+ ```
+
```sh
bazel test --config=windows //... --verbose_failures
diff --git a/web/platform/src/content/docs/docs/deployment-examples/kubernetes.mdx b/web/platform/src/content/docs/docs/deployment-examples/kubernetes.mdx
index a2e927b58..32d811a91 100644
--- a/web/platform/src/content/docs/docs/deployment-examples/kubernetes.mdx
+++ b/web/platform/src/content/docs/docs/deployment-examples/kubernetes.mdx
@@ -114,7 +114,7 @@ echo "NativeLink IP: $NATIVELINK"
bazel build \
--remote_cache=grpc://$NATIVELINK \
--remote_executor=grpc://$NATIVELINK \
- //local-remote-execution/examples:hello_lre
+ //local-remote-execution/examples:lre-cc
```
:::caution
@@ -152,7 +152,7 @@ cache and run the build again:
bazel clean && bazel build \
--remote_cache=grpc://$CACHE \
--remote_executor=grpc://$SCHEDULER \
- //local-remote-execution/examples:hello_lre
+ //local-remote-execution/examples:lre-cc
```
The build now shows cache hits instead of remote actions:
@@ -176,7 +176,7 @@ you'll use remote caching without remote execution:
```bash
bazel clean && bazel build \
--remote_cache=grpc://$CACHE \
- //local-remote-execution/examples:hello_lre
+ //local-remote-execution/examples:lre-cc
```
You'll get remote cache hits as if your local machine was a `nativelink-worker`: