1{
2 lib,
3 fetchurl,
4 kaem,
5 tinycc,
6}:
7let
8 pname = "gnupatch";
9 # 2.6.x and later use features not implemented in mes-libc (eg. quotearg.h)
10 version = "2.5.9";
11
12 src = fetchurl {
13 url = "mirror://gnu/patch/patch-${version}.tar.gz";
14 sha256 = "12nv7jx3gxfp50y11nxzlnmqqrpicjggw6pcsq0wyavkkm3cddgc";
15 };
16
17 # Thanks to the live-bootstrap project!
18 # https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/patch-2.5.9/mk/main.mk
19 CFLAGS = [
20 "-I."
21 "-DHAVE_DECL_GETENV"
22 "-DHAVE_DECL_MALLOC"
23 "-DHAVE_DIRENT_H"
24 "-DHAVE_LIMITS_H"
25 "-DHAVE_GETEUID"
26 "-DHAVE_MKTEMP"
27 "-DPACKAGE_BUGREPORT="
28 "-Ded_PROGRAM=\\\"/nullop\\\""
29 "-Dmbstate_t=int" # When HAVE_MBRTOWC is not enabled uses of mbstate_t are always a no-op
30 "-DRETSIGTYPE=int"
31 "-DHAVE_MKDIR"
32 "-DHAVE_RMDIR"
33 "-DHAVE_FCNTL_H"
34 "-DPACKAGE_NAME=\\\"patch\\\""
35 "-DPACKAGE_VERSION=\\\"${version}\\\""
36 "-DHAVE_MALLOC"
37 "-DHAVE_REALLOC"
38 "-DSTDC_HEADERS"
39 "-DHAVE_STRING_H"
40 "-DHAVE_STDLIB_H"
41 ];
42
43 # Maintenance note: List of sources from Makefile.in
44 SRCS = [
45 "addext.c"
46 "argmatch.c"
47 "backupfile.c"
48 "basename.c"
49 "dirname.c"
50 "getopt.c"
51 "getopt1.c"
52 "inp.c"
53 "maketime.c"
54 "partime.c"
55 "patch.c"
56 "pch.c"
57 "quote.c"
58 "quotearg.c"
59 "quotesys.c"
60 "util.c"
61 "version.c"
62 "xmalloc.c"
63 ];
64 sources = SRCS ++ [
65 # mes-libc doesn't implement `error()`
66 "error.c"
67 ];
68
69 objects = map (x: lib.replaceStrings [ ".c" ] [ ".o" ] (builtins.baseNameOf x)) sources;
70in
71kaem.runCommand "${pname}-${version}"
72 {
73 inherit pname version;
74
75 nativeBuildInputs = [ tinycc.compiler ];
76
77 meta = with lib; {
78 description = "GNU Patch, a program to apply differences to files";
79 homepage = "https://www.gnu.org/software/patch";
80 license = licenses.gpl3Plus;
81 teams = [ teams.minimal-bootstrap ];
82 mainProgram = "patch";
83 platforms = platforms.unix;
84 };
85 }
86 ''
87 # Unpack
88 ungz --file ${src} --output patch.tar
89 untar --file patch.tar
90 rm patch.tar
91 cd patch-${version}
92
93 # Configure
94 catm config.h
95
96 # Build
97 alias CC="tcc -B ${tinycc.libs}/lib ${lib.concatStringsSep " " CFLAGS}"
98 ${lib.concatMapStringsSep "\n" (f: "CC -c ${f}") sources}
99
100 # Link
101 CC -o patch ${lib.concatStringsSep " " objects}
102
103 # Check
104 ./patch --version
105
106 # Install
107 mkdir -p ''${out}/bin
108 cp ./patch ''${out}/bin
109 chmod 555 ''${out}/bin/patch
110 ''