diff options
Diffstat (limited to 'pkgs/top-level/unix-tools.nix')
-rw-r--r-- | pkgs/top-level/unix-tools.nix | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/pkgs/top-level/unix-tools.nix b/pkgs/top-level/unix-tools.nix new file mode 100644 index 000000000000..0d6e8d1c6c2d --- /dev/null +++ b/pkgs/top-level/unix-tools.nix @@ -0,0 +1,132 @@ +{ pkgs, buildEnv, runCommand, hostPlatform }: + +# 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. + +let + + singleBinary = cmd: providers: let + provider = "${providers.${hostPlatform.parsed.kernel.name} or "missing-package"}/bin/${cmd}"; + in runCommand cmd { + meta.platforms = map (n: { kernel.name = n; }) (pkgs.lib.attrNames providers); + } '' + mkdir -p $out/bin + + if ! [ -x "${provider}" ]; then + echo "Cannot find command ${cmd}" + exit 1 + fi + + ln -s "${provider}" "$out/bin/${cmd}" + ''; + +in rec { + + # more is unavailable in darwin + # just use less + more_compat = runCommand "more" {} '' + mkdir -p $out/bin + ln -s ${pkgs.less}/bin/less $out/bin/more + ''; + + # singular binaries + arp = singleBinary "arp" { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + eject = singleBinary "eject" { + linux = pkgs.utillinux; + }; + getopt = singleBinary "getopt" { + linux = pkgs.utillinux; + darwin = pkgs.getopt; + }; + hexdump = singleBinary "hexdump" { + linux = pkgs.procps; + darwin = pkgs.darwin.shell_cmds; + }; + hostname = singleBinary "hostname" { + linux = pkgs.nettools; + darwin = pkgs.darwin.shell_cmds; + }; + ifconfig = singleBinary "ifconfig" { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + logger = singleBinary "logger" { + linux = pkgs.utillinux; + }; + modprobe = singleBinary "modprobe" { + linux = pkgs.utillinux; + }; + more = singleBinary "more" { + linux = pkgs.utillinux; + darwin = more_compat; + }; + mount = singleBinary "mount" { + linux = pkgs.utillinux; + }; + netstat = singleBinary "netstat" { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + ping = singleBinary "ping" { + linux = pkgs.iputils; + darwin = pkgs.darwin.network_cmds; + }; + ps = singleBinary "ps" { + linux = pkgs.procps; + darwin = pkgs.darwin.ps; + }; + route = singleBinary "route" { + linux = pkgs.nettools; + darwin = pkgs.darwin.network_cmds; + }; + script = singleBinary "script" { + linux = pkgs.utillinux; + darwin = pkgs.darwin.shell_cmds; + }; + sysctl = singleBinary "sysctl" { + linux = pkgs.procps; + darwin = pkgs.darwin.system_cmds; + }; + umount = singleBinary "umount" { + linux = pkgs.utillinux; + }; + whereis = singleBinary "whereis" { + linux = pkgs.utillinux; + darwin = pkgs.darwin.shell_cmds; + }; + wall = singleBinary "wall" { + linux = pkgs.utillinux; + }; + write = singleBinary "write" { + linux = pkgs.utillinux; + darwin = pkgs.darwin.basic_cmds; + }; + + # Compatibility derivations + # Provided for old usage of these commands. + + procps = buildEnv { + name = "procps-compat"; + paths = [ sysctl ps ]; + }; + + utillinux = buildEnv { + name = "utillinux-compat"; + paths = [ getopt hexdump script whereis write ]; + }; + + nettools = buildEnv { + name = "nettools-compat"; + paths = [ arp hostname netstat route ]; + }; +} |