diff options
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/rust/default.nix')
-rw-r--r-- | nixpkgs/pkgs/development/compilers/rust/default.nix | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/rust/default.nix b/nixpkgs/pkgs/development/compilers/rust/default.nix new file mode 100644 index 000000000000..47df7e716dc1 --- /dev/null +++ b/nixpkgs/pkgs/development/compilers/rust/default.nix @@ -0,0 +1,62 @@ +{ stdenv, lib, overrideCC +, buildPackages +, newScope, callPackage +, CoreFoundation, Security +}: rec { + makeRustPlatform = { rustc, cargo, ... }: { + rust = { + inherit rustc cargo; + }; + + buildRustPackage = callPackage ../../../build-support/rust { + inherit rustc cargo; + + fetchcargo = buildPackages.callPackage ../../../build-support/rust/fetchcargo.nix { + inherit cargo; + }; + }; + + rustcSrc = callPackage ./rust-src.nix { + inherit rustc; + }; + }; + + # This just contains tools for now. But it would conceivably contain + # libraries too, say if we picked some default/recommended versions from + # `cratesIO` to build by Hydra and/or try to prefer/bias in Cargo.lock for + # all vendored Carnix-generated nix. + # + # In the end game, rustc, the rust standard library (`core`, `std`, etc.), + # and cargo would themselves be built with `buildRustCreate` like + # everything else. Tools and `build.rs` and procedural macro dependencies + # would be taken from `buildRustPackages` (and `bootstrapRustPackages` for + # anything provided prebuilt or their build-time dependencies to break + # cycles / purify builds). In this way, nixpkgs would be in control of all + # bootstrapping. + packages = { + prebuilt = callPackage ./bootstrap.nix {}; + stable = lib.makeScope newScope (self: let + # Like `buildRustPackages`, but may also contain prebuilt binaries to + # break cycle. Just like `bootstrapTools` for nixpkgs as a whole, + # nothing in the final package set should refer to this. + bootstrapRustPackages = self.buildRustPackages.overrideScope' (_: _: + lib.optionalAttrs (stdenv.buildPlatform == stdenv.hostPlatform) + buildPackages.rust.packages.prebuilt); + bootRustPlatform = makeRustPlatform bootstrapRustPackages; + in { + # Packages suitable for build-time, e.g. `build.rs`-type stuff. + buildRustPackages = buildPackages.rust.packages.stable; + # Analogous to stdenv + rustPlatform = makeRustPlatform self.buildRustPackages; + rustc = self.callPackage ./rustc.nix { + # Use boot package set to break cycle + rustPlatform = bootRustPlatform; + }; + cargo = self.callPackage ./cargo.nix { + # Use boot package set to break cycle + rustPlatform = bootRustPlatform; + inherit CoreFoundation Security; + }; + }); + }; +} |