nixpkgs/pkgs/development/compilers/rust/default.nix

85 lines
3.2 KiB
Nix
Raw Normal View History

{ rustcVersion
, rustcSha256
, bootstrapVersion
, bootstrapHashes
, selectRustPackage
}:
{ stdenv, lib
2018-11-21 02:47:45 +01:00
, buildPackages
, newScope, callPackage
, CoreFoundation, Security
2019-04-23 15:25:12 +02:00
, llvmPackages_5
, pkgsBuildTarget, pkgsBuildBuild
2018-11-21 02:47:45 +01:00
}: rec {
makeRustPlatform = { rustc, cargo, ... }: {
rust = {
inherit rustc cargo;
};
2018-11-21 02:47:45 +01:00
buildRustPackage = callPackage ../../../build-support/rust {
inherit rustc cargo;
2018-11-21 02:47:45 +01:00
fetchcargo = buildPackages.callPackage ../../../build-support/rust/fetchcargo.nix {
inherit cargo;
};
};
2018-07-09 12:35:01 +02:00
2018-11-21 02:47:45 +01:00
rustcSrc = callPackage ./rust-src.nix {
inherit rustc;
};
};
2018-11-21 02:47:45 +01:00
# 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 {
version = bootstrapVersion;
hashes = bootstrapHashes;
};
2018-11-21 02:47:45 +01:00
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)
(selectRustPackage buildPackages).packages.prebuilt);
2018-11-21 02:47:45 +01:00
bootRustPlatform = makeRustPlatform bootstrapRustPackages;
in {
# Packages suitable for build-time, e.g. `build.rs`-type stuff.
buildRustPackages = (selectRustPackage buildPackages).packages.stable;
2018-11-21 02:47:45 +01:00
# Analogous to stdenv
rustPlatform = makeRustPlatform self.buildRustPackages;
2019-04-23 15:25:12 +02:00
rustc = self.callPackage ./rustc.nix ({
version = rustcVersion;
sha256 = rustcSha256;
2018-11-21 02:47:45 +01:00
# Use boot package set to break cycle
rustPlatform = bootRustPlatform;
2019-04-23 15:25:12 +02:00
} // lib.optionalAttrs (stdenv.cc.isClang && stdenv.hostPlatform == stdenv.buildPlatform) {
stdenv = llvmPackages_5.stdenv;
pkgsBuildBuild = pkgsBuildBuild // { targetPackages.stdenv = llvmPackages_5.stdenv; };
pkgsBuildHost = pkgsBuildBuild // { targetPackages.stdenv = llvmPackages_5.stdenv; };
pkgsBuildTarget = pkgsBuildTarget // { targetPackages.stdenv = llvmPackages_5.stdenv; };
});
rustfmt = self.callPackage ./rustfmt.nix { inherit Security; };
2019-03-12 02:19:48 +01:00
cargo = self.callPackage ./cargo.nix {
2018-11-21 02:47:45 +01:00
# Use boot package set to break cycle
rustPlatform = bootRustPlatform;
inherit CoreFoundation Security;
2019-03-12 02:19:48 +01:00
};
clippy = self.callPackage ./clippy.nix { inherit Security; };
2019-08-16 19:03:38 +02:00
rls = self.callPackage ./rls { inherit CoreFoundation Security; };
2018-11-21 02:47:45 +01:00
});
};
}