1Building older GNU coreutils versions on newer systems
2======================================================
3
4Overview
5--------
6
7Some older GNU coreutils fail to build on newer GNU/Linux systems.
8
9This happens with Coreutils version 8.29 and earlier, on systems
10using GlibC version 2.28 or newer, Such as Debian 10, CentOS 8, Fedora 29.
11
12A typical error is:
13
14    $ wget https://ftp.gnu.org/gnu/coreutils/coreutils-7.6.tar.xz
15    $ tar -xf coreutils-7.6.tar.xz
16    $ cd coreutils-7.6
17    $ ./configure
18    $ make
19    [...]
20    freadahead.c: In function 'freadahead':
21    freadahead.c:83:3: error: #error "Please port gnulib freadahead.c to
22                              your platform! Look at the definition of fflush,
23                              fread, ungetc on your system, then report this
24                              to bug-gnulib."
25    [...]
26    make[4]: *** [Makefile:1700: freadahead.o] Error 1
27
28Other similar errors mention 'freadptr', 'freadseek','fseterr'.
29Older version (pre 7.2) mention 'tee','eaccess','futimens'.
30
31
32Details
33-------
34
35GLibC version 2.28 removed a non-standard header file (libio.h) and some
36internal symbols which were used by gnulib (a core component of GNU coreutils).
37
38These were announced as 'deprecated' in version 2.27 [1], and removed in
39version 2.28. Gnulib code was adjusted shortly after [2],
40but the code changes obviously can't be retroactively made to
41previously-released coreutils versions.
42
43[1] https://sourceware.org/ml/libc-announce/2018/msg00000.html
44[2] https://lists.gnu.org/r/bug-gnulib/2018-03/msg00000.html
45
46Older coreutils versions defined functions that were later picked-up
47by glibc ('tee','eaccess','futimens') resulting in conflicts.
48
49See the patches for the exact code changes.
50
51
52Supplied patches
53----------------
54
55The patch files in this directory change the source code of older
56coreutils versions, enabling successful build on newer systems.
57
58Some versions require different patches.
59
60Coreutils Versions             Patch file
615.0                            coreutils-5.0-on-glibc-2.28.diff
625.97 to 6.9                    coreutils-5.97-on-glibc-2.28.diff
636.10                           coreutils-6.10-on-glibc-2.28.diff
646.11                           coreutils-6.11-on-glibc-2.28.diff
656.12                           coreutils-6.12-on-glibc-2.28.diff
667.2  to 8.3                    coreutils-7.2-on-glibc-2.28.diff
678.4  to 8.12                   coreutils-8.4-on-glibc-2.28.diff
688.13 to 8.16                   coreutils-8.13-on-glibc-2.28.diff
698.17                           coreutils-8.17-on-glibc-2.28.diff
708.18 to 8.23                   coreutils-8.18-on-glibc-2.28.diff
718.24 to 8.29                   coreutils-8.24-on-glibc-2.28.diff
728.30 and newer                 [builds without patching]
73
74
75Manual build
76------------
77
781. Download the desired version from https://ftp.gnu.org/gnu/coreutils .
792. Patch using the corresponding patch file (see table above).
803. Configure the build, optionally adding the version number
81   to the executables, to ensure they will not conflict with existing
82   (newer) executables
834. Build with 'make'
845. Optionally install with 'sudo make install'
85
86Example:
87
88    wget https://ftp.gnu.org/gnu/coreutils/coreutils-5.97.tar.gz
89    tar -xf coreutils-5.97.tar.gz
90    cd coreutils-5.97
91    patch -p1 < ../coreutils-5.97-on-glibc-2.28.diff
92    ./configure --program-suffix=-5.97
93    make
94    sudo make install
95
96This will install the programs (e.g. 'sort', 'head) in
97/usr/local/bin, with "-5.97" added to each program name (e.g. 'sort-5.97',
98'head-5.97').
99
100NOTE:
101With very old versions (5.X and 6.X), running "./configure" will
102hang for a long time at the following step:
103   "checking for mktime..."
104But will eventually continue successfully.
105
106
107Automated build
108---------------
109
110The script 'build-older-versions.sh' automatically performs the manual steps
111listed above. The script installs each package in a separate directory:
112Programs in `$HOME/old-coreutils/coreutils-{VERSION}/bin`,
113manual pages in `$HOME/old-coreutils/coreutils-{VERSION}/share/man`,
114PDF manual in `$HOME/old-coreutils/coreutils-{VERSION}/share/doc`,
115INFO pages in `$HOME/old-coreutils/coreutils-{VERSION}/share/info`.
116It will also create symlinks to all version in a common directory
117`$HOME/old-coreutils/bin`.
118
119Example, running the following commands:
120
121    ./build-older-versions.sh 5.0
122    ./build-older-versions.sh 5.97
123    ./build-older-versions.sh 6.12
124    ./build-older-versions.sh 7.6
125
126Will download, patch, build and install the programs for GNU coreutils
127versions 5.0,5.97,6.12,7.6 in `$HOME/old-coreutils/bin` :
128
129    $ ls $HOME/old-coreutils/bin
130    [-5.97          id-5.0          sha224sum-7.6
131    [-6.12          id-5.97         sha256sum-6.12
132    [-7.6           id-6.12         sha256sum-7.6
133    base64-6.12     id-7.6          sha384sum-6.12
134    base64-7.6      install-5.0     sha384sum-7.6
135    basename-5.0    install-5.97    sha512sum-6.12
136    basename-5.97   install-6.12    sha512sum-7.6
137    basename-6.12   install-7.6     shred-5.0
138    basename-7.6    join-5.0        shred-5.97
139    cat-5.0         join-5.97       shred-6.12
140    cat-5.97        join-6.12       shred-7.6
141    cat-6.12        join-7.6        shuf-6.12
142    cat-7.6         kill-5.0        shuf-7.6
143    chcon-6.12      kill-5.97       sleep-5.0
144    chcon-7.6       kill-6.12       sleep-5.97
145    chgrp-5.0       kill-7.6        sleep-6.12
146    chgrp-5.97      link-5.0        sleep-7.6
147    chgrp-6.12      link-5.97       sort-5.0
148    chgrp-7.6       link-6.12       sort-5.97
149    chmod-5.0       link-7.6        sort-6.12
150    chmod-5.97      ln-5.0          sort-7.6
151    chmod-6.12      ln-5.97         split-5.0
152    chmod-7.6       ln-6.12         split-5.97
153    chown-5.0       ln-7.6          split-6.12
154    [... many more files ...]
155
156By adding the directory to your $PATH, older versions can be easily used:
157
158    export PATH=$PATH:$HOME/old-coreutils/bin
159    export MANPATH=$MANPATH:$HOME/old-coreutils/man
160
161
162
163
164
165========================================================================
166
167Copyright (C) 2019-2023 Free Software Foundation, Inc.
168
169Permission is granted to copy, distribute and/or modify this document
170under the terms of the GNU Free Documentation License, Version 1.3 or
171any later version published by the Free Software Foundation; with no
172Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
173Texts.  A copy of the license is included in the "GNU Free
174Documentation License" file as part of this distribution.
175