gnu: mandoc: Support zstd-compressed man pages.

Since #68242 Guix uses zstd compression for man pages.  Unfortunately,
upstream mandoc only supports gzip compressed man pages.  Luckily, zstd
provides a wrapper library which easily allows adapting software using
zlib to zstd compression.  This patch uses this wrapper library in
conjunction with mandoc to add support for zstd compression to it,
thereby allowing Guix man pages to be viewed with mandoc again.

Without this patch, mandoc is essentially defunct on Guix.

* gnu/packages/man.scm (mandoc): Support zstd compression.
* gnu/local.mk: Add new patch.
* gnu/packages/patches/mandoc-support-zstd-compression.patch: New file.

Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Change-Id: I49a6b9f81309aa1b9f0e5d19b1813dbac13cf968
This commit is contained in:
Sören Tempel 2025-01-28 16:55:48 +01:00 committed by Maxim Cournoyer
parent 9a17331bc3
commit 4176f6c52f
No known key found for this signature in database
GPG key ID: 1260E46482E63562
3 changed files with 97 additions and 18 deletions

View file

@ -1812,6 +1812,7 @@ dist_patch_DATA = \
%D%/packages/patches/lxc-no-static-bin.patch \
%D%/packages/patches/mactelnet-remove-init.patch \
%D%/packages/patches/mailutils-variable-lookup.patch \
%D%/packages/patches/mandoc-support-zstd-compression.patch \
%D%/packages/patches/make-impure-dirs.patch \
%D%/packages/patches/mariadb-rocksdb-atomic-linking.patch \
%D%/packages/patches/mathjax-disable-webpack.patch \

View file

@ -37,6 +37,7 @@
#:use-module (guix build-system gnu)
#:use-module (guix build-system ruby)
#:use-module (guix utils)
#:use-module (gnu packages)
#:use-module (gnu packages base)
#:use-module (gnu packages compression)
#:use-module (gnu packages dbm)
@ -273,30 +274,47 @@ pages into HTML format.")
(method url-fetch)
(uri (string-append "https://mandoc.bsd.lv/snapshots/mandoc-"
version ".tar.gz"))
(patches (search-patches "mandoc-support-zstd-compression.patch"))
(sha256
(base32
"174x2x9ws47b14lm339j6rzm7mxy1j3qhh484khscw0yy1qdbw4b"))))
(build-system gnu-build-system)
(arguments
`(#:test-target "regress"
#:phases (modify-phases %standard-phases
(add-before 'configure 'set-prefix
(lambda* (#:key outputs #:allow-other-keys)
(substitute* "configure"
(("^CC=.*")
(string-append "CC=" ,(cc-for-target) "\n"))
(("^DEFCFLAGS=\\\\\"")
"DEFCFLAGS=\"-O2 ")
(("^UTF8_LOCALE=.*") ;used for tests
"UTF8_LOCALE=en_US.UTF-8\n")
(("^MANPATH_(BASE|DEFAULT)=.*" _ which)
(string-append "MANPATH_" which "="
"/run/current-system/profile/share/man\n"))
(("^PREFIX=.*")
(string-append "PREFIX=" (assoc-ref outputs "out")
"\n"))))))))
(list
#:test-target "regress"
#:make-flags
#~(list "VPATH=./zstd-src/zlibWrapper"
(string-join
(list "CFLAGS=-DZWRAP_USE_ZSTD=1"
"-I./zstd-src/zlibWrapper")
" "))
#:phases
#~(modify-phases %standard-phases
(add-after 'unpack 'unpack-zstd
(lambda _
(mkdir "zstd-src")
(invoke "tar" "--strip-components=1" "-C"
"zstd-src" "-xf" #$(package-source zstd))))
(add-before 'configure 'set-prefix
(lambda* (#:key outputs #:allow-other-keys)
(substitute*
"configure"
(("^CC=.*")
(string-append "CC=" #$(cc-for-target) "\n"))
(("^DEFCFLAGS=\\\\\"")
"DEFCFLAGS=\"-O2 ")
(("^UTF8_LOCALE=.*") ;used for tests
"UTF8_LOCALE=en_US.UTF-8\n")
(("^MANPATH_(BASE|DEFAULT)=.*" _ which)
(string-append
"MANPATH_" which "="
"/run/current-system/profile/share/man\n"))
(("^PREFIX=.*")
(string-append "PREFIX="
(assoc-ref outputs "out")
"\n"))))))))
(native-inputs (list (libc-utf8-locales-for-target) perl)) ;used to run tests
(inputs (list zlib))
(inputs (list zlib (list zstd "lib")))
(native-search-paths
(list (search-path-specification
(variable "MANPATH")

View file

@ -0,0 +1,60 @@
mandoc upstream does not support zstd compression. However, Guix uses zstd
compression for its man pages, therefore — without support for this
compression method — mandoc would be quite useless. Hence, this patchset uses
zlibWrapper from the zstd project to add zstd compression support to mandoc.
Upstream-status: https://inbox.vuxu.org/mandoc-discuss/Z5i0H+XrKVrZqAXB@asta-kit.de/T/#t
diff -upr mandoc-1.14.6.orig/Makefile mandoc-1.14.6/Makefile
--- mandoc-1.14.6.orig/Makefile 2025-01-11 16:20:31.511129163 +0100
+++ mandoc-1.14.6/Makefile 2025-01-11 19:16:35.924788821 +0100
@@ -251,7 +251,12 @@ LIBMANDOC_OBJS = $(LIBMAN_OBJS) \
msec.o \
preconv.o \
read.o \
- tag.o
+ tag.o \
+ zstd_zlibwrapper.o \
+ gzclose.o \
+ gzlib.o \
+ gzread.o \
+ gzwrite.o
ALL_COBJS = compat_err.o \
compat_fts.o \
Only in mandoc-1.14.6: Makefile.orig
diff -upr mandoc-1.14.6.orig/configure mandoc-1.14.6/configure
--- mandoc-1.14.6.orig/configure 2025-01-11 16:20:31.511129163 +0100
+++ mandoc-1.14.6/configure 2025-01-11 19:16:35.924788821 +0100
@@ -430,7 +430,7 @@ fi
[ "${FATAL}" -eq 0 ] || exit 1
# --- LDADD ---
-LDADD="${LDADD} ${LD_NANOSLEEP} ${LD_RECVMSG} ${LD_OHASH} -lz"
+LDADD="${LDADD} ${LD_NANOSLEEP} ${LD_RECVMSG} ${LD_OHASH} -lz -lzstd"
echo "selected LDADD=\"${LDADD}\"" 1>&2
echo "selected LDADD=\"${LDADD}\"" 1>&3
echo 1>&3
Only in mandoc-1.14.6: configure.orig
diff -upr mandoc-1.14.6.orig/read.c mandoc-1.14.6/read.c
--- mandoc-1.14.6.orig/read.c 2025-01-11 16:35:03.825441715 +0100
+++ mandoc-1.14.6/read.c 2025-01-11 19:16:35.924788821 +0100
@@ -37,7 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <zlib.h>
+#include <zstd_zlibwrapper.h>
#include "mandoc_aux.h"
#include "mandoc.h"
@@ -627,7 +627,7 @@ mparse_open(struct mparse *curp, const char *file)
int fd, save_errno;
cp = strrchr(file, '.');
- curp->gzip = (cp != NULL && ! strcmp(cp + 1, "gz"));
+ curp->gzip = (cp != NULL && (! strcmp(cp + 1, "gz") || ! strcmp(cp + 1, "zst")));
/* First try to use the filename as it is. */
Only in mandoc-1.14.6: read.c.orig