создать путь к хранилищу nix с помощью .cargo / registry, запустив «cargo» с помощью nix (mkDerivation или аналогичный) - PullRequest
0 голосов
/ 08 февраля 2019

хакерский путь

у меня есть этот код в nix для генерации .cargo кеша:

myVendoredSrc = pkgs.stdenv.mkDerivation {
    name = "myVendoredSrc";
    # i renamed .cargo into cargo to make this work
    src = /home/joachim/cargo;
    phases = [ "unpackPhase" "installPhase" ];
    installPhase = ''
      mkdir -p $out/.cargo
      cp -R registry $out/.cargo
    '';
  };

я использую этот грузовой кеш в nix-build проекте, подобном этому:

  buildenv = import ./artiq-dev.nix {
    extraProfile = ''
      export HOME=${myVendoredSrc}
    '';
    # --no-compile-gateware to disable vivado build
    runScript = "python -m artiq.gateware.targets.kasli -V satellite --no-compile-gateware";
  };

это позже вызывает cargo build и использует кеш без требования для подключения к Интернету.

в nixpkgs есть fetchcargo, см. https://github.com/alexcrichton/cargo-vendor

вопрос

идея: выяснить, как использовать <nixpkgs>/pkgs/build-support/rust/fetchcargo.nix в моих собственных файлах nix ...

то, что я пробовал раньше

пожалуйста, не намекайте мне на использование carnix (я попробовал его собрать, это не сработало, и я также обнаружил, что не могу использовать его для этогопроект) или buildRustPackage или buildRustCrate (по той же причине, это не может быть использовано для проекта, над которым я работаю, поскольку это кросс-компиляторная установка, которая настраивается из сценария Python, создающего несколько переменных среды) *

1 Ответ

0 голосов
/ 09 февраля 2019

это код, который я наконец-то придумал:

let 
  pkgs = import <nixpkgs> {};
  fetchcargo = import <nixpkgs/pkgs/build-support/rust/fetchcargo.nix> {
    inherit (pkgs) stdenv cacert git rust cargo-vendor;
  };
  myVendoredSrcFetchCargo = fetchcargo rec {
    name = "myVendoredSrcFetchCargo";
    sourceRoot = null;
    srcs = null;
    src = ../artiq/firmware;
    cargoUpdateHook = "";
    patches = [];
    sha256 = "1xzjn9i4rkd9124v2gbdplsgsvp1hlx7czdgc58n316vsnrkbr86";
  };

  myVendoredSrc = pkgs.stdenv.mkDerivation {
    name = "myVendoredSrc";
    src = myVendoredSrcFetchCargo;
    phases = [ "unpackPhase" "installPhase" ];
    installPhase = ''
      mkdir -p $out/.cargo/registry
      cat > $out/.cargo/config << EOF
        [source.crates-io]
        registry = "https://github.com/rust-lang/crates.io-index"
        replace-with = "vendored-sources"
        [source."https://github.com/m-labs/libfringe"]
        git = "https://github.com/m-labs/libfringe"
        rev = "b8a6d8f"
        replace-with = "vendored-sources"
        [source.vendored-sources]
        directory = "$out/.cargo/registry"
      EOF
      cp -R * $out/.cargo/registry
    '';
  };

  buildenv = import ./artiq-dev.nix { inherit pkgs; };

in pkgs.stdenv.mkDerivation {
  name = "artiq-board";
  src = null;
  phases = [ "buildPhase" "installPhase" ];
  buildPhase = 
    ''
    ${buildenv}/bin/artiq-dev -c "HOME=${myVendoredSrc} python -m artiq.gateware.targets.kasli -V satellite --no-compile-gateware"
    '';
  installPhase =
    ''
    mkdir $out
    #cp artiq_kasli/satellite/gateware/top.bit $out
    cp artiq_kasli/satellite/software/bootloader/bootloader.bin $out
    cp artiq_kasli/satellite/software/satman/satman.{elf,fbi} $out
    '';
}
...