about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/mrustc/bootstrap.nix147
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" ];
+  };
+}