On Sun, Sep 21, 2025 at 5:20 PM Mark Wielaard <[email protected]> wrote:
>
> Hi Aarsen,
>
> Added Jonathan to CC to get his opinion on the libstdc++ part of the
> documentation (re)generation.
>
> On Mon, Sep 08, 2025 at 06:07:48PM +0200, Arsen Arsenović wrote:
> > Mark Wielaard <[email protected]> writes:
> >
> > > I think it is a good thing to make it easier for users to regenerate
> > > the documentation locally for offline usage. And it would be helpful
> > > to check documentation generation work by using is as a snapshot
> > > builder and/or an Action that could be run on a merge request in the
> > > forge.
> > >
> > > We don't have to change the workflow to generate the online docs, it
> > > could still be done through a cron job. But if we can use the same
> > > script to generate them also locally, through a snapshots builder and
> > > maybe a merge request Action on the forge that would be great. Then
> > > when that works, we can decide whether to change the actual mechanism.
> >
> > To my understanding, no automation exists for release documentation.
> > This is what I mean.
>
> It would be good to at least document what the release managers do to
> create the release documentation. I assumed they ran
> maintainer-scripts/update_web_docs_git and
> maintainer-scripts/update_web_docs_libstdcxx_git after a release to
> create the version specific onlinedocs.
>
> If they would be able to use this new script instead that would be
> good.

Never change a running system ;)

maintainer-scripts/update_web_docs_libstdcxx_git isn't run by us but
by Jonathan as it cannot be run on sourceware.

An improvement would be to have documentation build (and its requirements)
containerized somehow.

