ebeddfb308
In order to make testing and deployment simpler and more reproducible, we want to provide a Nix derivation for our macOS .app build. We already build the Rust and dashboard with Nix, but so far the Python has been blocked because we haven't had an MLX build. This change adds a Metal compiler derivation that uses `requireFile` to be provided a NAR of the unfree macOS Metal compiler. It is documented how to get this file, but effectively you have to trigger the download, mount the DMG, and NAR the result. Once this is added to the store by hash we can build MLX using it. The MLX build itself is quite self explanatory. Test plan: - CI. We follow the instructions to grab the Metal compiler. Once this is in Cachix we should really never do this again, and I can pin the path too to ensure it doesn't leave. - MLX tests run as part of the MLX derivation's build. They pass. - `NIXPKGS_ALLOW_UNFREE=1 nix build .#mlx.passthru.tests.mlxTest --impure --option sandbox false` --------- Co-authored-by: Ryuichi Leo Takashige <leo@exolabs.net>
57 lines
1.6 KiB
Nix
57 lines
1.6 KiB
Nix
{ lib, stdenvNoCC, requireFile, nix }:
|
|
|
|
let
|
|
narFile = requireFile {
|
|
name = "metal-toolchain-17C48.nar";
|
|
message = ''
|
|
The Metal Toolchain NAR must be available.
|
|
|
|
If you have cachix configured for exo.cachix.org, this should be automatic.
|
|
|
|
Otherwise:
|
|
1. Install Xcode 26+ from the App Store
|
|
2. Run: xcodebuild -downloadComponent MetalToolchain
|
|
3. Export the toolchain:
|
|
hdiutil attach "$(find /System/Library/AssetsV2/com_apple_MobileAsset_MetalToolchain -name '*.dmg' | head -1)" -mountpoint /tmp/metal-dmg
|
|
cp -R /tmp/metal-dmg/Metal.xctoolchain /tmp/metal-export
|
|
hdiutil detach /tmp/metal-dmg
|
|
4. Create NAR and add to store:
|
|
nix nar pack /tmp/metal-export > /tmp/metal-toolchain-17C48.nar
|
|
nix store add --mode flat /tmp/metal-toolchain-17C48.nar
|
|
'';
|
|
hash = "sha256-ayR5mXN4sZAddwKEG2OszGRF93k9ZFc7H0yi2xbylQw=";
|
|
};
|
|
in
|
|
stdenvNoCC.mkDerivation {
|
|
pname = "metal-toolchain";
|
|
version = "17C48";
|
|
|
|
dontUnpack = true;
|
|
dontBuild = true;
|
|
dontFixup = true;
|
|
|
|
nativeBuildInputs = [ nix ];
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
nix-store --restore $out < ${narFile}
|
|
|
|
# Create bin directory with symlinks for PATH
|
|
mkdir -p $out/bin
|
|
ln -s $out/usr/bin/metal $out/bin/metal
|
|
ln -s $out/usr/bin/metallib $out/bin/metallib
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
# Metal language version for CMake (from: echo __METAL_VERSION__ | metal -E -x metal -P -)
|
|
passthru.metalVersion = "400";
|
|
|
|
meta = {
|
|
description = "Apple Metal compiler toolchain";
|
|
platforms = [ "aarch64-darwin" ];
|
|
license = lib.licenses.unfree;
|
|
};
|
|
}
|