diff options
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix')
-rw-r--r-- | nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix b/nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix new file mode 100644 index 000000000000..0996702ec625 --- /dev/null +++ b/nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix @@ -0,0 +1,147 @@ +{ lib, stdenv +, fetchurl +, mrustc +, mrustc-minicargo +, llvm_12 +, llvmPackages_12 +, libffi +, cmake +, python3 +, zlib +, libxml2 +, openssl +, pkg-config +, curl +, which +, time +}: + +let + mrustcTargetVersion = "1.54"; + rustcVersion = "1.54.0"; + rustcSrc = fetchurl { + url = "https://static.rust-lang.org/dist/rustc-${rustcVersion}-src.tar.gz"; + sha256 = "0xk9dhfff16caambmwij67zgshd8v9djw6ha0fnnanlv7rii31dc"; + }; + rustcDir = "rustc-${rustcVersion}-src"; + outputDir = "output-${rustcVersion}"; +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-dont-download-rustc.patch + ]; + + postPatch = '' + echo "applying patch ./rustc-${rustcVersion}-src.patch" + patch -p0 -d ${rustcDir}/ < rustc-${rustcVersion}-src.patch + ''; + + # 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_12 libffi zlib libxml2 + # for cargo + openssl + (curl.override { inherit openssl; }) + ]; + + makeFlags = [ + # Use shared mrustc/minicargo/llvm instead of rebuilding them + "MRUSTC=${mrustc}/bin/mrustc" + #"MINICARGO=${mrustc-minicargo}/bin/minicargo" # FIXME: we need to rebuild minicargo locally so --manifest-overrides is applied + "LLVM_CONFIG=${llvm_12.dev}/bin/llvm-config" + "RUSTC_TARGET=${stdenv.targetPlatform.rust.rustcTarget}" + ]; + + buildPhase = '' + runHook preBuild + + local flagsArray=( + PARLEVEL=$NIX_BUILD_CORES + ${toString makeFlags} + ) + + touch ${rustcDir}/dl-version + export OUTDIR_SUF=-${rustcVersion} + export RUSTC_VERSION=${rustcVersion} + export MRUSTC_TARGET_VER=${mrustcTargetVersion} + export MRUSTC_PATH=${mrustc}/bin/mrustc + + echo minicargo.mk: libs + make -f minicargo.mk "''${flagsArray[@]}" LIBS + + echo test + make "''${flagsArray[@]}" test + + # disabled because it expects ./bin/mrustc + #echo local_tests + #make "''${flagsArray[@]}" local_tests + + echo minicargo.mk: rustc + make -f minicargo.mk "''${flagsArray[@]}" ${outputDir}/rustc + + echo minicargo.mk: cargo + make -f minicargo.mk "''${flagsArray[@]}" ${outputDir}/cargo + + echo run_rustc + make -C run_rustc "''${flagsArray[@]}" + + unset flagsArray + + runHook postBuild + ''; + + doCheck = true; + checkPhase = '' + runHook preCheck + run_rustc/${outputDir}/prefix/bin/hello_world | grep "hello, world" + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out/bin/ $out/lib/ + cp run_rustc/${outputDir}/prefix/bin/cargo $out/bin/cargo + cp run_rustc/${outputDir}/prefix/bin/rustc_binary $out/bin/rustc + + cp -r run_rustc/${outputDir}/prefix/lib/* $out/lib/ + cp $out/lib/rustlib/${stdenv.targetPlatform.rust.rustcTarget}/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" ]; + }; +} |