1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
{
lib,
stdenv,
fetchurl,
removeReferencesTo,
runtimeShellPackage,
texinfo,
interactive ? false,
readline,
autoreconfHook, # no-pma fix
/*
Test suite broke on:
stdenv.hostPlatform.isCygwin # XXX: `test-dup2' segfaults on Cygwin 6.1
|| stdenv.hostPlatform.isDarwin # XXX: `locale' segfaults
|| stdenv.hostPlatform.isSunOS # XXX: `_backsmalls1' fails, locale stuff?
|| stdenv.hostPlatform.isFreeBSD
*/
doCheck ? (interactive && stdenv.hostPlatform.isLinux),
glibcLocales ? null,
locale ? null,
}:
assert (doCheck && stdenv.hostPlatform.isLinux) -> glibcLocales != null;
stdenv.mkDerivation (finalAttrs: {
pname = "gawk" + lib.optionalString interactive "-interactive";
version = "5.4.1";
src = fetchurl {
url = "mirror://gnu/gawk/gawk-${finalAttrs.version}.tar.xz";
hash = "sha256-B/b3NCt/6+QxP8LCVCrZPWT+IK2HFyABCfEFqCb1/Tc=";
};
patches = [
# When building gawk without gmp and mpfr, gawk 5.4.1 causes build failures
# in downstream packages such as GCC and libpng.
# Discussion on bug-gawk:
# https://lists.gnu.org/archive/html/bug-gawk/2026-07/msg00013.html
# Vendored since we can't use fetchpatch:
# https://gitweb.git.savannah.gnu.org/gitweb/?p=gawk.git;a=commit;h=bf85f8a3175af703597082d4c7e0abc2066a44d3
./node-struct-without-gmp-mpfr.patch
];
# When we do build separate interactive version, it makes sense to always include man.
outputs = [
"out"
"info"
]
++ lib.optional (!interactive) "man";
__structuredAttrs = true;
strictDeps = true;
enableParallelBuilding = true;
# no-pma fix
nativeBuildInputs = [
autoreconfHook
texinfo
]
++ lib.optionals interactive [
removeReferencesTo
]
++ lib.optionals (doCheck && stdenv.hostPlatform.isLinux) [
glibcLocales
];
buildInputs =
lib.optionals interactive [
runtimeShellPackage
readline
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
locale
];
configureFlags = [
(if interactive then "--with-readline=${readline.dev}" else "--without-readline")
];
env = lib.optionalAttrs stdenv.hostPlatform.isDarwin {
# TODO: figure out a better way to unbreak _NSGetExecutablePath invocations
NIX_CFLAGS_COMPILE = "-Wno-implicit-function-declaration";
};
makeFlags = [
"AR=${stdenv.cc.targetPrefix}ar"
];
inherit doCheck;
postInstall =
(
if interactive then
''
remove-references-to -t "$NIX_CC" "$out"/bin/gawkbug
patchShebangs --host "$out"/bin/gawkbug
''
else
''
rm "$out"/bin/gawkbug
''
)
+ ''
rm "$out"/bin/gawk-*
ln -s gawk.1 "''${!outputMan}"/share/man/man1/awk.1
'';
meta = {
homepage = "https://www.gnu.org/software/gawk/";
description = "GNU implementation of the Awk programming language";
longDescription = ''
Many computer users need to manipulate text files: extract and then
operate on data from parts of certain lines while discarding the rest,
make changes in various text files wherever certain patterns appear,
and so on. To write a program to do these things in a language such as
C or Pascal is a time-consuming inconvenience that may take many lines
of code. The job is easy with awk, especially the GNU implementation:
Gawk.
The awk utility interprets a special-purpose programming language that
makes it possible to handle many data-reformatting jobs with just a few
lines of code.
'';
license = lib.licenses.gpl3Plus;
platforms = lib.platforms.unix ++ lib.platforms.windows;
maintainers = with lib.maintainers; [
das_j
helsinki-Jo
];
mainProgram = "gawk";
};
})
|