about summary refs log tree commit diff
path: root/pkgs/top-level/unixtools.nix
diff options
context:
space:
mode:
authorJörg Thalheim <joerg@thalheim.io>2021-01-14 08:58:39 +0100
committerJörg Thalheim <joerg@thalheim.io>2021-01-14 09:00:15 +0100
commit124655ed49f8c44b0004d6098c2f1134b3404c10 (patch)
treedc8e7355d30b6786e047ddbf948eccdfe7034125 /pkgs/top-level/unixtools.nix
parent8fcb5db84c88065ce5e666554cad69244c4cf497 (diff)
unixtools: align attribute name with filename
(so they can be easier matched)
Diffstat (limited to 'pkgs/top-level/unixtools.nix')
-rw-r--r--pkgs/top-level/unixtools.nix195
1 files changed, 195 insertions, 0 deletions
diff --git a/pkgs/top-level/unixtools.nix b/pkgs/top-level/unixtools.nix
new file mode 100644
index 0000000000000..b4f708ad56511
--- /dev/null
+++ b/pkgs/top-level/unixtools.nix
@@ -0,0 +1,195 @@
+{ pkgs, buildEnv, runCommand, lib, stdenv }:
+
+# These are some unix tools that are commonly included in the /usr/bin
+# and /usr/sbin directory under more normal distributions. Along with
+# coreutils, these are commonly assumed to be available by build
+# systems, but we can't assume they are available. In Nix, we list
+# each program by name directly through this unixtools attribute.
+
+# You should always try to use single binaries when available. For
+# instance, if your program needs to use "ps", just list it as a build
+# input, not "procps" which requires Linux.
+
+with lib;
+
+let
+  version = "1003.1-2008";
+
+  singleBinary = cmd: providers: let
+      provider = providers.${stdenv.hostPlatform.parsed.kernel.name} or providers.linux;
+      bin = "${getBin provider}/bin/${cmd}";
+      manpage = "${getOutput "man" provider}/share/man/man1/${cmd}.1.gz";
+    in runCommand "${cmd}-${version}" {
+      meta = {
+        priority = 10;
+        platforms = lib.platforms.${stdenv.hostPlatform.parsed.kernel.name} or lib.platforms.all;
+      };
+      passthru = { inherit provider; };
+      preferLocalBuild = true;
+    } ''
+      if ! [ -x ${bin} ]; then
+        echo Cannot find command ${cmd}
+        exit 1
+      fi
+
+      mkdir -p $out/bin
+      ln -s ${bin} $out/bin/${cmd}
+
+      if [ -f ${manpage} ]; then
+        mkdir -p $out/share/man/man1
+        ln -s ${manpage} $out/share/man/man1/${cmd}.1.gz
+      fi
+    '';
+
+  # more is unavailable in darwin
+  # so we just use less
+  more_compat = runCommand "more-${version}" {} ''
+    mkdir -p $out/bin
+    ln -s ${pkgs.less}/bin/less $out/bin/more
+  '';
+
+  bins = mapAttrs singleBinary {
+    # singular binaries
+    arp = {
+      linux = pkgs.nettools;
+      darwin = pkgs.darwin.network_cmds;
+    };
+    col = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.text_cmds;
+    };
+    column = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.netbsd.column;
+    };
+    eject = {
+      linux = pkgs.util-linux;
+    };
+    getconf = {
+      linux = if stdenv.hostPlatform.libc == "glibc" then pkgs.stdenv.cc.libc
+              else pkgs.netbsd.getconf;
+      darwin = pkgs.darwin.system_cmds;
+    };
+    getent = {
+      linux = if stdenv.hostPlatform.libc == "glibc" then pkgs.stdenv.cc.libc
+              else pkgs.netbsd.getent;
+      darwin = pkgs.netbsd.getent;
+    };
+    getopt = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.getopt;
+    };
+    fdisk = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.diskdev_cmds;
+    };
+    fsck = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.diskdev_cmds;
+    };
+    hexdump = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.shell_cmds;
+    };
+    hostname = {
+      linux = pkgs.nettools;
+      darwin = pkgs.darwin.shell_cmds;
+    };
+    ifconfig = {
+      linux = pkgs.nettools;
+      darwin = pkgs.darwin.network_cmds;
+    };
+    killall = {
+      linux = pkgs.psmisc;
+      darwin = pkgs.darwin.shell_cmds;
+    };
+    locale = {
+      linux = pkgs.glibc;
+      darwin = pkgs.netbsd.locale;
+    };
+    logger = {
+      linux = pkgs.util-linux;
+    };
+    more = {
+      linux = pkgs.util-linux;
+      darwin = more_compat;
+    };
+    mount = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.diskdev_cmds;
+    };
+    netstat = {
+      linux = pkgs.nettools;
+      darwin = pkgs.darwin.network_cmds;
+    };
+    ping = {
+      linux = pkgs.iputils;
+      darwin = pkgs.darwin.network_cmds;
+    };
+    ps = {
+      linux = pkgs.procps;
+      darwin = pkgs.darwin.ps;
+    };
+    quota = {
+      linux = pkgs.linuxquota;
+      darwin = pkgs.darwin.diskdev_cmds;
+    };
+    route = {
+      linux = pkgs.nettools;
+      darwin = pkgs.darwin.network_cmds;
+    };
+    script = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.shell_cmds;
+    };
+    sysctl = {
+      linux = pkgs.procps;
+      darwin = pkgs.darwin.system_cmds;
+    };
+    top = {
+      linux = pkgs.procps;
+      darwin = pkgs.darwin.top;
+    };
+    umount = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.diskdev_cmds;
+    };
+    whereis = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.shell_cmds;
+    };
+    wall = {
+      linux = pkgs.util-linux;
+    };
+    watch = {
+      linux = pkgs.procps;
+
+      # watch is the only command from procps that builds currently on
+      # Darwin. Unfortunately no other implementations exist currently!
+      darwin = pkgs.callPackage ../os-specific/linux/procps-ng {};
+    };
+    write = {
+      linux = pkgs.util-linux;
+      darwin = pkgs.darwin.basic_cmds;
+    };
+    xxd = {
+      linux = pkgs.vim;
+      darwin = pkgs.vim;
+    };
+  };
+
+  makeCompat = pname: paths:
+    buildEnv {
+      name = "${pname}-${version}";
+      inherit paths;
+    };
+
+  # Compatibility derivations
+  # Provided for old usage of these commands.
+  compat = with bins; lib.mapAttrs makeCompat {
+    procps = [ ps sysctl top watch ];
+    util-linux = [ fsck fdisk getopt hexdump mount
+                  script umount whereis write col column ];
+    nettools = [ arp hostname ifconfig netstat route ];
+  };
+in bins // compat