2017-09-05 1 views
0

J'essaie d'utiliser Nix sur Ubuntu 16.04.Comment déboguer des erreurs nix-build pour un fichier nix personnalisé?

Après l'installation, je tente de construire l'expression suivante:

let 
    pkgs = import <nixpkgs> {}; 
    stdenv = pkgs.stdenv; 
in rec { 
    scalaEnv = stdenv.mkDerivation rec { 
    name = "scala-env"; 
    shellHook = '' 
    alias cls=clear 
    ''; 
    CLANG_PATH = pkgs.clang + "/bin/clang"; 
    CLANGPP_PATH = pkgs.clang + "/bin/clang++"; 
    buildInputs = with pkgs; [ 
     stdenv 
     sbt 
     openjdk 
     boehmgc 
     libunwind 
     re2 
     clang 
     zlib 
     ammonite 
    ]; 
    }; 
} 

Mais cela se termine dans l'erreur:

*** Downloading ‘https://cache.nixos.org/nar/022mrfa98hxccsn9znr9z9s7sh3kfc5wzvgfx45x5drcz9wq3wyv.nar.xz’ to ‘/nix/store/y1scdckyi7ij30771rl1pdq4s9gj683a-sbt-1.0.1’... 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 50.0M 100 50.0M 0  0 12.5M  0 0:00:04 0:00:04 --:--:-- 10.7M 

building path(s) ‘/nix/store/9xykkj5z6szrwamji3gshylxca092nv9-scala-env’ 
unpacking sources 
variable $src or $srcs should point to the source 
builder for ‘/nix/store/wg0kd6z5kik46xza5xsdqw4yf10ifksv-scala-env.drv’ failed with exit code 1 
error: build of ‘/nix/store/wg0kd6z5kik46xza5xsdqw4yf10ifksv-scala-env.drv’ failed 
The command '/bin/sh -c $nixenv && nix-build scala-default.nix -A scalaEnv' returned a non-zero code: 100 

Notez que /bin/sh -c $nixenv essaie simplement de mettre en place l'environnement nix - I peut poster plus de détails si cela est utile.

J'ai déjà construit une expression très similaire sur un autre système - je ne suis pas sûr de ce qui pourrait mal se passer sur ce système - comment pourrait-on procéder pour le déboguer?

+0

Lors de la publication de messages d'erreur, veuillez publier la commande exacte que vous avez exécutée pour obtenir l'erreur. –

Répondre

1

Vous devriez regarder le message d'erreur:

variable $src or $srcs should point to the source 

Vous pouvez probablement rechercher ce message d'erreur dans le référentiel nixpkgs pour trouver exactement où il a été généré. Qu'est-ce qui se passe, c'est que vous n'avez pas fourni un script de shell de constructeur, nixpkgs essaye juste de deviner comment construire votre projet basé sur vos autres arguments mkDerivation. Mais il ne peut pas deviner comment construire votre chose parce que vous ne lui avez pas donné quelques fichiers sources à compiler. Je vous suggère d'écrire quelque chose comme builder = ./builder.sh pour ajouter un script de construction, puis dans ce fichier, mettez les commandes pour construire votre logiciel.

1

Nix il y a deux fonctions de dérivation que vous devez considérer lors de la construction de paquets:

  1. derivation qui est fourni par Nix.
  2. stdenv.mkDerivation qui est fourni par Collection de paquets Nix.

mkDerivation utilise derivation sous le capot, alors lorsque vous utilisez mkDerivation il est important de comprendre comment ils travaillent tous les deux . Pour votre question particulière, la chose est que derivation a trois entrées nécessaires:

There must be an attribute named system whose value must be a string specifying a Nix platform identifier, such as "i686-linux" or "powerpc-darwin"

There must be an attribute named name whose value must be a string. This is used as a symbolic name for the package by nix-env, and it is appended to the output paths of the derivation.

There must be an attribute named builder that identifies the program that is executed to perform the build. It can be either a derivation or a source (a local file reference, e.g., ./builder.sh).

Maintenant, mkDerivation prend soin de deux de ces intrants nécessaires en fournissant le système et constructeur attributs; ce qui bien sûr, vous pouvez passer outre. Cependant, parce que mkDerivation fournit son propre constructeur, qui est conçu pour construire les paquets ./configure, make, make install, il a son propre ensemble de conditions. À savoir, que vous fournissez un attribut src qui pointe vers votre code source. En règle générale, fetchurl est utilisé pour fournir l'attribut src, mais un chemin Nix (pas une chaîne) vers la source doit également fonctionner.

Si le constructeur par défaut fourni par mkDerivation n'est pas ce dont vous avez besoin, alors vous devrez écrire le vôtre. D'un autre côté, s'il fournit ce dont vous avez besoin, vous n'avez qu'à vous assurer de fournir les intrants nécessaires.

Vous pouvez en savoir plus sur environ derivation et mkDerivationhere et here, respectivement.

+0

Merci, j'ai lu la documentation connexe, même si je ne suis toujours pas sûr de savoir comment l'obtenir pour localiser mon script de construction: J'ai ajouté un script fictif qui renvoie 0: 'builder =" ./scala-build.sh ";' Maintenant, obtenez './scala-build.sh: Aucun fichier ou répertoire' quand je lance 'nix-build./scala-default.nix' quand j'ai' scala-build.sh' dans le même répertoire que 'scala- default.nix' – bbarker

+0

Je suppose que c'était une sorte de question différente, donc je l'ai ajouté ici: https://stackoverflow.com/questions/46116114/where-should-the-builder-script-be-located-for-a- stand-alone-nix-expression Quoi qu'il en soit, la bonne nouvelle est que je peux apparemment obtenir ce dont j'ai besoin jusqu'ici avec 'nix-shell'. – bbarker