| #!/bin/sh | |
| # Generate HTML documentation from GCC Texinfo docs. | |
| # | |
| # If you want to run this on a machine different from gcc.gnu.org, you | |
| # may need to adjust GITROOT and WWWBASE below (or override them via the | |
| # environment). | |
| set -e | |
| # Run this from /tmp. | |
| GITROOT=${GITROOT:-"/git/gcc.git"} | |
| export GITROOT | |
| PATH=/usr/local/bin:$PATH | |
| # We use a copy of Sphinx installed in a virtual environment so that | |
| # we don't depend on a system package. | |
| SPHINX_VENV=${SPHINX_VENV:-"/home/gccadmin/venv"} | |
| 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 | |
| MANUALS="cpp | |
| cppinternals | |
| fastjar | |
| ga68 | |
| ga68-coding-guidelines | |
| ga68-internals | |
| gcc | |
| gccgo | |
| gccint | |
| gcj | |
| gdc | |
| gfortran | |
| gfc-internals | |
| gm2 | |
| gnat_ugn | |
| gnat-style | |
| gnat_rm | |
| libgomp | |
| libitm | |
| libquadmath | |
| libiberty | |
| porting" | |
| BUGURL="https://gcc.gnu.org/bugs/" | |
| CSS=/texinfo-manuals.css | |
| WWWBASE=${WWWBASE:-"/www/gcc/htdocs"} | |
| WWWBASE_PREFORMATTED=/www/gcc/htdocs-preformatted | |
| WWWPREPROCESS='/www/gcc/bin/preprocess -r' | |
| # Process options -rrelease and -ddirectory | |
| RELEASE="" | |
| SUBDIR="" | |
| while [ $# -gt 0 ]; do | |
| case $1 in | |
| -r*) | |
| if [ -n "$RELEASE" ]; then | |
| echo "Multiple releases specified" >&2 | |
| exit 1 | |
| fi | |
| RELEASE="${1#-r}" | |
| if [ -z "$RELEASE" ]; then | |
| shift | |
| RELEASE="$1" | |
| if [ -z "$RELEASE" ]; then | |
| echo "No release specified with -r" >&2 | |
| exit 1 | |
| fi | |
| fi | |
| ;; | |
| -d*) | |
| if [ -n "$SUBDIR" ]; then | |
| echo "Multiple subdirectories specified" >&2 | |
| exit 1 | |
| fi | |
| SUBDIR="${1#-d}" | |
| if [ -z "$SUBDIR" ]; then | |
| shift | |
| SUBDIR="$1" | |
| if [ -z "$SUBDIR" ]; then | |
| echo "No subdirectory specified with -d" >&2 | |
| exit 1 | |
| fi | |
| fi | |
| ;; | |
| *) | |
| echo "Unknown argument \"$1\"" >&2 | |
| exit 1 | |
| ;; | |
| esac | |
| shift | |
| done | |
| if [ -n "$RELEASE" ] && [ -z "$SUBDIR" ]; then | |
| echo "Release specified without subdirectory" >&2 | |
| exit 1 | |
| fi | |
| if [ -z "$SUBDIR" ]; then | |
| DOCSDIR=$WWWBASE/onlinedocs | |
| else | |
| DOCSDIR=$WWWBASE/onlinedocs/$SUBDIR | |
| fi | |
| if [ ! -d $WWWBASE ]; then | |
| echo "WWW base directory \"$WWWBASE\" does not exist." >&2 | |
| exit 1 | |
| fi | |
| if [ ! -d $DOCSDIR ]; then | |
| mkdir $DOCSDIR | |
| chmod g+w $DOCSDIR | |
| fi | |
| if [ -z "$RELEASE" ]; then | |
| RELEASE=master | |
| fi | |
| WORKDIR=/tmp/gcc-doc-update.$$ | |
| rm -rf $WORKDIR | |
| mkdir $WORKDIR | |
| cd $WORKDIR | |
| if [ "$RELEASE" = "master" ]; then | |
| git clone -q $GITROOT gcc | |
| else | |
| git clone -q -b releases/gcc-$RELEASE $GITROOT gcc | |
| fi | |
| rm -rf gcc/.git | |
| # 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 | |
| # Similar considerations apply for libgdiagnostics. | |
| # Preserve the cobol man pages, which are converted to HTML and PDF. | |
| find gcc -type f \( -name '*.texi' \ | |
| -o -path gcc/gcc/doc/install.texi2html \ | |
| -o -path gcc/gcc/doc/include/texinfo.tex \ | |
| -o -path gcc/gcc/BASE-VER \ | |
| -o -path gcc/gcc/DEV-PHASE \ | |
| -o -path "gcc/gcc/ada/doc/gnat_ugn/*.png" \ | |
| -o -path "gcc/gcc/jit/docs/*" \ | |
| -o -path "gcc/gcc/jit/jit-common.h" \ | |
| -o -path "gcc/gcc/jit/notes.txt" \ | |
| -o -path "gcc/gcc/testsuite/jit.dg/*" \ | |
| -o -path "gcc/gcc/doc/libgdiagnostics/*" \ | |
| -o -path "gcc/gcc/testsuite/libgdiagnostics.dg/*" \ | |
| -o -path "gcc/gcc/cobol/gcobol*[13]" \ | |
| -o -print0 \) | xargs -0 rm -f | |
| # Build a tarball of the sources. | |
| tar cf docs-sources.tar gcc | |
| # The directory to pass to -I; this is the one with texinfo.tex | |
| # and fdl.texi. | |
| includedir=gcc/gcc/doc/include | |
| # Generate gcc-vers.texi. | |
| ( | |
| echo "@set version-GCC $(cat gcc/gcc/BASE-VER)" | |
| if [ "$(cat gcc/gcc/DEV-PHASE)" = "experimental" ]; then | |
| echo "@set DEVELOPMENT" | |
| else | |
| echo "@clear DEVELOPMENT" | |
| fi | |
| echo "@set srcdir $WORKDIR/gcc/gcc" | |
| echo "@set VERSION_PACKAGE (GCC)" | |
| echo "@set BUGURL @uref{$BUGURL}" | |
| ) > $includedir/gcc-vers.texi | |
| # Generate libquadmath-vers.texi. | |
| echo "@set BUGURL @uref{$BUGURL}" \ | |
| > $includedir/libquadmath-vers.texi | |
| # Now convert the relevant files from texi to HTML, PDF and PostScript. | |
| for file in $MANUALS; do | |
| filename=`find . -name ${file}.texi` | |
| if [ "${filename}" ]; then | |
| includes="-I ${includedir} -I `dirname ${filename}`" | |
| if [ "$file" = "gm2" ]; then | |
| includes="$includes -I gcc/gcc/m2/target-independent" | |
| includes="$includes -I gcc/gcc/m2/target-independent/m2" | |
| elif [ "$file" = "gnat_ugn" ]; then | |
| includes="$includes -I gcc/gcc/ada -I gcc/gcc/ada/doc/gnat_ugn" | |
| fi | |
| "${MAKEINFO}" --html -c CONTENTS_OUTPUT_LOCATION=inline --css-ref $CSS $includes -o ${file} ${filename} | |
| tar cf ${file}-html.tar ${file}/*.html | |
| "${TEXI2DVI}" $includes -o ${file}.dvi ${filename} </dev/null >/dev/null && dvips -o ${file}.ps ${file}.dvi | |
| "${TEXI2PDF}" $includes -o ${file}.pdf ${filename} </dev/null | |
| mkdir -p $DOCSDIR/$file | |
| fi | |
| done | |
| # | |
| # The COBOL FE maintains man pages. Convert them to HTML and PDF. | |
| # | |
| cobol_mdoc2pdf_html() { | |
| mkdir -p $DOCSDIR/gcobol gcobol | |
| input="$1" | |
| d="${input%/*}" | |
| pdf="$2" | |
| html="gcobol/$3" | |
| groff -mdoc -T pdf "$input" > "${pdf}~" | |
| mv "${pdf}~" "${pdf}" | |
| mandoc -T html "$filename" > "${html}~" | |
| mv "${html}~" "${html}" | |
| } | |
| 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 | |
| # jit and libgdiagnostics are a special-case, using Sphinx rather than texinfo. | |
| # Specifically, they need Sphinx 3.0 or later. | |
| # | |
| # Use the Sphinx installed in a virtual environment so that | |
| # we don't depend on a system package. | |
| pushd gcc/gcc/jit/docs | |
| make html SPHINXBUILD=$SPHINX_VENV/bin/sphinx-build || true | |
| popd | |
| cp -a gcc/gcc/jit/docs/_build/html jit | |
| mkdir -p $DOCSDIR/jit | |
| LIBGDIAGNOSTICS= | |
| if test -d gcc/gcc/doc/libgdiagnostics; then | |
| pushd gcc/gcc/doc/libgdiagnostics | |
| make html SPHINXBUILD=$SPHINX_VENV/bin/sphinx-build || true | |
| popd | |
| cp -a gcc/gcc/doc/libgdiagnostics/_build/html libgdiagnostics | |
| mkdir -p $DOCSDIR/libgdiagnostics | |
| LIBGDIAGNOSTICS=libgdiagnostics | |
| fi | |
| # Work around makeinfo generated file names and references with | |
| # "_002d" instead of "-". | |
| find . -name '*.html' | while read f; do | |
| # Do this for the contents of each file. | |
| sed -i -e 's/_002d/-/g' "$f" | |
| # And rename files if necessary. | |
| ff=`echo $f | sed -e 's/_002d/-/g'`; | |
| if [ "$f" != "$ff" ]; then | |
| printf "Renaming %s to %s\n" "$f" "$ff" | |
| mv "$f" "$ff" | |
| fi | |
| done | |
| # Then build a gzipped copy of each of the resulting .html, .ps and .tar files | |
| for file in */*.html *.ps *.tar; do | |
| cat $file | gzip --best > $file.gz | |
| done | |
| # On the 15th of the month, wipe all the old files from the | |
| # web server. | |
| today=`date +%d` | |
| if test $today = 15; then | |
| find $DOCSDIR -type f -maxdepth 1 -print | grep -v index.html | xargs rm | |
| for m in $MANUALS; do | |
| rm -f $DOCSDIR/$m/*.html $DOCSDIR/$m/*.html.gz | |
| done | |
| fi | |
| # And copy the resulting files to the web server | |
| for file in */*.html *.ps *.pdf *.tar; do | |
| if [ -f $DOCSDIR/$file ]; then | |
| cat $DOCSDIR/$file | | |
| sed -e '/^<meta name=generator/d' \ | |
| -e '/^%DVIPSSource:/d' > file1 | |
| fi | |
| cat $file | | |
| sed -e '/^<meta name=generator/d' \ | |
| -e '/^%DVIPSSource:/d' > file2 | |
| if cmp -s file1 file2; then | |
| : | |
| else | |
| cp $file $DOCSDIR/$file | |
| cp $file.gz $DOCSDIR/$file.gz | |
| fi | |
| done | |
| # Again, jit and libgdignostics are special cases, with nested subdirectories | |
| # below them, and with some non-HTML files (.png images from us, | |
| # plus .css and .js supplied by sphinx, and source files, renamed | |
| # from .rst to .txt). | |
| find jit $LIBGDIAGNOSTICS \ | |
| -name "*.html" -o -name "*.png" \ | |
| -o -name "*.css" -o -name "*.js" \ | |
| -o -name "*.txt" | | |
| while read file ; do | |
| # Avoid bogus redirects stemming from Sphinx stylesheets. | |
| case $file in | |
| *.html) | |
| sed -e 's#<a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>#Alabaster#' \ | |
| -e 's#<a href="http://sphinx-doc.org/">Sphinx 5.3.0</a>#Sphinx#' \ | |
| -i $file | |
| ;; | |
| esac | |
| # Note that $file here will contain path fragments beginning | |
| # with "jit/", e.g. "jit/cp/topics/functions.html" | |
| mkdir -p $(dirname $DOCSDIR/$file) | |
| cp $file $DOCSDIR/$file | |
| done | |
| cd $DOCSDIR | |
| # Finally, generate the installation documentation | |
| if [ "$RELEASE" = "master" ]; then | |
| SOURCEDIR=$WORKDIR/gcc/gcc/doc | |
| DESTDIR=$WWWBASE_PREFORMATTED/install | |
| export SOURCEDIR | |
| export DESTDIR | |
| $WORKDIR/gcc/gcc/doc/install.texi2html | |
| # Preprocess the entire web site, not just the install docs! | |
| echo "Invoking $WWWPREPROCESS" | |
| $WWWPREPROCESS |grep -v '^ Warning: Keeping' | |
| fi | |
| # Clean up behind us. | |
| rm -rf $WORKDIR |