+Next:
+
+@example
+website-xrefs: website-version
+ for l in '' @$(WEB_LANGS); do \
+@end example
+
+is the start of the rule, truncated for brevity. This loops
+through the languages to be used on the website, processing some
+variables which I don't fully understand, to run this command:
+
+@smallexample
+python /home/phil/lilypond-git/scripts/build/extract_texi_filenames.py \
+ -I /home/phil/lilypond-git/Documentation \
+ -I /home/phil/lilypond-git/Documentation/"@$l" \
+ -I out-website -o out-website --split=node \
+ --known-missing-files= \
+ /home/phil/lilypond-git/scripts/build/website-known-missing-files.txt \
+ -q \
+ /home/phil/lilypond-git/Documentation/"@$l"/web.texi ;\
+@end smallexample
+
+There's a good description of what
+@code{extract_texi_filenames.py} does at the top of the script,
+but a shortened version is:
+
+@code{If this script is run on a file texifile.texi, it produces
+a file texifile[.LANG].xref-map with tab-separated entries
+of the form NODE\tFILENAME\tANCHOR.}
+
+An example from
+@code{web.nl.xref-map} is:
+
+@example
+Inleiding Introduction Introduction
+@end example
+
+@code{e-t-f.py} follows the includes from document to document.
+We know some have not been created yet, and
+@code{known-missing-files} option tells @code{e-t-f.py} which
+these are.
+
+It then does this:
+
+@example
+for m in @$(MANUALS); do \
+@end example
+
+to run @code{e-t-f.py} against all of the manuals, in each
+language. Next:
+
+@example
+website-bibs: website-version
+ BSTINPUTS=@$(top-src-dir)/Documentation/web \
+ @$(WEB_BIBS) -s web \
+ -s @$(top-src-dir)/Documentation/lily-bib \
+ -o @$(OUT)/others-did.itexi \
+ @$(quiet-flag) \
+ @$(top-src-dir)/Documentation/web/others-did.bib
+@end example
+
+This is half the command. It runs @code{bib2texi.py} on 2
+@code{.bib} files - @code{others-did.bib} and @code{we-wrote.bib}.
+This converts bibliography files into texi files with
+@code{bibtex}.
+
+Next the commands in the @code{website-texinfo} rule are run:
+
+@example
+for l in '' @$(WEB_LANGS); do \
+@end example
+
+run @code{texi2html}. This is the program that outputs the
+progress message (found in
+@code{Documentation/lilypond-texi2html.init}):
+
+@code{Processing web site: []}
+
+It also outputs warning messages like:
+
+@code{WARNING: Unable to find node 'Řešení potíží' in book usage.}
+
+@example
+website-css:
+ cp @$(top-src-dir)/Documentation/css/*.css @$(OUT)/website
+@end example
+
+Copies 3 css files to out-website/website. Then:
+
+@example
+website-pictures:
+ mkdir -p @$(OUT)/website/pictures
+ if [ -d @$(PICTURES) ]; \
+ then \
+ cp @$(PICTURES)/* @$(OUT)/website/pictures ; \
+ ln -sf website/pictures @$(OUT)/pictures ;\
+ fi
+@end example
+
+which translates as:
+
+@smallexample
+if [ -d Documentation/pictures/out-www ]; \
+ then \
+ cp Documentation/pictures/out-www/* out-website/website/pictures ; \
+ ln -sf website/pictures out-website/pictures ;\
+ fi
+@end smallexample
+
+i.e. it copies the contents of
+@code{build/Documentation/pictures/out-www/*} to
+@code{out-website/website/pictures}. Unfortunately, the pictures
+are only created once @code{make doc} has been run, so an initial
+run of @code{make website} copies nothing, and the pictures on the
+website (e.g. the logo) do not exist. Next:
+
+@example
+website-examples:
+ mkdir -p @$(OUT)/website/ly-examples
+ if [ -d @$(EXAMPLES) ]; \
+ then \
+ cp @$(EXAMPLES)/* @$(OUT)/website/ly-examples ; \
+ fi
+@end example
+
+translates to:
+
+@smallexample
+mkdir -p out-website/website/ly-examples
+if [ -d Documentation/web/ly-examples/out-www ]; \
+ then \
+ cp Documentation/web/ly-examples/out-www/* out-website/website/ly-examples ; \
+ fi
+@end smallexample
+
+This does the same with the LilyPond examples (found at
+@uref{http://lilypond.org/examples.html}). Again, these are
+actually only created by @code{make doc} (and since they are
+generated from LilyPond source files, require a working LilyPond
+@code{exe} made with @code{make}). So this does nothing
+initially. Then:
+
+@example
+web-post:
+ @$(WEB_POST) @$(OUT)/website
+@end example
+
+which is:
+
+@smallexample
+python /home/phil/lilypond-git/scripts/build/website_post.py out-website/website
+@end smallexample
+
+which describes itself as:
+
+@code{This is web_post.py. This script deals with translations
+in the "make website" target.}
+
+It also does a number of other things, including adding the Google
+tracker code and the language selection footer. We're now at
+the end of our story. The final 4 lines of the recipe for website
+are:
+
+@example
+cp @$(SERVER_FILES)/favicon.ico @$(OUT)/website
+cp @$(SERVER_FILES)/robots.txt @$(OUT)/website
+cp @$(top-htaccess) @$(OUT)/.htaccess
+cp @$(dir-htaccess) @$(OUT)/website/.htaccess
+@end example
+
+The first translates as:
+
+@smallexample
+cp /home/phil/lilypond-git/Documentation/web/server/favicon.ico out-website/website
+@end smallexample
+
+so we see these are just copying the support files for the web
+server.
+
+@subsubheading website.make summary
+
+Recipes in @file{website.make}: