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