xref: /aosp_15_r20/external/bazelbuild-rules_rust/examples/nix_cross_compiling/nix/flake.nix (revision d4726bddaa87cc4778e7472feed243fa4b6c267f)
1{
2  inputs = {
3    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
4
5    fenix = {
6      url = "github:nix-community/fenix";
7      inputs.nixpkgs.follows = "nixpkgs";
8    };
9
10    android-nixpkgs = {
11      url = "github:tadfisher/android-nixpkgs";
12      inputs.nixpkgs.follows = "nixpkgs";
13    };
14  };
15
16  outputs = { self, nixpkgs, fenix, android-nixpkgs, ... }:
17    let
18      pkgs = import nixpkgs { system = "x86_64-linux"; };
19
20      llvm = pkgs.llvmPackages_16;
21
22      rust = with fenix.packages."x86_64-linux"; combine [
23        complete.cargo
24        complete.clippy
25        complete.rustc
26        complete.rustfmt
27        complete.rust-src
28        complete.rust-analyzer
29        targets."aarch64-apple-darwin".latest.rust-std
30        targets."aarch64-apple-ios".latest.rust-std
31        targets."aarch64-linux-android".latest.rust-std
32        targets."aarch64-unknown-linux-gnu".latest.rust-std
33        targets."wasm32-unknown-unknown".latest.rust-std
34        targets."wasm32-wasi".latest.rust-std
35        targets."x86_64-apple-darwin".latest.rust-std
36        targets."x86_64-pc-windows-msvc".latest.rust-std
37        targets."x86_64-unknown-linux-gnu".latest.rust-std
38      ];
39
40      fetchVendor = { name, url, sha256, stripComponents ? 0 }:
41        let
42          authorization =
43            if (pkgs.lib.hasPrefix "https://raw.githubusercontent.com/<repo>/" url) then
44              ''-H "Authorization: Bearer <token>"''
45            else
46              "";
47        in
48        pkgs.runCommandLocal "vendor-${name}"
49          {
50            buildInputs = [ pkgs.cacert ];
51            outputHashMode = "recursive";
52            outputHashAlgo = "sha256";
53            outputHash = sha256;
54          } ''
55          # Empty URL special cased for example
56          mkdir --parents $out
57          if [ -n "${url}" ]; then
58            ${pkgs.curl}/bin/curl -s -S -L ${authorization} "${url}" | ${pkgs.libarchive}/bin/bsdtar -C $out -xf - --strip-components ${toString stripComponents}
59          fi
60        '';
61
62      libclang_rt_wasm32 = fetchVendor {
63        name = "libclang_rt_wasm32";
64        url = "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/libclang_rt.builtins-wasm32-wasi-20.0.tar.gz";
65        sha256 = "AdRe1XrGeBuai1p5IMUTR7T7nhNlD1RZ8grZjVoHAKs=";
66      };
67
68      sdk_aarch64-unknown-linux-gnu = fetchVendor {
69        name = "sdk_aarch64-unknown-linux-gnu";
70        url = "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/80fc74e431f37f590d0c85f16a9d8709088929e8/debian_bullseye_arm64_sysroot.tar.xz";
71        sha256 = "VwHx6SjTmnGWvEoevjThR2oxNEe9NIdnSIJ9RBgKPE8=";
72      };
73
74      sdk_universal-apple-darwin = fetchVendor {
75        name = "sdk_universal-apple-darwin";
76        url = ""; # User needs to supply.
77        sha256 = "pQpattmS9VmO3ZIQUFn66az8GSmB4IvYhTTCFn6SUmo="; # User needs to supply.
78      };
79
80      sdk_universal-apple-ios = fetchVendor {
81        name = "sdk_universal-apple-ios";
82        url = ""; # User needs to supply.
83        sha256 = "pQpattmS9VmO3ZIQUFn66az8GSmB4IvYhTTCFn6SUmo="; # User needs to supply.
84      };
85
86      sdk_universal-linux-android = android-nixpkgs.sdk."x86_64-linux" (sdkPkgs: with sdkPkgs; [
87        cmdline-tools-latest
88        build-tools-33-0-2
89        platform-tools
90        platforms-android-33
91        ndk-25-2-9519653
92      ]);
93
94      sdk_wasm32-wasi = fetchVendor {
95        name = "sdk_wasm32-wasi";
96        url = "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sysroot-20.0.tar.gz";
97        sha256 = "aePDwDYWopPPDSO802BO3YWM4d/J4a4CmGP/hDPF8FY=";
98      };
99
100      sdk_x86_64-pc-windows-msvc = fetchVendor {
101        name = "sdk_x86_64-pc-windows-msvc";
102        url = ""; # User needs to supply.
103        sha256 = "pQpattmS9VmO3ZIQUFn66az8GSmB4IvYhTTCFn6SUmo="; # User needs to supply.
104      };
105
106      sdk_x86_64-unknown-linux-gnu = fetchVendor {
107        name = "sdk_x86_64-unknown-linux-gnu";
108        url = "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/f5f68713249b52b35db9e08f67184cac392369ab/debian_bullseye_amd64_sysroot.tar.xz";
109        sha256 = "+pqXDAsKY1BCBGFD3PDqMv1YiU+0/B2LXXryTFIUaWk=";
110      };
111
112      sdk_x86_64-unknown-nixos-gnu = pkgs.symlinkJoin {
113        name = "sdk_x86_64-unknown-nixos-gnu";
114        paths = [
115          llvm.libcxx.out
116          llvm.libcxx.dev
117          llvm.libcxxabi.out
118          llvm.libunwind.out
119          pkgs.gcc13.cc.libgcc.out
120          pkgs.gcc13.cc.libgcc.libgcc
121          pkgs.glibc.dev
122          pkgs.glibc.libgcc.out
123          pkgs.glibc.out
124        ];
125      };
126    in
127    {
128      packages."x86_64-linux".bazel = {
129        config = pkgs.writeTextFile {
130          name = "bazel-config";
131          destination = "/config.bzl";
132          text = ''
133            LLVM = "${llvm.bintools-unwrapped}"
134            CLANG = "${llvm.clang-unwrapped}"
135            CLANG_LIB = "${llvm.clang-unwrapped.lib}"
136            CLANG_LIB_VERSION = "16"
137
138            NIXOS_DYNAMIC_LINKER = "${pkgs.glibc.out}/lib64/ld-linux-x86-64.so.2"
139            LIBCLANG_RT_WASM32 = "${libclang_rt_wasm32}"
140            ANDROID_NDK_VERSION = "25.2.9519653"
141
142            SDK_AARCH64_UNKNOWN_LINUX_GNU = "${sdk_aarch64-unknown-linux-gnu}"
143            SDK_UNIVERSAL_APPLE_DARWIN = "${sdk_universal-apple-darwin}"
144            SDK_UNIVERSAL_APPLE_IOS = "${sdk_universal-apple-ios}"
145            SDK_UNIVERSAL_LINUX_ANDROID = "${sdk_universal-linux-android}"
146            SDK_WASM32_WASI = "${sdk_wasm32-wasi}"
147            SDK_X86_64_PC_WINDOWS_MSVC = "${sdk_x86_64-pc-windows-msvc}"
148            SDK_X86_64_UNKNOWN_LINUX_GNU = "${sdk_x86_64-unknown-linux-gnu}"
149            SDK_X86_64_UNKNOWN_NIXOS_GNU = "${sdk_x86_64-unknown-nixos-gnu}"
150          '';
151        };
152
153        rust = rust;
154      };
155    };
156}
157