xref: /netbsd-src/external/gpl3/gcc/dist/maintainer-scripts/update_web_docs_git (revision fb8a8121f28072308659629b86cfb7c449bd93e1)
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