1*fb8a8121Smrg#!/bin/sh 2*fb8a8121Smrg 3*fb8a8121Smrg# Generate HTML documentation from GCC Texinfo docs. 4*fb8a8121Smrg# 5*fb8a8121Smrg# If you want to run this on a machine different from gcc.gnu.org, you 6*fb8a8121Smrg# may need to adjust GITROOT and WWWBASE below (or override them via the 7*fb8a8121Smrg# environment). 8*fb8a8121Smrg 9*fb8a8121Smrgset -e 10*fb8a8121Smrg 11*fb8a8121Smrg# Run this from /tmp. 12*fb8a8121SmrgGITROOT=${GITROOT:-"/git/gcc.git"} 13*fb8a8121Smrgexport GITROOT 14*fb8a8121Smrg 15*fb8a8121SmrgPATH=/usr/local/bin:$PATH 16*fb8a8121Smrg 17*fb8a8121SmrgMANUALS="cpp 18*fb8a8121Smrg cppinternals 19*fb8a8121Smrg fastjar 20*fb8a8121Smrg gcc 21*fb8a8121Smrg gccgo 22*fb8a8121Smrg gccint 23*fb8a8121Smrg gcj 24*fb8a8121Smrg gfortran 25*fb8a8121Smrg gfc-internals 26*fb8a8121Smrg gnat_ugn 27*fb8a8121Smrg gnat-style 28*fb8a8121Smrg gnat_rm 29*fb8a8121Smrg libgomp 30*fb8a8121Smrg libitm 31*fb8a8121Smrg libquadmath 32*fb8a8121Smrg libiberty 33*fb8a8121Smrg porting" 34*fb8a8121Smrg 35*fb8a8121SmrgCSS=/gcc.css 36*fb8a8121Smrg 37*fb8a8121SmrgWWWBASE=${WWWBASE:-"/www/gcc/htdocs"} 38*fb8a8121SmrgWWWBASE_PREFORMATTED=/www/gcc/htdocs-preformatted 39*fb8a8121SmrgWWWPREPROCESS='/www/gcc/bin/preprocess -r' 40*fb8a8121Smrg 41*fb8a8121Smrg# Process options -rrelease and -ddirectory 42*fb8a8121SmrgRELEASE="" 43*fb8a8121SmrgSUBDIR="" 44*fb8a8121Smrg 45*fb8a8121Smrgwhile [ $# -gt 0 ]; do 46*fb8a8121Smrg case $1 in 47*fb8a8121Smrg -r*) 48*fb8a8121Smrg if [ -n "$RELEASE" ]; then 49*fb8a8121Smrg echo "Multiple releases specified" >&2 50*fb8a8121Smrg exit 1 51*fb8a8121Smrg fi 52*fb8a8121Smrg RELEASE="${1#-r}" 53*fb8a8121Smrg if [ -z "$RELEASE" ]; then 54*fb8a8121Smrg shift 55*fb8a8121Smrg RELEASE="$1" 56*fb8a8121Smrg if [ -z "$RELEASE" ]; then 57*fb8a8121Smrg echo "No release specified with -r" >&2 58*fb8a8121Smrg exit 1 59*fb8a8121Smrg fi 60*fb8a8121Smrg fi 61*fb8a8121Smrg ;; 62*fb8a8121Smrg -d*) 63*fb8a8121Smrg if [ -n "$SUBDIR" ]; then 64*fb8a8121Smrg echo "Multiple subdirectories specified" >&2 65*fb8a8121Smrg exit 1 66*fb8a8121Smrg fi 67*fb8a8121Smrg SUBDIR="${1#-d}" 68*fb8a8121Smrg if [ -z "$SUBDIR" ]; then 69*fb8a8121Smrg shift 70*fb8a8121Smrg SUBDIR="$1" 71*fb8a8121Smrg if [ -z "$SUBDIR" ]; then 72*fb8a8121Smrg echo "No subdirectory specified with -d" >&2 73*fb8a8121Smrg exit 1 74*fb8a8121Smrg fi 75*fb8a8121Smrg fi 76*fb8a8121Smrg ;; 77*fb8a8121Smrg *) 78*fb8a8121Smrg echo "Unknown argument \"$1\"" >&2 79*fb8a8121Smrg exit 1 80*fb8a8121Smrg ;; 81*fb8a8121Smrg esac 82*fb8a8121Smrg shift 83*fb8a8121Smrgdone 84*fb8a8121Smrg 85*fb8a8121Smrgif [ -n "$RELEASE" ] && [ -z "$SUBDIR" ]; then 86*fb8a8121Smrg echo "Release specified without subdirectory" >&2 87*fb8a8121Smrg exit 1 88*fb8a8121Smrgfi 89*fb8a8121Smrg 90*fb8a8121Smrgif [ -z "$SUBDIR" ]; then 91*fb8a8121Smrg DOCSDIR=$WWWBASE/onlinedocs 92*fb8a8121Smrgelse 93*fb8a8121Smrg DOCSDIR=$WWWBASE/onlinedocs/$SUBDIR 94*fb8a8121Smrgfi 95*fb8a8121Smrg 96*fb8a8121Smrgif [ ! -d $WWWBASE ]; then 97*fb8a8121Smrg echo "WWW base directory \"$WWWBASE\" does not exist." >&2 98*fb8a8121Smrg exit 1 99*fb8a8121Smrgfi 100*fb8a8121Smrg 101*fb8a8121Smrgif [ ! -d $DOCSDIR ]; then 102*fb8a8121Smrg mkdir $DOCSDIR 103*fb8a8121Smrg chmod g+w $DOCSDIR 104*fb8a8121Smrgfi 105*fb8a8121Smrg 106*fb8a8121Smrgif [ -z "$RELEASE" ]; then 107*fb8a8121Smrg RELEASE=master 108*fb8a8121Smrgfi 109*fb8a8121Smrg 110*fb8a8121SmrgWORKDIR=/tmp/gcc-doc-update.$$ 111*fb8a8121Smrg 112*fb8a8121Smrgrm -rf $WORKDIR 113*fb8a8121Smrgmkdir $WORKDIR 114*fb8a8121Smrgcd $WORKDIR 115*fb8a8121Smrgif [ "$RELEASE" = "master" ]; then 116*fb8a8121Smrg git clone -q $GITROOT gcc 117*fb8a8121Smrgelse 118*fb8a8121Smrg git clone -q -b releases/gcc-$RELEASE $GITROOT gcc 119*fb8a8121Smrgfi 120*fb8a8121Smrgrm -rf gcc/.git 121*fb8a8121Smrg 122*fb8a8121Smrg# Remove all unwanted files. This is needed to avoid packaging all the 123*fb8a8121Smrg# sources instead of only documentation sources. 124*fb8a8121Smrg# Note that we have to preserve gcc/jit/docs since the jit docs are 125*fb8a8121Smrg# not .texi files (Makefile, .rst and .png), and the jit docs use 126*fb8a8121Smrg# include directives to pull in content from jit/jit-common.h and 127*fb8a8121Smrg# jit/notes.txt, so we have to preserve those also. 128*fb8a8121Smrgfind gcc -type f \( -name '*.texi' \ 129*fb8a8121Smrg -o -path gcc/gcc/doc/install.texi2html \ 130*fb8a8121Smrg -o -path gcc/gcc/doc/include/texinfo.tex \ 131*fb8a8121Smrg -o -path gcc/gcc/BASE-VER \ 132*fb8a8121Smrg -o -path gcc/gcc/DEV-PHASE \ 133*fb8a8121Smrg -o -path "gcc/gcc/ada/doc/gnat_ugn/*.png" \ 134*fb8a8121Smrg -o -path "gcc/gcc/jit/docs/*" \ 135*fb8a8121Smrg -o -path "gcc/gcc/jit/jit-common.h" \ 136*fb8a8121Smrg -o -path "gcc/gcc/jit/notes.txt" \ 137*fb8a8121Smrg -o -print0 \) | xargs -0 rm -f 138*fb8a8121Smrg 139*fb8a8121Smrg# Build a tarball of the sources. 140*fb8a8121Smrgtar cf docs-sources.tar gcc 141*fb8a8121Smrg 142*fb8a8121Smrg# The directory to pass to -I; this is the one with texinfo.tex 143*fb8a8121Smrg# and fdl.texi. 144*fb8a8121Smrgincludedir=gcc/gcc/doc/include 145*fb8a8121Smrg 146*fb8a8121Smrg# Generate gcc-vers.texi. 147*fb8a8121Smrg( 148*fb8a8121Smrg echo "@set version-GCC $(cat gcc/gcc/BASE-VER)" 149*fb8a8121Smrg if [ "$(cat gcc/gcc/DEV-PHASE)" = "experimental" ]; then 150*fb8a8121Smrg echo "@set DEVELOPMENT" 151*fb8a8121Smrg else 152*fb8a8121Smrg echo "@clear DEVELOPMENT" 153*fb8a8121Smrg fi 154*fb8a8121Smrg echo "@set srcdir $WORKDIR/gcc/gcc" 155*fb8a8121Smrg echo "@set VERSION_PACKAGE (GCC)" 156*fb8a8121Smrg echo "@set BUGURL @uref{http://gcc.gnu.org/bugs/}" 157*fb8a8121Smrg) > $includedir/gcc-vers.texi 158*fb8a8121Smrg 159*fb8a8121Smrg# Generate libquadmath-vers.texi. 160*fb8a8121Smrgecho "@set BUGURL @uref{http://gcc.gnu.org/bugs/}" \ 161*fb8a8121Smrg > $includedir/libquadmath-vers.texi 162*fb8a8121Smrg 163*fb8a8121Smrg# Now convert the relevant files from texi to HTML, PDF and PostScript. 164*fb8a8121Smrgfor file in $MANUALS; do 165*fb8a8121Smrg filename=`find . -name ${file}.texi` 166*fb8a8121Smrg if [ "${filename}" ]; then 167*fb8a8121Smrg includes="-I ${includedir} -I `dirname ${filename}`" 168*fb8a8121Smrg if [ "$file" = "gnat_ugn" ]; then 169*fb8a8121Smrg includes="$includes -I gcc/gcc/ada -I gcc/gcc/ada/doc/gnat_ugn" 170*fb8a8121Smrg fi 171*fb8a8121Smrg makeinfo --html --css-ref $CSS $includes -o ${file} ${filename} 172*fb8a8121Smrg tar cf ${file}-html.tar ${file}/*.html 173*fb8a8121Smrg texi2dvi $includes -o ${file}.dvi ${filename} </dev/null >/dev/null && dvips -o ${file}.ps ${file}.dvi 174*fb8a8121Smrg texi2pdf $includes -o ${file}.pdf ${filename} </dev/null 175*fb8a8121Smrg mkdir -p $DOCSDIR/$file 176*fb8a8121Smrg fi 177*fb8a8121Smrgdone 178*fb8a8121Smrg 179*fb8a8121Smrg# The jit is a special-case, using sphinx rather than texinfo. 180*fb8a8121Smrg# Specifically, the jit docs need sphinx 1.0 or later. 181*fb8a8121Smrg# 182*fb8a8121Smrg# The jit/docs Makefile uses the executable $(SPHINXBUILD), 183*fb8a8121Smrg# defaulting to "sphinx-build". 184*fb8a8121Smrg# 185*fb8a8121Smrg# sphinx is packaged in Fedora and EPEL 6 within "python-sphinx", 186*fb8a8121Smrg# in RHEL 8 within "python3-sphinx", 187*fb8a8121Smrg# and in openSUSE within "python-Sphinx". 188*fb8a8121Smrg# 189*fb8a8121Smrg# For EPEL6, python-sphinx is sphinx 0.6.6, which is missing various 190*fb8a8121Smrg# directives (e.g. ":c:macro:"), so we need the variant 191*fb8a8121Smrg# python-sphinx10 package. The latter installs its executable as 192*fb8a8121Smrg# /usr/bin/sphinx-1.0-build 193*fb8a8121Smrg# so we needed to override SPHINXBUILD with this when invoking "make". 194*fb8a8121Smrgpushd gcc/gcc/jit/docs 195*fb8a8121Smrgmake html || true 196*fb8a8121Smrgpopd 197*fb8a8121Smrgcp -a gcc/gcc/jit/docs/_build/html jit 198*fb8a8121Smrgmkdir -p $DOCSDIR/jit 199*fb8a8121Smrg 200*fb8a8121Smrg# Work around makeinfo generated file names and references with 201*fb8a8121Smrg# "_002d" instead of "-". 202*fb8a8121Smrgfind . -name '*.html' | while read f; do 203*fb8a8121Smrg # Do this for the contents of each file. 204*fb8a8121Smrg sed -i -e 's/_002d/-/g' "$f" 205*fb8a8121Smrg # And rename files if necessary. 206*fb8a8121Smrg ff=`echo $f | sed -e 's/_002d/-/g'`; 207*fb8a8121Smrg if [ "$f" != "$ff" ]; then 208*fb8a8121Smrg printf "Renaming %s to %s\n" "$f" "$ff" 209*fb8a8121Smrg mv "$f" "$ff" 210*fb8a8121Smrg fi 211*fb8a8121Smrgdone 212*fb8a8121Smrg 213*fb8a8121Smrg# Then build a gzipped copy of each of the resulting .html, .ps and .tar files 214*fb8a8121Smrgfor file in */*.html *.ps *.pdf *.tar; do 215*fb8a8121Smrg cat $file | gzip --best > $file.gz 216*fb8a8121Smrgdone 217*fb8a8121Smrg 218*fb8a8121Smrg# On the 15th of the month, wipe all the old files from the 219*fb8a8121Smrg# web server. 220*fb8a8121Smrgtoday=`date +%d` 221*fb8a8121Smrgif test $today = 15; then 222*fb8a8121Smrg find $DOCSDIR -type f -maxdepth 1 -print | grep -v index.html | xargs rm 223*fb8a8121Smrg for m in $MANUALS; do 224*fb8a8121Smrg rm -f $DOCSDIR/$m/*.html $DOCSDIR/$m/*.html.gz 225*fb8a8121Smrg done 226*fb8a8121Smrgfi 227*fb8a8121Smrg 228*fb8a8121Smrg# And copy the resulting files to the web server 229*fb8a8121Smrgfor file in */*.html *.ps *.pdf *.tar; do 230*fb8a8121Smrg if [ -f $DOCSDIR/$file ]; then 231*fb8a8121Smrg cat $DOCSDIR/$file | 232*fb8a8121Smrg sed -e '/^<meta name=generator/d' \ 233*fb8a8121Smrg -e '/^%DVIPSSource:/d' > file1 234*fb8a8121Smrg fi 235*fb8a8121Smrg cat $file | 236*fb8a8121Smrg sed -e '/^<meta name=generator/d' \ 237*fb8a8121Smrg -e '/^%DVIPSSource:/d' > file2 238*fb8a8121Smrg if cmp -s file1 file2; then 239*fb8a8121Smrg : 240*fb8a8121Smrg else 241*fb8a8121Smrg cp $file $DOCSDIR/$file 242*fb8a8121Smrg cp $file.gz $DOCSDIR/$file.gz 243*fb8a8121Smrg fi 244*fb8a8121Smrgdone 245*fb8a8121Smrg 246*fb8a8121Smrg# Again, the jit is a special case, with nested subdirectories 247*fb8a8121Smrg# below "jit", and with some non-HTML files (.png images from us, 248*fb8a8121Smrg# plus .css and .js supplied by sphinx, and source files, renamed 249*fb8a8121Smrg# from .rst to .txt). 250*fb8a8121Smrgfind jit \ 251*fb8a8121Smrg -name "*.html" -o -name "*.png" \ 252*fb8a8121Smrg -o -name "*.css" -o -name "*.js" \ 253*fb8a8121Smrg -o -name "*.txt" | 254*fb8a8121Smrg while read file ; do 255*fb8a8121Smrg # Note that $file here will contain path fragments beginning 256*fb8a8121Smrg # with "jit/", e.g. "jit/cp/topics/functions.html" 257*fb8a8121Smrg mkdir -p $(dirname $DOCSDIR/$file) 258*fb8a8121Smrg cp $file $DOCSDIR/$file 259*fb8a8121Smrg done 260*fb8a8121Smrg 261*fb8a8121Smrgcd $DOCSDIR 262*fb8a8121Smrg 263*fb8a8121Smrg# Finally, generate the installation documentation 264*fb8a8121Smrgif [ "$RELEASE" = "master" ]; then 265*fb8a8121Smrg SOURCEDIR=$WORKDIR/gcc/gcc/doc 266*fb8a8121Smrg DESTDIR=$WWWBASE_PREFORMATTED/install 267*fb8a8121Smrg export SOURCEDIR 268*fb8a8121Smrg export DESTDIR 269*fb8a8121Smrg $WORKDIR/gcc/gcc/doc/install.texi2html 270*fb8a8121Smrg 271*fb8a8121Smrg # Preprocess the entire web site, not just the install docs! 272*fb8a8121Smrg echo "Invoking $WWWPREPROCESS" 273*fb8a8121Smrg $WWWPREPROCESS |grep -v '^ Warning: Keeping' 274*fb8a8121Smrgfi 275*fb8a8121Smrg 276*fb8a8121Smrg# Clean up behind us. 277*fb8a8121Smrg 278*fb8a8121Smrgrm -rf $WORKDIR 279