2115a2037c
This has several advantages: 1. It takes up less space on disk in-between builds in the nix store. 2. It uses less space in the binary cache for vendor derivation packages. 3. It uses less network traffic downloading from the binary cache. 4. It plays nicely with hashed mirrors like tarballs.nixos.org, which only substitute --flat hashes on single files (not recursive directory hashes). 5. It's consistent with how simple `fetchurl` src derivations work. 6. It provides a stronger abstraction between input src-package and output package, e.g., it's harder to accidentally depend on the src derivation at runtime by referencing something like `${src}/etc/index.html`. Likewise, in the store it's harder to get confused with something that is just there as a build-time dependency vs. a runtime dependency, since the build-time src dependencies are tarred up. Disadvantages are: 1. It takes slightly longer to untar at the start of a build. As currently implemented, this attaches the compacted vendor.tar.gz feature as a rider on `verifyCargoDeps`, since both of them are relatively newly implemented behavior that change the `cargoSha256`. If this PR is accepted, I will push forward the remaining rust packages with a series of treewide PRs to update the `cargoSha256`s.
100 lines
3.9 KiB
Nix
100 lines
3.9 KiB
Nix
{ rustcVersion
|
|
, rustcSha256
|
|
, enableRustcDev ? true
|
|
, bootstrapVersion
|
|
, bootstrapHashes
|
|
, selectRustPackage
|
|
}:
|
|
{ stdenv, lib
|
|
, buildPackages
|
|
, newScope, callPackage
|
|
, CoreFoundation, Security
|
|
, llvmPackages_5
|
|
, pkgsBuildTarget, pkgsBuildBuild
|
|
}: rec {
|
|
toRustTarget = platform: with platform.parsed; let
|
|
cpu_ = {
|
|
"armv7a" = "armv7";
|
|
"armv7l" = "armv7";
|
|
"armv6l" = "arm";
|
|
}.${cpu.name} or cpu.name;
|
|
in "${cpu_}-${vendor.name}-${kernel.name}${lib.optionalString (abi.name != "unknown") "-${abi.name}"}";
|
|
|
|
makeRustPlatform = { rustc, cargo, ... }: rec {
|
|
rust = {
|
|
inherit rustc cargo;
|
|
};
|
|
|
|
fetchCargoTarball = buildPackages.callPackage ../../../build-support/rust/fetchCargoTarball.nix {
|
|
inherit cargo;
|
|
};
|
|
|
|
# N.B. This is a legacy fetcher implementation that is being phased out and deleted.
|
|
# See ../../../build-support/rust/README.md for details.
|
|
fetchcargo = buildPackages.callPackage ../../../build-support/rust/fetchcargo.nix {
|
|
inherit cargo;
|
|
};
|
|
|
|
buildRustPackage = callPackage ../../../build-support/rust {
|
|
inherit rustc cargo fetchcargo fetchCargoTarball;
|
|
};
|
|
|
|
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 {
|
|
version = bootstrapVersion;
|
|
hashes = bootstrapHashes;
|
|
};
|
|
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);
|
|
bootRustPlatform = makeRustPlatform bootstrapRustPackages;
|
|
in {
|
|
# Packages suitable for build-time, e.g. `build.rs`-type stuff.
|
|
buildRustPackages = (selectRustPackage buildPackages).packages.stable;
|
|
# Analogous to stdenv
|
|
rustPlatform = makeRustPlatform self.buildRustPackages;
|
|
rustc = self.callPackage ./rustc.nix ({
|
|
version = rustcVersion;
|
|
sha256 = rustcSha256;
|
|
inherit enableRustcDev;
|
|
|
|
# Use boot package set to break cycle
|
|
rustPlatform = bootRustPlatform;
|
|
} // 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; };
|
|
cargo = self.callPackage ./cargo.nix {
|
|
# Use boot package set to break cycle
|
|
rustPlatform = bootRustPlatform;
|
|
inherit CoreFoundation Security;
|
|
};
|
|
clippy = self.callPackage ./clippy.nix { inherit Security; };
|
|
rls = self.callPackage ./rls { inherit CoreFoundation Security; };
|
|
});
|
|
};
|
|
}
|