Как я могу использовать конкретную сборку Rust в деривации nixpkgs? - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь создать деривацию для одного из моих исполняемых проектов, и для него требуется версия Rust, которой еще нет в каналах nixpkgs, поэтому я создал деривацию nix, которая устанавливает нужную мне версию:

{ mkDerivation, stdenv, fetchurl }:
rec {
    version = "1.33.0";
    platform = mkDerivation rec {
        ver = version;
        name = "rust-${ver}";
        platform = if stdenv.system == "x86_64-linux" then "x86_64-unknown-linux-gnu"
            else if stdenv.system == "x86_64-darwin" then "x86_64-apple-darwin"
            else abort "unsupported platform";
        pkgSha = if stdenv.system == "x86_64-linux" then "6623168b9ee9de79deb0d9274c577d741ea92003768660aca184e04fe774393f"
            else if stdenv.system == "x86_64-darwin" then "864e7c074a0b88e38883c87c169513d072300bb52e1d320a067bd34cf14f66bd"
            else abort "unsupported platform";

        src = fetchurl {
            url = "https://static.rust-lang.org/dist/rust-${ver}-${platform}.tar.gz";
            sha256 = pkgSha;
        };

        phases = ["unpackPhase" "installPhase"];
        installPhase = ''
            mkdir -p $out
            ./install.sh --prefix=$out
        '';
    };

    rustc = platform;
    cargo = platform;
}

Это очень легко для меня включить в мою оболочку, так как мне просто нужно включить buildInputs = [ rust.rustc rust.cargo ], и у меня сразу же появится Rust 1.33.

Я использовал carnix-0.9.8 для настройки файлов Cargo.nix, crates-io.nix и crates-io.list. Из-за этого библиотеки, от которых я зависел, устанавливаются в хранилище nix, как и любой другой производный, и мой процесс сборки теоретически заканчивается тем, что он вообще не использует Cargo.

Мне уже нужна собственная библиотека безопасности macOS, поэтому я уже создал файл default.nix:

{ pkgs ? import <nixpkgs-18.09> {}
, unstable ? import <nixpkgs> {}
, stdenv ? pkgs.stdenv
, licenses ? pkgs.lib.licenses
, maintainers ? pkgs.stdenv.maintainers }:
let
    rust = import ./nixpkgs/rust-1.33.nix {
      mkDerivation = pkgs.stdenv.mkDerivation;
      fetchurl = pkgs.fetchurl;
      stdenv = pkgs.stdenv;
    };

    cratesIO = import ./crates-io.nix {
        lib = stdenv.lib;
        buildRustCrate = unstable.buildRustCrate;
        buildRustCrateHelpers = unstable.buildRustCrateHelpers;
    };
    cargo = ...

    frameworks = ...
    security = ...
    orizentic = (cargo.orizentic {}).override { ... };

in pkgs.symlinkJoin rec {
    ...
}

А затем я установил build.rs файл, который выдает ошибки, если версия Rust, используемая для сборки, не является по крайней мере версией 1.33.0.

Как мне вставить мой Ржавчина в buildRustCrate и buildRustCrateHelpers?

Для справки, вот вся версия Rust моего проекта .

1 Ответ

1 голос
/ 12 мая 2019

У меня недавно была похожая проблема, поэтому я могу предоставить свой подход здесь. Моя версия rustc была взята из Mozilla overlay , но я думаю, что разница должна быть минимальной.

{ moz_overlay ? builtins.fetchTarball https://github.com/mozilla/nixpkgs-ozilla/archive/master.tar.gz
, nixpkgs ? <nixpkgs>
}:
let
  moz_nixpkgs = import "${nixpkgs}" { overlays = [ (import "${moz_overlay}") ]; };
  rustc = (moz_nixpkgs.rustChannelOf { date = "2019-03-15"; channel = "nightly"; }).rust;
  crates = (import ./Cargo.nix {
    inherit (moz_nixpkgs) lib buildPlatform buildRustCrateHelpers fetchgit;
    buildRustCrate = moz_nixpkgs.buildRustCrate.override {
      inherit rustc; # I guess that injection happens here?
    };
    cratesIO = import ./nix/crates-io.nix {
      inherit (moz_nixpkgs) lib buildRustCrate buildRustCrateHelpers;
    };
  });
in {
  myapp = crates.myapp {};
}

...