Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / top-level / unixtools.nix
blob40faa7642129742b0bb36660fce736b0d9358545
1 { pkgs, buildEnv, runCommand, lib, stdenv }:
3 # These are some unix tools that are commonly included in the /usr/bin
4 # and /usr/sbin directory under more normal distributions. Along with
5 # coreutils, these are commonly assumed to be available by build
6 # systems, but we can't assume they are available. In Nix, we list
7 # each program by name directly through this unixtools attribute.
9 # You should always try to use single binaries when available. For
10 # instance, if your program needs to use "ps", just list it as a build
11 # input, not "procps" which requires Linux.
13 with lib;
15 let
16   version = "1003.1-2008";
18   singleBinary = cmd: providers: let
19       provider = providers.${stdenv.hostPlatform.parsed.kernel.name} or providers.linux;
20       bin = "${getBin provider}/bin/${cmd}";
21       manpage = "${getOutput "man" provider}/share/man/man1/${cmd}.1.gz";
22     in runCommand "${cmd}-${provider.name}" {
23       meta = {
24         mainProgram = cmd;
25         priority = 10;
26         platforms = lib.platforms.${stdenv.hostPlatform.parsed.kernel.name} or lib.platforms.all;
27       };
28       passthru = { inherit provider; };
29       preferLocalBuild = true;
30     } ''
31       if ! [ -x ${bin} ]; then
32         echo Cannot find command ${cmd}
33         exit 1
34       fi
36       mkdir -p $out/bin
37       ln -s ${bin} $out/bin/${cmd}
39       if [ -f ${manpage} ]; then
40         mkdir -p $out/share/man/man1
41         ln -s ${manpage} $out/share/man/man1/${cmd}.1.gz
42       fi
43     '';
45   # more is unavailable in darwin
46   # so we just use less
47   more_compat = runCommand "more-${pkgs.less.name}" {} ''
48     mkdir -p $out/bin
49     ln -s ${pkgs.less}/bin/less $out/bin/more
50   '';
52   bins = mapAttrs singleBinary {
53     # singular binaries
54     arp = {
55       linux = pkgs.nettools;
56       darwin = pkgs.darwin.network_cmds;
57     };
58     col = {
59       linux = pkgs.util-linux;
60       darwin = pkgs.darwin.text_cmds;
61     };
62     column = {
63       linux = pkgs.util-linux;
64       darwin = pkgs.darwin.text_cmds;
65     };
66     eject = {
67       linux = pkgs.util-linux;
68     };
69     getconf = {
70       linux = if stdenv.hostPlatform.libc == "glibc" then pkgs.stdenv.cc.libc
71               else pkgs.netbsd.getconf;
72       darwin = pkgs.darwin.system_cmds;
73     };
74     getent = {
75       linux = if stdenv.hostPlatform.libc == "glibc" then pkgs.stdenv.cc.libc.getent
76               else pkgs.netbsd.getent;
77       darwin = pkgs.netbsd.getent;
78     };
79     getopt = {
80       linux = pkgs.util-linux;
81       darwin = pkgs.getopt;
82     };
83     fdisk = {
84       linux = pkgs.util-linux;
85       darwin = pkgs.darwin.diskdev_cmds;
86     };
87     fsck = {
88       linux = pkgs.util-linux;
89       darwin = pkgs.darwin.diskdev_cmds;
90     };
91     hexdump = {
92       linux = pkgs.util-linux;
93       darwin = pkgs.darwin.shell_cmds;
94     };
95     hostname = {
96       linux = pkgs.nettools;
97       darwin = pkgs.darwin.shell_cmds;
98     };
99     ifconfig = {
100       linux = pkgs.nettools;
101       darwin = pkgs.darwin.network_cmds;
102     };
103     killall = {
104       linux = pkgs.psmisc;
105       darwin = pkgs.darwin.shell_cmds;
106     };
107     locale = {
108       linux = pkgs.glibc;
109       darwin = pkgs.darwin.adv_cmds;
110     };
111     logger = {
112       linux = pkgs.util-linux;
113     };
114     more = {
115       linux = pkgs.util-linux;
116       darwin = more_compat;
117     };
118     mount = {
119       linux = pkgs.util-linux;
120       darwin = pkgs.darwin.diskdev_cmds;
121     };
122     netstat = {
123       linux = pkgs.nettools;
124       darwin = pkgs.darwin.network_cmds;
125     };
126     ping = {
127       linux = pkgs.iputils;
128       darwin = pkgs.darwin.network_cmds;
129     };
130     ps = {
131       linux = pkgs.procps;
132       darwin = pkgs.darwin.ps;
133     };
134     quota = {
135       linux = pkgs.linuxquota;
136       darwin = pkgs.darwin.diskdev_cmds;
137     };
138     route = {
139       linux = pkgs.nettools;
140       darwin = pkgs.darwin.network_cmds;
141     };
142     script = {
143       linux = pkgs.util-linux;
144       darwin = pkgs.darwin.shell_cmds;
145     };
146     sysctl = {
147       linux = pkgs.procps;
148       darwin = pkgs.darwin.system_cmds;
149     };
150     top = {
151       linux = pkgs.procps;
152       darwin = pkgs.darwin.top;
153     };
154     umount = {
155       linux = pkgs.util-linux;
156       darwin = pkgs.darwin.diskdev_cmds;
157     };
158     whereis = {
159       linux = pkgs.util-linux;
160       darwin = pkgs.darwin.shell_cmds;
161     };
162     wall = {
163       linux = pkgs.util-linux;
164     };
165     watch = {
166       linux = pkgs.procps;
168       # watch is the only command from procps that builds currently on
169       # Darwin. Unfortunately no other implementations exist currently!
170       darwin = pkgs.callPackage ../os-specific/linux/procps-ng {};
171     };
172     write = {
173       linux = pkgs.util-linux;
174       darwin = pkgs.darwin.basic_cmds;
175     };
176     xxd = {
177       linux = pkgs.vim;
178       darwin = pkgs.vim;
179     };
180   };
182   makeCompat = pname: paths:
183     buildEnv {
184       name = "${pname}-${version}";
185       inherit paths;
186     };
188   # Compatibility derivations
189   # Provided for old usage of these commands.
190   compat = with bins; lib.mapAttrs makeCompat {
191     procps = [ ps sysctl top watch ];
192     util-linux = [ fsck fdisk getopt hexdump mount
193                   script umount whereis write col column ];
194     nettools = [ arp hostname ifconfig netstat route ];
195   };
196 in bins // compat