nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix
Valentin Lorentz 92c77733ac mrustc: init at 0.9
mrustc is mostly patched to use shared LLVM sources but still uses
in-tree source for compiler-rt from LLVM 7. This needs to be patched to
compile under glibc 2.31 or later. It's easy enough to reapply all our
compiler-rt patches here.
2021-04-23 10:19:37 +00:00

154 lines
3.7 KiB
Nix

{ lib, stdenv
, fetchurl
, mrustc
, mrustc-minicargo
, rust
, llvm_7
, llvmPackages_7
, libffi
, cmake
, python3
, zlib
, libxml2
, openssl
, pkg-config
, curl
, which
, time
}:
let
rustcVersion = "1.29.0";
rustcSrc = fetchurl {
url = "https://static.rust-lang.org/dist/rustc-${rustcVersion}-src.tar.gz";
sha256 = "1sb15znckj8pc8q3g7cq03pijnida6cg64yqmgiayxkzskzk9sx4";
};
rustcDir = "rustc-${rustcVersion}-src";
in
stdenv.mkDerivation rec {
pname = "mrustc-bootstrap";
version = "${mrustc.version}_${rustcVersion}";
inherit (mrustc) src;
postUnpack = "tar -xf ${rustcSrc} -C source/";
# the rust build system complains that nix alters the checksums
dontFixLibtool = true;
patches = [
./patches/0001-use-shared-llvm.patch
./patches/0002-dont-build-llvm.patch
./patches/0003-echo-newlines.patch
./patches/0004-increase-parallelism.patch
];
postPatch = ''
echo "applying patch ./rustc-${rustcVersion}-src.patch"
patch -p0 -d ${rustcDir}/ < rustc-${rustcVersion}-src.patch
for p in ${lib.concatStringsSep " " llvmPackages_7.compiler-rt.patches}; do
echo "applying patch $p"
patch -p1 -d ${rustcDir}/src/libcompiler_builtins/compiler-rt < $p
done
'';
# rustc unfortunately needs cmake to compile llvm-rt but doesn't
# use it for the normal build. This disables cmake in Nix.
dontUseCmakeConfigure = true;
strictDeps = true;
nativeBuildInputs = [
cmake
mrustc
mrustc-minicargo
pkg-config
python3
time
which
];
buildInputs = [
# for rustc
llvm_7 libffi zlib libxml2
# for cargo
openssl curl
];
makeFlags = [
# Use shared mrustc/minicargo/llvm instead of rebuilding them
"MRUSTC=${mrustc}/bin/mrustc"
"MINICARGO=${mrustc-minicargo}/bin/minicargo"
"LLVM_CONFIG=${llvm_7}/bin/llvm-config"
"RUSTC_TARGET=${rust.toRustTarget stdenv.targetPlatform}"
];
buildPhase = ''
runHook preBuild
local flagsArray=(
PARLEVEL=$NIX_BUILD_CORES
${toString makeFlags}
)
echo minicargo.mk: libs
make -f minicargo.mk "''${flagsArray[@]}" LIBS
echo minicargo.mk: deps
mkdir -p output/cargo-build
# minicargo has concurrency issues when running these; let's build them
# without parallelism
for crate in regex regex-0.2.11 curl-sys
do
echo "building $crate"
minicargo ${rustcDir}/src/vendor/$crate \
--vendor-dir ${rustcDir}/src/vendor \
--output-dir output/cargo-build -L output/
done
echo minicargo.mk: rustc
make -f minicargo.mk "''${flagsArray[@]}" output/rustc
echo minicargo.mk: cargo
make -f minicargo.mk "''${flagsArray[@]}" output/cargo
echo run_rustc
make -C run_rustc "''${flagsArray[@]}"
unset flagsArray
runHook postBuild
'';
doCheck = true;
checkPhase = ''
runHook preCheck
run_rustc/output/prefix/bin/hello_world | grep "hello, world"
runHook postCheck
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin/ $out/lib/
cp run_rustc/output/prefix/bin/cargo $out/bin/cargo
cp run_rustc/output/prefix/bin/rustc_binary $out/bin/rustc
cp -r run_rustc/output/prefix/lib/* $out/lib/
cp $out/lib/rustlib/${rust.toRustTarget stdenv.targetPlatform}/lib/*.so $out/lib/
runHook postInstall
'';
meta = with lib; {
inherit (src.meta) homepage;
description = "A minimal build of Rust";
longDescription = ''
A minimal build of Rust, built from source using mrustc.
This is useful for bootstrapping the main Rust compiler without
an initial binary toolchain download.
'';
maintainers = with maintainers; [ progval r-burns ];
license = with licenses; [ mit asl20 ];
platforms = [ "x86_64-linux" ];
};
}