On 2026-07-17 06:59, Pádraig Brady wrote:
Maybe you could say `du -Ak` is not portable enough.

Better yet, use du -h --apparent-size but fall back on wc if GNU du is not in use. That way, we can normally say something like "9.1 MiB" rather than like "9319 K bytes", which was harder to read and was ambiguous anyway. I installed James's patch, followed by the attached.
From 74ea50427f57ef7dbc1ef78d1972e39251cbbea9 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Fri, 17 Jul 2026 10:50:24 -0700
Subject: [PATCH] gendocs: output human-readable file sizes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* build-aux/gendocs.sh (calcsize): Output human-readable file
size, rather than always size in KiB mislabled as "K bytes".
But fall back on a plain byte count if GNU du is not in use.
(time-stamp-time-zone): Now "UTC0" so scriptversion does not decrease.
* doc/gendocs_template, doc/gendocs_template_min:
Don’t assume sizes are in KiB (the old values were mislabeled anyway).
Be more consistent about file type labels.
---
 ChangeLog                | 11 +++++++++++
 build-aux/gendocs.sh     | 32 +++++++++++---------------------
 doc/gendocs_template     | 38 +++++++++++++++++++-------------------
 doc/gendocs_template_min | 38 +++++++++++++++++++-------------------
 4 files changed, 60 insertions(+), 59 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0e5b2d74ff..d1ea69185f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2026-07-17  Paul Eggert  <[email protected]>
+
+	gendocs: output human-readable file sizes
+	* build-aux/gendocs.sh (calcsize): Output human-readable file
+	size, rather than always size in KiB mislabled as "K bytes".
+	But fall back on a plain byte count if GNU du is not in use.
+	(time-stamp-time-zone): Now "UTC0" so scriptversion does not decrease.
+	* doc/gendocs_template, doc/gendocs_template_min:
+	Don’t assume sizes are in KiB (the old values were mislabeled anyway).
+	Be more consistent about file type labels.
+
 2026-07-16  Pádraig Brady  <[email protected]>
 
 	physmem: fix typo causing configure failure
diff --git a/build-aux/gendocs.sh b/build-aux/gendocs.sh
index 2b3373ecf7..1b03163345 100755
--- a/build-aux/gendocs.sh
+++ b/build-aux/gendocs.sh
@@ -2,7 +2,7 @@
 # gendocs.sh -- generate a GNU manual in many formats.  This script is
 #   mentioned in maintain.texi.  See the help message below for usage details.
 
-scriptversion=2026-07-17.13
+scriptversion=2026-07-17.17
 
 # Copyright 2003-2026 Free Software Foundation, Inc.
 #
@@ -229,25 +229,13 @@ if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
   exit 1
 fi
 
-# Function to return size of $1 in something resembling kilobytes.
-# We don't use `ls -s` because that can be longer or shorter than
-# the real length of the data (because the file system compresses
-# the file, for example).  We don't use `du -k --apparent-size`
-# because we do not want to assume `du` supports that option.
-#
-# Here's an example of different `ls -s` results on different file
-# systems:
-#
-# $ cp /var/tmp/findutils-manual/find.html find.html
-# $ ls -lsh /var/tmp/findutils-manual/find.html find.html
-# 221K -rw-rw-r-- 1 james james 582K Jul 17 13:01 find.html
-# 584K -rw-rw-r-- 1 james james 582K Jul 17 12:54 /var/tmp/findutils-manual/find.html
+# Output $1's size like "7.1 MiB" if du is GNU, "7425707 bytes" otherwise.
 calcsize()
 {
-  # Determine size in bytes
-  set `env LC_ALL=C wc -c < "$1"`
-  # Emit the size in KiB, rounding up.
-  expr '(' "$1" + 1023 ')' / 1024
+  duout=`LC_ALL=C du -h --apparent-size -- "$1" 2>/dev/null` ||
+    duout=`LC_ALL=C wc -c <"$1"`
+  set x $duout
+  printf '%s\n' "$2" | sed 's/[^0-9.].*/ &iB/; s/[0-9]$/& bytes/'
 }
 
 # copy_images OUTDIR HTML-FILE...
@@ -364,7 +352,8 @@ html_split()
       ln -s ${PACKAGE}.html index.html
     tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html
   )
