Anastasia Klimchuk submitted this change.

View Change

Approvals: Anastasia Klimchuk: Looks good to me, approved build bot (Jenkins): Verified Peter Marheine: Looks good to me, approved
Makefile,meson.build: Add support for Sphinx versions prior to 4.x

As of version 3.x, `sphinx-build` outputs man pages to "8" directory
instead of "man8" expected by Makefile and doc/meson.build. See:
https://github.com/sphinx-doc/sphinx/issues/7996
https://github.com/sphinx-doc/sphinx/issues/9217

Current solution is to rename "8" to "man8" after documentation build.
That enables successful build and installation, as well as dependency
tracking at build-system level, but not on `sphinx-build` own level
upon which `meson` build blindly relies.

Change-Id: I9cd280551a1ba4d17edb2e857d56f80431b61e1b
Signed-off-by: Anton Samsonov <devel@zxlab.ru>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/77778
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Reviewed-by: Peter Marheine <pmarheine@chromium.org>
---
M Makefile
M doc/meson.build
A doc/sphinx-wrapper.sh
3 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 7b1312d..a36e575 100644
--- a/Makefile
+++ b/Makefile
@@ -228,6 +228,10 @@
CONFIG_LIBPCI_CFLAGS := $(call dependency_cflags, libpci)
CONFIG_LIBPCI_LDFLAGS := $(call dependency_ldflags, libpci)

+CONFIG_SPHINXBUILD_VERSION :=
+CONFIG_SPHINXBUILD_MAJOR := 0
+
+
# Determine the destination OS, architecture and endian
# IMPORTANT: The following lines must be placed before TARGET_OS, ARCH or ENDIAN
# is ever used (of course), but should come after any lines setting CC because
@@ -958,6 +962,11 @@

OBJS = $(CHIP_OBJS) $(PROGRAMMER_OBJS) $(LIB_OBJS)

+ifeq ($(HAS_SPHINXBUILD), yes)
+override CONFIG_SPHINXBUILD_VERSION := $(shell $(SPHINXBUILD) --version | cut -d' ' -f2 )
+override CONFIG_SPHINXBUILD_MAJOR := $(shell echo "$(CONFIG_SPHINXBUILD_VERSION)" | cut -d'.' -f1 )
+endif
+

all: $(PROGRAM)$(EXEC_SUFFIX) $(call has_dependency, $(HAS_SPHINXBUILD), man8/$(PROGRAM).8)
ifeq ($(ARCH), x86)
@@ -1022,7 +1031,7 @@
echo "The following features are unavailable on your machine: $(UNSUPPORTED_FEATURES)" \
exit 1; \
fi
- @echo "Checking for program \"sphinx-build\": $(HAS_SPHINXBUILD)"
+ @echo "Checking for program \"sphinx-build\": $(HAS_SPHINXBUILD) $(CONFIG_SPHINXBUILD_VERSION)"

%.o: %.c | config
$(CC) -MMD $(CFLAGS) $(CPPFLAGS) $(FLASHROM_CFLAGS) $(FEATURE_FLAGS) -D'FLASHROM_VERSION=$(VERSION)' -o $@ -c $<
@@ -1035,8 +1044,18 @@
$(RANLIB) $@

man8/$(PROGRAM).8: doc/*
+# When using sphinx-build prior to version 4.x, man pages are output
+# to a directory named "8" instead of expected "man8". We fix that
+# by renaming "8" to "man8" and creating symlink "8" pointing to "man8".
@if [ "$(HAS_SPHINXBUILD)" = "yes" ]; then \
$(SPHINXBUILD) -Drelease=$(VERSION) -b man doc .; \
+ if [ "$(CONFIG_SPHINXBUILD_MAJOR)" -lt 4 ]; then \
+ if [ -d 8 -a ! -L 8 ]; then \
+ rm -rf man8; \
+ mv 8 man8; \
+ ln -s man8 8; \
+ fi \
+ fi \
else \
echo "$(SPHINXBUILD) not found. Can't build man-page"; \
exit 1; \
diff --git a/doc/meson.build b/doc/meson.build
index aca73d8..5bc57b9 100644
--- a/doc/meson.build
+++ b/doc/meson.build
@@ -1,5 +1,6 @@

sphinx = find_program('sphinx-build', native : true, required : get_option('man-pages').enabled() or get_option('documentation').enabled())
+sphinx_wrapper = meson.current_source_dir() / 'sphinx-wrapper.sh'

man_pages = [
'flashrom.8'
@@ -14,7 +15,7 @@

custom_target(
'man-pages',
- command : [sphinx, '-b', 'man', '-q', '-d', '@PRIVATE_DIR@', '-Drelease=' + flashrom_version,'@CURRENT_SOURCE_DIR@', '@OUTDIR@'],
+ command : [sphinx_wrapper, '@OUTDIR@', ' '.join(man_outputs), sphinx, '-b', 'man', '-q', '-d', '@PRIVATE_DIR@', '-Drelease=' + flashrom_version, '@CURRENT_SOURCE_DIR@', '@OUTDIR@'],
build_always_stale : true, # sphinx handles rebuilds
output : man_outputs,
install : true,
diff --git a/doc/sphinx-wrapper.sh b/doc/sphinx-wrapper.sh
new file mode 100755
index 0000000..5569638
--- /dev/null
+++ b/doc/sphinx-wrapper.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+OUTPUT_HOME="$1"
+MAN_OUTPUTS="$2"
+SPHINXBUILD="$3"
+shift 3
+
+"${SPHINXBUILD}" "$@" || exit $?
+
+SPHINXBUILD_MAJOR="$("${SPHINXBUILD}" --version | cut -d' ' -f2 | cut -d'.' -f1)"
+if [ "${SPHINXBUILD_MAJOR}" -ge 4 ]; then
+ exit 0
+fi
+
+# sphinx-build 3.x outputs man pages to "8" directory instead of expected "man8".
+# The following block checks for "man8" (and other output paths in ${MAN_OUTPUTS})
+# and, if that is missing, but "8" dir exists instead, it renames "8" to "man8"
+# and creates a symlink named "8" that points to "man8", so that anyone is happy
+# during the rest of current build and subsequent builds as well.
+
+for MAN_OUTPUT in ${MAN_OUTPUTS}; do
+ PATH_TARGET="${OUTPUT_HOME}/${MAN_OUTPUT}"
+ PATH_ACTUAL="${OUTPUT_HOME}/${MAN_OUTPUT#man}"
+ if [ -d "${PATH_ACTUAL}" -a ! -L "${PATH_ACTUAL}" ]; then
+ rm -rf "${PATH_TARGET}"
+ mv "${PATH_ACTUAL}" "${PATH_TARGET}"
+ ln -s "${MAN_OUTPUT}" "${PATH_ACTUAL}"
+ fi
+done

To view, visit change 77778. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: main
Gerrit-Change-Id: I9cd280551a1ba4d17edb2e857d56f80431b61e1b
Gerrit-Change-Number: 77778
Gerrit-PatchSet: 8
Gerrit-Owner: Anton Samsonov <devel@zxlab.ru>
Gerrit-Reviewer: Anastasia Klimchuk <aklm@chromium.org>
Gerrit-Reviewer: Peter Marheine <pmarheine@chromium.org>
Gerrit-Reviewer: Thomas Heijligen <src@posteo.de>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Anton Samsonov <avscomputing@gmail.com>
Gerrit-CC: Stefan Reinauer <stefan.reinauer@coreboot.org>
Gerrit-MessageType: merged