> > > I used the script to create a gcc docs snapshot builder:
> > > https://snapshots.sourceware.org/gcc/docs/
> > > https://builder.sourceware.org/buildbot/#/builders/gcc-snapshots
>
> This seems to be working nicely. It turned RED only when there really
> was an issue with generating the (pdf) docs (thanks for fixing
> that!). I have added a failure reporter so the patch author gets an
> email (CCed gcc-testresults) about the docs being unable to
> (re)generate.
>
> > > I had to add the following packages to the fedora-latest container:
> > >
> > >   mandoc docbook5-style-xsl doxygen graphviz dblatex libxml2 libxslt
> > >   texlive-latex texlive-makeindex texinfo texinfo-tex python3-sphinx
> > >   groff-base groff-perl texlive-hanging texlive-adjustbox
> > >   texlive-stackengine texlive-tocloft texlive-newunicodechar
> > >
> > > Might be good to document that somewhere. Also not everything is
> > > checked for so when you are missing some packages things might just
> > > break half-way through.
> >
> > Yes, the checks are mostly what the existing scripts were already
> > checking, extended slightly, and aren't comprehensive.
> >
> > > I am not sure what to do about the CSS. It would be way nicer if that
> > > was also embedded in the source instead of relying on an external URL
> > > or repository.
> > >
> > > Also it would be nice if there was a little top-level index.html.
> > > Maybe a snippet like at the end of
> > > https://gcc.gnu.org/onlinedocs/index.html (Current development)?
> >
> > That could be added.  Currently, there isn't really an equivalent (see
> > https://gcc.gnu.org/onlinedocs/gcc-15.2.0/ for instance)
>
> O, interesting. So how/what generates the indexes on
> https://gcc.gnu.org/onlinedocs/index.html ? I think it would not be a
> bad idea to have the same create an index just for the explicit
> version as index.html inside the versioned docs dir.
>
> > > Some comments on the actual script below.
> > >
> > >>  maintainer-scripts/gen_gcc_docs.sh | 391 +++++++++++++++++++++++++++++
> > >>  1 file changed, 391 insertions(+)
> > >>  create mode 100755 maintainer-scripts/gen_gcc_docs.sh
> > >>
> > >> diff --git a/maintainer-scripts/gen_gcc_docs.sh 
> > >> b/maintainer-scripts/gen_gcc_docs.sh
> > >> new file mode 100755
> > >> index 000000000000..c10733d21da2
> > >> --- /dev/null
> > >> +++ b/maintainer-scripts/gen_gcc_docs.sh
> > >> @@ -0,0 +1,391 @@
> > >> +#!/usr/bin/bash
> > >> +#
> > >> +# Copyright (C) 2025 Free Software Foundation, Inc.
> > >> +#
> > >> +# This script is free software; you can redistribute it and/or modify
> > >> +# it under the terms of the GNU General Public License as published by
> > >> +# the Free Software Foundation; either version 3, or (at your option)
> > >> +# any later version.
> > >> +
> > >> +# Usage: gen_gcc_docs.sh [srcdir] [outdir]
> > >> +#
> > >> +# Generates and outputs GCC documentation to [outdir].
> > >> +#
> > >> +# Impacted by a few environment variables:
> > >> +# - BUGURL :: The bug URL to insert into the manuals.
> > >> +# - CSS :: URL to pass as the CSS reference in HTML manuals.
> > >> +# - BRANCH :: Documentation branch to build.  Defaults to git default.
> > >> +# - TEXI2DVI, TEXI2PDF, MAKEINFO, SPHINXBUILD :: Names of the 
> > >> respective tools.
> > >> +
> > >> +# Based on update_web_docs_git and generate_libstdcxx_web_docs.
> > >> +
> > >> +MANUALS=(
> > >> +  cpp
> > >> +  cppinternals
> > >> +  fastjar
> > >
> > > fastjar brings back memories, but I believe we haven't shipped it in
> > > 15 years.
> > >
> > >> +  gcc
> > >> +  gccgo
> > >> +  gccint
> > >> +  gcj
> > >
> > > Likewise for gcj
> > >
> > >> +  gdc
> > >> +  gfortran
> > >> +  gfc-internals
> > >> +  gm2
> > >> +  gnat_ugn
> > >> +  gnat-style
> > >> +  gnat_rm
> > >> +  libgomp
> > >> +  libitm
> > >> +  libquadmath
> > >> +  libiberty
> > >> +  porting
> > >
> > > Isn't porting part of libstdc++ now?
> > >
> > >> +)
> > >
> > > So jit, libstdc++ and gcobol are their own thing?
> >
> > Yes, they aren't Texinfo.
> >
> > > Why is libffi not included?
> > >
> > >> +die() {
> > >> +  echo "fatal error ($?)${*+: }$*" >&2
> > >> +  exit 1
> > >> +}
> > >> +
> > >> +v() {
> > >> +  echo "+ $*" >&2
> > >> +  "$@"
> > >> +}
> > >> +export -f v die
> > >> +
> > >> +# Check arguments.
> > >> +[[ $1 ]] \
> > >> +  || die "Please specify the source directory as the first argument"
> > >> +srcdir="$1"
> > >> +if ! [[ $srcdir = /* ]]; then
> > >> +  srcdir="$(pwd)/${srcdir}"
> > >> +fi
> > >> +
> > >> +[[ $2 ]] \
> > >> +  || die "Please specify the output directory as the directory argument"
> > >> +outdir="$2"
> > >> +if ! [[ $outdir = /* ]]; then
> > >> +  outdir="$(pwd)/${outdir}"
> > >> +fi
> > >
> > > OK, makes them required and absolute paths.
> > >
> > >> +## Find build tools.
> > >> +# The gccadmin home directory contains a special build of Texinfo that 
> > >> has
> > >> +# support for copyable anchors.  Find it.
> > >> +makeinfo_git=/home/gccadmin/texinfo/install-git/bin/
> > >> +if [ -x "${makeinfo_git}"/makeinfo ]; then
> > >> +  : "${MAKEINFO:=${makeinfo_git}/makeinfo}"
> > >> +  : "${TEXI2DVI:=${makeinfo_git}/texi2dvi}"
> > >> +  : "${TEXI2PDF:=${makeinfo_git}/texi2pdf}"
> > >> +else
> > >> +  : "${MAKEINFO:=makeinfo}"
> > >> +  : "${TEXI2DVI:=texi2dvi}"
> > >> +  : "${TEXI2PDF:=texi2pdf}"
> > >> +fi
> > >> +
> > >> +py_venv_bin=/home/gccadmin/venv/bin
> > >> +# Similarly, it also has a virtualenv that contains a more up-to-date 
> > >> Sphinx.
> > >> +if [ -x "${py_venv_bin}"/sphinx-build ]; then
> > >> +  : "${SPHINXBUILD:=${py_venv_bin}/sphinx-build}"
> > >> +else
> > >> +  : "${SPHINXBUILD:=sphinx-build}"
> > >> +fi
> > >> +export MAKEINFO TEXI2DVI TEXI2PDF SPHINXBUILD
> > >
> > > Do we really need that special case hardcoded /home/gccadmin/...?
> > > Can't we just require those bin dirst are just prepended to PATH
> > > before invoking the script or that they set the special case TOOL env
> > > variables?
> >
> > We can, the intention was to make it simpler to run on the GCC admin
> > machine (to replace the current scripts), without making it rely on that 
> > behaviour.
>
> OK, we can just set the PATH in the (cron) case then.
>
> > >> +# Check for the programs.
> > >> +for i in \
> > >> +  doxygen dot dblatex pdflatex makeindex "${MAKEINFO}" "${TEXI2DVI}" \
> > >> +          "${TEXI2PDF}" "${SPHINXBUILD}"; do
> > >> +  echo >&2 -n "Checking for ${i##*/}... "
> > >> +  type >&2 -P "$i" && continue
> > >> +  echo >&2 "not found"
> > >> +  exit 1
> > >> +done
> > >
> > > Maybe at least add mandoc? xsltproc? groff? check that groff can
> > > generate PDF? That all required latex packages are installed?
> >
> > I'll go over the list of packages you listed above and add checks.
>
> Thanks.
>
> > >> +# Set sane defaults.
> > >> +: "${BUGURL:=https://gcc.gnu.org/bugs/}";
> > >> +: "${CSS:=/texinfo-manuals.css}" # 
> > >> https://gcc.gnu.org/texinfo-manuals.css
> > >> +export CSS BUGURL
> > >
> > > Maybe include that css in the sources so it is standalone by default?
> >
> > Maybe, that could work if there's no CSS set.
>
> Or maybe it could be a css file relative to the root of the docs dir?
>
> > >> +v mkdir -p "${outdir}" || die "Failed to create the output directory"
> > >> +
> > >> +workdir="$(mktemp -d)" \
> > >> +  || die "Failed to get new work directory"
> > >> +readonly workdir
> > >> +trap 'cd /; rm -rf "$workdir"' EXIT
> > >> +cd "$workdir" || die "Failed to enter $workdir"
> > >> +
> > >> +if [[ -z ${BRANCH} ]]; then
> > >> +  git clone -q "$srcdir" gccsrc
> > >> +else
> > >> +  git clone -b "${BRANCH}" -q "$srcdir" gccsrc
> > >> +fi || die "Clone failed"
> > >
> > > Not a fan of the cd /; rm -rf ... but lets pretend that works out ok.
> >
> > Yes, that's fair, but it's impossible for 'rm' not to get a positional
> > argument due to the quotes, so this invocation is, in the worst case,
> > equivalent to `rm -rf ''`.  Unfortunately, we can't really avoid cd-ing
> > somewhere, since the work directory needs to be freed up for deleting.
>
> Maybe cd /tmp ?
>
> > > So the current script depends on the srcdir being a full gcc git repo
> > > from which it can checkout a BRANCH and then build the docs for that
> > > branch. I think it might make sense to have the script on each branch
> > > for that ranch, so you would just build the docs for the source/branch
> > > you have. Since different branches might have different sets of
> > > manuals.
> >
> > I initially wanted this to function across versions (since the old
> > scripts did that also, and we'd need to run them on gccadmin, which uses
> > copies from trunk AFAIU), but in general I do agree that an approach
> > that makes each version track its own tweaks and works more strictly is
> > better.  If we can do that on gccadmin, I'd prefer that too.
>
> Maybe we can make it work on current workdir without an argument and
> against a named git ref with an argument? It would make it possible to
> run the script as test for changes you haven't committed yet (or on
> your local branch).
>
> > >> +######## BUILD libstdc++ DOCS
> > >> +# Before we wipe out everything but JIT and Texinfo documentation, we 
> > >> need to
> > >> +# generate the libstdc++ manual.
> > >> +mkdir gccbld \
> > >> +  || die "Couldn't make build directory"
> > >> +(
> > >> +  set -e
> > >> +  cd gccbld
> > >> +
> > >> +  disabled_libs=()
> > >> +  for dir in ../gccsrc/lib*; do
> > >> +    dir="${dir##*/}"
> > >> +    [[ -d $dir ]] || continue
> > >> +    [[ $dir == libstdc++-v3 ]] && continue
> > >> +    disabled_libs+=( --disable-"${dir}" )
> > >> +  done
> > >> +
> > >> +  v ../gccsrc/configure \
> > >> +    --enable-languages=c,c++ \
> > >> +    --disable-gcc \
> > >> +    --disable-multilib \
> > >> +    "${disabled_libs[@]}" \
> > >> +    --docdir=/docs \
> > >> +    || die "Failed to configure GCC for libstdc++"
> > >> +  v make configure-target-libstdc++-v3 || die "Failed to configure 
> > >> libstdc++"
> > >> +
> > >> +  # Pick out the target directory.
> > >> +  target=  # Suppress warnings from shellcheck.
> > >> +  eval "$(grep '^target=' config.log)"
> > >> +  v make -C "${target}"/libstdc++-v3 \
> > >> +    doc-install-{html,xml,pdf} \
> > >> +    DESTDIR="$(pwd)"/_dest \
> > >> +    || die "Failed to compile libstdc++ docs"
> > >> +  set +x
> > >
> > > Doesn't that make things very verbose?
> >
> > Hm, yes, this slipped by, I didn't intend to leave it.
> >
> > >> +  cd _dest/docs
> > >> +  v mkdir libstdc++
> > >> +  for which in api manual; do
> > >> +    echo "Prepping libstdc++-${which}..."
> > >> +    if [[ -f libstdc++-"${which}"-single.xml ]]; then
> > >> +      # Only needed for GCC 4.7.x
> > >> +      v mv libstdc++-"${which}"{-single.xml,} || die
> > >> +    fi
> > >
> > > Do we really want to support 4.7.x in this (modern) script?
> > > See also the BRANCH comment above.
> >
> > Same answer as above.
> >
> > >> +    v gzip --best libstdc++-"${which}".xml || die
> > >> +    v gzip --best libstdc++-"${which}".pdf || die
> > >> +
> > >> +    v mv libstdc++-"${which}"{.html,-html} || die
> > >> +    v tar czf libstdc++-"${which}"-html.tar.gz 
> > >> libstdc++-"${which}"-html \
> > >> +      || die
> > >> +    mv libstdc++-"${which}"-html libstdc++/"${which}"
> > >> +
> > >> +    # Install the results.
> > >> +    v cp libstdc++-"${which}".xml.gz "${outdir}" || die
> > >> +    v cp libstdc++-"${which}".pdf.gz "${outdir}" || die
> > >> +    v cp libstdc++-"${which}"-html.tar.gz "${outdir}"
> > >> +  done
> > >> +
> > >> +  v cp -Ta libstdc++ "${outdir}"/libstdc++ || die
> > >> +) || die "Failed to generate libstdc++ docs"
> > >> +
> > >> +v rm -rf gccbld || die
> > >> +
> > >> +######## PREPARE SOURCES
> > >> +
> > >> +# Remove all unwanted files.  This is needed to avoid packaging all the
> > >> +# sources instead of only documentation sources.
> > >> +# Note that we have to preserve gcc/jit/docs since the jit docs are
> > >> +# not .texi files (Makefile, .rst and .png), and the jit docs use
> > >> +# include directives to pull in content from jit/jit-common.h and
> > >> +# jit/notes.txt, and parts of the jit.db testsuite, so we have to 
> > >> preserve
> > >> +# those also.
> > >> +find gccsrc -type f \( -name '*.texi' \
> > >> +     -o -path gccsrc/gcc/doc/install.texi2html \
> > >> +     -o -path gccsrc/gcc/doc/include/texinfo.tex \
> > >> +     -o -path gccsrc/gcc/BASE-VER \
> > >> +     -o -path gccsrc/gcc/DEV-PHASE \
> > >> +     -o -path "gccsrc/gcc/cobol/gcobol.[13]" \
> > >> +     -o -path "gccsrc/gcc/ada/doc/gnat_ugn/*.png" \
> > >> +     -o -path "gccsrc/gcc/jit/docs/*" \
> > >> +     -o -path "gccsrc/gcc/jit/jit-common.h" \
> > >> +     -o -path "gccsrc/gcc/jit/notes.txt" \
> > >> +     -o -path "gccsrc/gcc/doc/libgdiagnostics/*" \
> > >> +     -o -path "gccsrc/gcc/testsuite/jit.dg/*" \
> > >> +     -o -print0 \) | xargs -0 rm -f \
> > >> +  || die "Failed to clean up source tree"
> > >> +
> > >> +# The directory to pass to -I; this is the one with texinfo.tex
> > >> +# and fdl.texi.
> > >> +export includedir=gccsrc/gcc/doc/include
> > >
> > > Does this need to be an exported variable?
> >
> > Yes, docs_build_simple is invoked through a new bash process.
>
> Aha. Thanks. I missed that.
>
> > >> +# Generate gcc-vers.texi.
> > >> +(
> > >> +  set -e
> > >> +  echo "@set version-GCC $(cat gccsrc/gcc/BASE-VER)"
> > >> +  if [ "$(cat gccsrc/gcc/DEV-PHASE)" = "experimental" ]; then
> > >> +    echo "@set DEVELOPMENT"
> > >> +  else
> > >> +    echo "@clear DEVELOPMENT"
> > >> +  fi
> > >> +  echo "@set srcdir $workdir/gccsrc/gcc"
> > >> +  echo "@set VERSION_PACKAGE (GCC)"
> > >> +  echo "@set BUGURL @uref{$BUGURL}"
> > >> +) > "$includedir"/gcc-vers.texi \
> > >> +  || die "Failed to generate gcc-vers.texi"
> > >> +
> > >> +# Generate libquadmath-vers.texi.
> > >> +echo "@set BUGURL @uref{$BUGURL}" \
> > >> +     > "$includedir"/libquadmath-vers.texi \
> > >> +  || die "Failed to generate libquadmath-vers.texi"
> > >> +
> > >> +# Build a tarball of the sources.
> > >> +tar cf docs-sources.tar --xform 's/^gccsrc/gcc/' gccsrc \
> > >> +  || die "Failed to build sources"
> > >
> > > Why not create a tar.gz? See also below.
> > >
> > >> +######## BUILD DOCS
> > >> +docs_build_single() {
> > >> +  [[ $1 ]] || die "bad docs_build_single invoc"
> > >> +  local manual="$1" filename miargs
> > >> +  filename="$(find . -name "${manual}.texi")" \
> > >> +    || die "Failed to find ${manual}.texi"
> > >> +
> > >> +  # Silently ignore if no such manual exists is missing.
> > >> +  [[ $filename ]] || return 0
> > >
> > > Maybe don't be silent about it?
> > > If a manual suddenly disappears shouldn't this script just be adapted?
> >
> > This is one of the places where supporting many versions manifests.  If
> > we decide not to do that, this should be loud indeed.
>
> Yeah, see also fastjar, gcj and porting above.
>
> > >> +  miargs=(
> > >> +    -I "${includedir}"
> > >> +    -I "$(dirname "${filename}")"
> > >> +  )
> > >> +
> > >> +  # Manual specific arguments.
> > >> +  case "$manual" in
> > >> +    gm2)
> > >> +      miargs+=(
> > >> +        -I gccsrc/gcc/m2/target-independent
> > >> +        -I gccsrc/gcc/m2/target-independent/m2
> > >> +      )
> > >> +      ;;
> > >> +    gnat_ugn)
> > >> +      miargs+=(
> > >> +        -I gccsrc/gcc/ada
> > >> +        -I gccsrc/gcc/ada/doc/gnat_ugn
> > >> +      )
> > >> +      ;;
> > >> +    *) ;;
> > >> +  esac
> > >> +
> > >> +  v "${MAKEINFO}" --html \
> > >> +    "${miargs[@]}" \
> > >> +    -c CONTENTS_OUTPUT_LOCATION=inline \
> > >> +    --css-ref "${CSS}" \
> > >> +    -o "${manual}" \
> > >> +    "${filename}" \
> > >> +    || die "Failed to generate HTML for ${manual}"
> > >> +  tar cf "${manual}-html.tar" "${manual}"/*.html \
> > >> +    || die "Failed to pack up ${manual}-html.tar"
> > >
> > > Maybe generate a tar.gz directly?
> >
> > Will try, I think that'd be okay probably.
> >
> > >> +  v "${TEXI2DVI}" "${miargs[@]}" \
> > >> +    -o "${manual}.dvi" \
> > >> +    "${filename}" \
> > >> +    </dev/null >/dev/null \
> > >> +    || die "Failed to generate ${manual}.dvi"
> > >> +  v dvips -q -o "${manual}".{ps,dvi} \
> > >> +    </dev/null >/dev/null \
> > >> +    || die "Failed to generate ${manual}.ps"
> > >
> > > Do we really still want to produce a dvi and ps file if we already
> > > produce a pdf below?
> >
> > We currently do.  Not sure what the benefit is, but we do, so I kept it.
>
> Given that even the PDFs aren't really read/used that much, I am not
> sure there is a real benefit to also provide an PS document.
>
> > >> +  v "${TEXI2PDF}" "${miargs[@]}" \
> > >> +    -o "${manual}.pdf" \
> > >> +    "${filename}" \
> > >> +    </dev/null >/dev/null \
> > >> +    || die "Failed to generate ${manual}.pdf"
> > >> +
> > >> +  while read -d $'\0' -r f; do
> > >> +    # Do this for the contents of each file.
> > >> +    sed -i -e 's/_002d/-/g' "$f" \
> > >> +      || die "Failed to hack $f"
> > >> +    # And rename files if necessary.
> > >> +    ff="${f//_002d/-}"
> > >> +    if [ "$f" != "$ff" ]; then
> > >> +      printf "Renaming %s to %s\n" "$f" "$ff"
> > >
> > > Maybe make this silent, the log already is fairly big?
> >
> > This is log of a hack, so I'd prefer if this specific thing was loud and
> > other things were made quieter.
>
> It is a bit of a hack, but I don't think it needs to be loud about
> that, only when it fails.
>
> > >> +      mv "$f" "$ff" || die "Failed to rename $f"
> > >> +    fi
> > >> +  done < <(find "${manual}" -name '*.html' -print0)
> > >> +}
> > >> +export -f docs_build_single
> > >> +
> > >> +# Now convert the relevant files from texi to HTML, PDF and PostScript.
> > >> +if type -P parallel >&/dev/null; then
> > >> +  parallel docs_build_single '{}' ::: "${MANUALS[@]}"
> > >> +else
> > >> +  for man in "${MANUALS[@]}"; do
> > >> +    docs_build_single "${man}"
> > >> +  done
> > >> +fi
> > >
> > > Interesting use of parallel (note, not currently installed on server
> > > or in the container). Does it work with the nagware thing? Otherwise
> > > it might be useful to explicitly do
> > >   mkdir -p ~/.parallel; touch ~/.parallel/will-cite
> >
> > Hm, I didn't check on a machine that doesn't already have will-cite.
>
> Should we install parallel on the machine/container?
>
> > >> +v make -C gccsrc/gcc/jit/docs html SPHINXBUILD="${SPHINXBUILD}" \
> > >> +  || die "Failed to generate libgccjit docs"
> > >> +
> > >> +v cp -a gccsrc/gcc/jit/docs/_build/html jit || die "failed to cp jit"
> > >> +
> > >> +
> > >> +if [[ -d gccsrc/gcc/doc/libgdiagnostics/ ]]; then
> > >> +  v make -C gccsrc/gcc/doc/libgdiagnostics/ html 
> > >> SPHINXBUILD="${SPHINXBUILD}" \
> > >> +    || die "Failed to generate libgdiagnostics docs"
> > >> +
> > >> +  v cp -a gccsrc/gcc/doc/libgdiagnostics/_build/html libgdiagnostics \
> > >> +    || die "failed to cp libgdiagnostics"
> > >> +fi
> > >
> > > This is why I think it might make sense to have this script be
> > > specific to each branch.
> > >
> > >> +######## BUILD gcobol DOCS
> > >> +# The COBOL FE maintains man pages.  Convert them to HTML and PDF.
> > >> +cobol_mdoc2pdf_html() {
> > >> +  mkdir -p gcobol
> > >> +  input="$1"
> > >> +  d="${input%/*}"
> > >> +  pdf="$2"
> > >> +  html="gcobol/$3"
> > >> +  groff -mdoc -T pdf "$input" > "${pdf}" || die
> > >> +  mandoc -T html "$filename" > "${html}" || die
> > >> +}
> > >> +find . -name gcobol.[13] |
> > >> +  while read filename
> > >> +  do
> > >> +    case ${filename##*.} in
> > >> +      1)
> > >> +        cobol_mdoc2pdf_html "$filename" gcobol.pdf gcobol.html
> > >> +        ;;
> > >> +      3)
> > >> +        cobol_mdoc2pdf_html "$filename" gcobol_io.pdf gcobol_io.html
> > >> +        ;;
> > >> +    esac
> > >> +  done
> > >> +
> > >> +# Then build a gzipped copy of each of the resulting .html, .ps and 
> > >> .tar files
> > >> +(
> > >> +  shopt -s nullglob
> > >> +  for file in */*.html *.ps *.pdf *.tar; do
> > >> +    # Tell gzip to produce reproducible zips.
> > >> +    SOURCE_DATE_EPOCH=1 gzip --best > "$file".gz <"$file"
> > >> +  done
> > >> +)
> > >
> > > Here you also create tar.gz files. Leaving the .tar archives as is.
> > > Since the .tar archives are really big already I would remove them
> > > here, or simply directly create tar.gz files above.
> > >
> > >> +# And copy the resulting files to the web server.
> > >> +while read -d $'\0' -r file; do
> > >> +  outfile="${outdir}/${file}"
> > >> +  mkdir -p "$(dirname "${outfile}")" \
> > >> +    || die "Failed to generate output directory"
> > >> +  cp "${file}" "${outfile}" \
> > >> +    || die "Failed to copy ${file}"
> > >> +done < <(find . \
> > >> +              -not -path "./gccsrc/*" \
> > >> +              \( -name "*.html" \
> > >> +              -o -name "*.png" \
> > >> +              -o -name "*.css" \
> > >> +              -o -name "*.js" \
> > >> +              -o -name "*.txt" \
> > >> +              -o -name '*.html.gz' \
> > >> +              -o -name '*.ps' \
> > >> +              -o -name '*.ps.gz' \
> > >> +              -o -name '*.pdf' \
> > >> +              -o -name '*.pdf.gz' \
> > >> +              -o -name '*.tar' \
> > >> +              -o -name '*.tar.gz' \
> > >> +              \) -print0)
> > >
> > > So I might suggest to skip *.ps, *.ps.gz and *.tar here.
> >
> > This would mean diverging from the current practice, which is fine by
> > me, but I'd like second opinions also (see the contents of
> > https://gcc.gnu.org/onlinedocs/gcc-15.2.0/ as an example).
>
> The ps and ps.gz files aren't that big, but I doubt anybody really
> uses them. The non-compresses .tar files do take up space (10% of the
> whole docs) and we already also provide the compressed tar files.
>
> Thanks,
>
> Mark
>
>

Reply via email to