-  eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"`
+  size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"`
+  eval html_$1_tgz_size=\$size
   rm -f "$outdir"/html_$1/*.html
   mkdir -p "$outdir/html_$1/"
   mv ${split_html_dir}/*.html "$outdir/html_$1/"
@@ -403,8 +392,8 @@ if test -z "$use_texi2html"; then
     cd $split_html_dir || exit 1
     tar -czf "$abs_outdir/$PACKAGE.html_$split.tar.gz" -- *
   )
-  eval \
-    html_${split}_tgz_size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"`
+  size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"`
+  eval html_${split}_tgz_size=\$size
   rm -rf "$outdir/html_$split/"
   mv $split_html_dir "$outdir/html_$split/"
   du -s "$outdir/html_$split/"
@@ -573,5 +562,6 @@ echo "Done, see $outdir/ subdirectory for new files."
 # eval: (add-hook 'before-save-hook 'time-stamp nil t)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%Y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "$"
 # End:
diff --git a/doc/gendocs_template b/doc/gendocs_template
index 327d5f039f..7c35e9b71d 100644
--- a/doc/gendocs_template
+++ b/doc/gendocs_template
@@ -21,7 +21,7 @@ without any warranty.
 
 <ul>
 <li><a href="%%PACKAGE%%.html">HTML
-    (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
+    (%%HTML_MONO_SIZE%%)</a> - entirely on one web page.</li>
 %%IF HTML_NODE%%
 <li><a href="html_node/index.html">HTML</a> - with one web page per
     node.</li>
@@ -34,36 +34,36 @@ without any warranty.
 <li><a href="html_chapter/index.html">HTML</a> - with one web page per
     chapter.</li>
 %%ENDIF HTML_CHAPTER%%
-<li><a href="%%PACKAGE%%.html.gz">HTML compressed
-    (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+<li><a href="%%PACKAGE%%.html.gz">HTML gzipped
+    (%%HTML_MONO_GZ_SIZE%%)</a> - entirely on
     one web page.</li>
 %%IF HTML_NODE%%
-<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
-    (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML tar file gzipped
+    (%%HTML_NODE_TGZ_SIZE%%)</a> -
     with one web page per node.</li>
 %%ENDIF HTML_NODE%%
 %%IF HTML_SECTION%%
-<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
-    (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
+<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML tar file gzipped
+    (%%HTML_SECTION_TGZ_SIZE%%)</a> -
     with one web page per section.</li>
 %%ENDIF HTML_SECTION%%
 %%IF HTML_CHAPTER%%
-<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
-    (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
+<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML tar file gzipped
+    (%%HTML_CHAPTER_TGZ_SIZE%%)</a> -
     with one web page per chapter.</li>
 %%ENDIF HTML_CHAPTER%%
-<li><a href="%%PACKAGE%%.info.tar.gz">Info document
-    (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
+<li><a href="%%PACKAGE%%.info.tar.gz">Info document tar file gzipped
+    (%%INFO_TGZ_SIZE%%)</a>.</li>
 <li><a href="%%PACKAGE%%.txt">ASCII text
-    (%%ASCII_SIZE%%K bytes)</a>.</li>
-<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
-    (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
-<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
-    (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
+    (%%ASCII_SIZE%%)</a>.</li>
+<li><a href="%%PACKAGE%%.txt.gz">ASCII text gzipped
+    (%%ASCII_GZ_SIZE%%)</a>.</li>
+<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file gzipped
+    (%%DVI_GZ_SIZE%%)</a>.</li>
 <li><a href="%%PACKAGE%%.pdf">PDF file
-    (%%PDF_SIZE%%K bytes)</a>.</li>
-<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
-    (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
+    (%%PDF_SIZE%%)</a>.</li>
+<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source tar file gzipped
+    (%%TEXI_TGZ_SIZE%%).</a></li>
 </ul>
 
 <p>You can <a href="https://shop.fsf.org/";>buy printed copies of
diff --git a/doc/gendocs_template_min b/doc/gendocs_template_min
index db46f89a8c..11a304a212 100644
--- a/doc/gendocs_template_min
+++ b/doc/gendocs_template_min
@@ -36,7 +36,7 @@ without any warranty.
 
 <ul>
 <li><a href="%%PACKAGE%%.html">HTML
-    (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
+    (%%HTML_MONO_SIZE%%)</a> - entirely on one web page.</li>
 <li><a href="html_node/index.html">HTML</a> - with one web page per
     node.</li>
 %%IF HTML_SECTION%%
@@ -47,34 +47,34 @@ without any warranty.
 <li><a href="html_chapter/index.html">HTML</a> - with one web page per
     chapter.</li>
 %%ENDIF HTML_CHAPTER%%
-<li><a href="%%PACKAGE%%.html.gz">HTML compressed
-    (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+<li><a href="%%PACKAGE%%.html.gz">HTML gzipped
+    (%%HTML_MONO_GZ_SIZE%%)</a> - entirely on
     one web page.</li>
-<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
-    (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML tar file gzipped
+    (%%HTML_NODE_TGZ_SIZE%%)</a> -
     with one web page per node.</li>
 %%IF HTML_SECTION%%
-<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
-    (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
+<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML tar file gzipped
+    (%%HTML_SECTION_TGZ_SIZE%%)</a> -
     with one web page per section.</li>
 %%ENDIF HTML_SECTION%%
 %%IF HTML_CHAPTER%%
-<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
-    (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
+<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML tar file gzipped
+    (%%HTML_CHAPTER_TGZ_SIZE%%)</a> -
     with one web page per chapter.</li>
 %%ENDIF HTML_CHAPTER%%
-<li><a href="%%PACKAGE%%.info.tar.gz">Info document
-    (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
+<li><a href="%%PACKAGE%%.info.tar.gz">Info document tar file gzipped
+    (%%INFO_TGZ_SIZE%%)</a>.</li>
 <li><a href="%%PACKAGE%%.txt">ASCII text
-    (%%ASCII_SIZE%%K bytes)</a>.</li>
-<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
-    (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
-<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
-    (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
+    (%%ASCII_SIZE%%)</a>.</li>
+<li><a href="%%PACKAGE%%.txt.gz">ASCII text gzipped
+    (%%ASCII_GZ_SIZE%%)</a>.</li>
+<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file gzipped
+    (%%DVI_GZ_SIZE%%)</a>.</li>
 <li><a href="%%PACKAGE%%.pdf">PDF file
-    (%%PDF_SIZE%%K bytes)</a>.</li>
-<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
-    (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
+    (%%PDF_SIZE%%)</a>.</li>
+<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source tar file gzipped
+    (%%TEXI_TGZ_SIZE%%).</a></li>
 </ul>
 
 <p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
-- 
2.53.0

Reply via email to