1

I have the first shell.nix file:

{ pkgs ? import ./nix { }
, useClang ? false
, ae_name ? "ae"
}:

with pkgs;

(if useClang then tvb.aeClangStdenv else tvb.aeGccStdenv).mkDerivation rec {
  name = ae_name;

  nativeBuildInputs = tvb.cppNativeBuildInputs;
  buildInputs = tvb.rustBuildInputs
    ++ tvb.cppBuildInputs
    ++ tvb.rBuildInputs
  ;

  TZDIR = "${tzdata}/share/zoneinfo";
  LOCALE_ARCHIVE = "${glibcLocales}/lib/locale/locale-archive";

  out_dir = (toString ./out);
  cur_dir = (toString ./.);

  shellHook = ''
    export PS1="\[\033[38;5;10m\]\u@\h[${name} nix-shell]\[$(tput sgr0)\]\[\033[38;5;15m\]:\[$(tput sgr0)\]\[\033[38;5;39m\]\w\[$(tput sgr0)\]\\$\[$(tput sgr0)\] \[$(tput sgr0)\]"

    # for tools only bin paths are needed
    for prog in ${toString tvb.shellTools}; do
      export PATH="$prog/bin:$PATH"
    done

    export DEPLOY_CFG=${cur_dir}/.deploy.json

    export LD_LIBRARY_PATH="${out_dir}/lib:${fts5-snowball}/lib"
    export PATH="${cur_dir}/lua/bin:${out_dir}/bin:$PATH"
    export AE_SHARE="${out_dir}/share/ae"
    export AE_LIBEXEC="${out_dir}/libexec/ae"

    ## LuaJIT
    export LUA_PATH="$LUA_PATH;${cur_dir}/lua/lib/?.lua;${out_dir}/share/lua/5.1/?.lua;;"
    export LUA_CPATH="$LUA_CPATH;${out_dir}/lib/lua/5.1/?.so;;"

    ## Lua box
    export LUABOX_UNIT_PATH="${out_dir}/share/ae/box/units/?.lua;"

    ## Python
    export PYTHONPATH="${out_dir}/lib/python2.7:$PYTHONPATH"
  '';
}

and I have the seconds shell.nix file:

let
  jupyter = import (builtins.fetchGit {
    url = https://github.com/tweag/jupyterWith;
    rev = "37cd8caefd951eaee65d9142544aa4bd9dfac54f";
  }) {};

  iPython = jupyter.kernels.iPythonWith {
    name = "python";
    packages = p: with p; [ numpy ];
  };

  iHaskell = jupyter.kernels.iHaskellWith {
    extraIHaskellFlags = "--codemirror Haskell";  # for jupyterlab syntax highlighting
    name = "haskell";
    packages = p: with p; [ hvega formatting ];
  };

  jupyterEnvironment =
    jupyter.jupyterlabWith {
      kernels = [ iPython iHaskell ];
    };
in
  jupyterEnvironment.env

Firstly, I tried to append the second to the first one, but then I received the following error:

jbezdek@ubuntu:~$ nix-shell
error: syntax error, unexpected ID, expecting '{', at /home/jbezdek/shell.nix:51:3

After that, I tried many other combinations how to put those two together, but I have never been successful. Could you help me with that, please?

Jaroslav Bezděk
  • 6,967
  • 6
  • 29
  • 46
  • I'm not aware of a general function that merges derivations or shells. Such a function would need to have knowledge about how to merge all the individual fields, but this knowledge has not been formalized. NixOS options do work that way, but `mkDerivation` isn't built on the module system and that would not be feasible. Perhaps it's possible to write a function that is good enough for your use case though, but that takes significant effort. – Robert Hensing Aug 06 '21 at 13:49

1 Answers1

0

Merging two shell.nix files in full generality is tricky, and unlikely to be solved off the shelf.

To solve the case in point, I think you will just have to dig into the Nix expression language a little more to write a syntactically valid .nix file, that contains the content of both files. Something along the lines of this could work:

{ pkgs ? import ./nix { }
, useClang ? false
, ae_name ? "ae"
}:

with pkgs;

let

  jupyter = import (builtins.fetchGit { ... })
  ...
  jupyterEnvironment = ...

in

{
   first_file = (if useClang ...).mkDerivation rec {
     name = ae_name;
     ... 
   };
   
   second_file = jupyterEnvironment.env;
}
Heinrich Hartmann
  • 1,205
  • 11
  • 13