Hi. I am working on a derivation which is a simple shell script (mons
).
Running nix-shell $MYNIXPKGS -A mons
builds the derivation and puts it into /nix/store/
. I can call the script with the full path /nix/store/.../usr/bin/mons
, however, I cannot call it without the full path.
What is necessary to get nix to make the script accessible? Where is this documented?
1 Like
Hi @feijoas.
This is a common misconception of what nix-shell
does. That tools’ main intent is to help debug derivations by bringing all the build phases and dependencies into the shell so you can play with it.
To achieve what you want, try adding your package as a buildInput
of yet another derivation and load that-one with nix-shell
. For example if your shell.nix
looks like this:
{ pkgs ? import <nixpkgs> {} }:
rec {
mons = pkgs.callPackage ./mons.nix {};
shell = pkgs.runCommand "my-shell" { buildInputs = [ mons ]; } "";
}
Then call nix-shell -A shell
.
Thanks, but that also doesn’t work.
I also put the package into all-packages.nix
an then in my environment.systemPackages
. After sudo nixos-rebuild switch -I nixpkgs=$MYNIXPKGS
, the script is still not callable. It looks simply like this:
{ stdenv, lib, fetchFromGitHub, fetchpatch, help2man, xrandr }:
stdenv.mkDerivation rec {
pname = "mons";
version = "20200107";
src = fetchFromGitHub {
owner = "Ventto";
repo = pname;
rev = "0c9e1a1dddff23a0525ed8e4ec9af8f9dd8cad4c";
sha256 = "02c41mw3g1mgl91hhpz1n45iaqk9s7mdk1ixm8yv6sv17hy8rr4w";
fetchSubmodules = true;
};
nativeBuildInputs = [ help2man ];
makeFlags = [ "DESTDIR=$(out)" ];
meta = with lib; {
description = "POSIX Shell script to quickly manage 2-monitors display";
homepage = "https://github.com/Ventto/mons.git";
license = licenses.mit;
maintainers = [ maintainers.mschneider ];
};
}
That’s another issue. The package installs things in $out/usr
instead of $out
. Most of the time packages have a PREFIX and DESTDIR and you want to set the PREFIX instead so that the binary ends-up in $out/bin/mons
.