+ top-src-dir=/home/phil/lilypond-git \
+ -f /home/phil/lilypond-git/make/website.make \
+ website
+@end example
+
+which has the effect of setting the variables @code{config_make}
+and @code{top-src-dir} and then processing the file
+@code{git/make/website.make} with the target of website.
+
+@code{website.make} starts with the following:
+
+@example
+ifeq ($(WEBSITE_ONLY_BUILD),1)
+@end example
+
+which checks to see whether the variable @code{WEBSITE_ONLY_BUILD}
+was set to one on the command line. This is only done for
+standalone website builds, not in the normal case. The result of
+the test determines the value of some variables that are set. A
+number of other variables are set, in order to establish locations
+of various files. An example is:
+
+@example
+CREATE_VERSION=python $(script-dir)/create-version-itexi.py
+@end example
+
+The rule for website is:
+
+@smallexample
+website: website-texinfo website-css website-pictures website-examples web-post
+ 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 smallexample
+
+so we see that this starts by running the rules for 5 other
+targets, then finishes by copying some files. We'll cover that
+later - first @code{website-texinfo}. That rule is:
+
+@example
+website-texinfo: website-version website-xrefs website-bibs
+ for l in '' $(WEB_LANGS); do \
+ if test -n "$$l"; then \
+ langopt=--lang="$$l"; \
+ langsuf=.$$l; \
+ fi; \
+ $(TEXI2HTML) --prefix=index \
+ --split=section \
+ --I=$(top-src-dir)/Documentation/"$$l" \
+ --I=$(top-src-dir)/Documentation \
+ --I=$(OUT) \
+ $$langopt \
+ --init-file=$(texi2html-init-file) \
+ -D web_version \
+ --output=$(OUT)/"$$l" \
+ $(top-src-dir)/Documentation/"$$l"/web.texi ; \
+ ls $(OUT)/$$l/*.html | xargs grep -L \
+ 'UNTRANSLATED NODE: IGNORE ME' | \
+ sed 's!$(OUT)/'$$l'/!!g' | xargs \
+ $(MASS_LINK) --prepend-suffix="$$langsuf" \
+ hard $(OUT)/$$l/ $(OUT)/website/ ; \
+ done
+@end example
+
+which therefore depends on @code{website-version},
+@code{website-xrefs} and @code{website-bibs}.
+
+@example
+website-version:
+ mkdir -p $(OUT)
+ $(CREATE_VERSION) $(top-src-dir) > $(OUT)/version.itexi
+ $(CREATE_WEBLINKS) $(top-src-dir) > $(OUT)/weblinks.itexi
+@end example
+
+which translates as:
+
+@example
+mkdir -p out-website
+python /home/phil/lilypond-git/scripts/build/create-version-itexi.py
+ /home/phil/lilypond-git > out-website/version.itexi
+python /home/phil/lilypond-git/scripts/build/create-weblinks-itexi.py
+ /home/phil/lilypond-git > out-website/weblinks.itexi
+@end example
+
+So, we make out-website then send the output of
+@code{create-version-itexi.py} to @code{out-website/version.itexi}
+and @code{create-weblinks-itexi.py} to
+@code{out-website/weblinks.itexi}.
+
+@code{create-version-itexi.py} parses the file @code{VERSION} in
+the top source dir. It contains:
+
+@example
+PACKAGE_NAME=LilyPond
+MAJOR_VERSION=2
+MINOR_VERSION=15
+PATCH_LEVEL=13
+MY_PATCH_LEVEL=
+VERSION_STABLE=2.14.2
+VERSION_DEVEL=2.15.12
+@end example
+
+currently. @code{c-v-i.py} parses this to:
+
+@example
+@@c ************************ Version numbers ************
+@@macro version
+2.15.13
+@@end macro
+
+@@macro versionStable
+2.14.2
+@@end macro
+
+@@macro versionDevel
+2.15.12
+@@end macro
+@end example
+
+@code{create-weblinks-itexi.py} creates a load of texi macros (of
+the order of 1000) similar to:
+
+@example
+@@macro manualStableGlossaryPdf
+@@uref@{../doc/v2.14/Documentation/music-glossary.pdf,Music glossary.pdf@}
+@@end macro.
+@end example
+
+It loads its languages from langdefs.py, and therefore outputs the following unhelpful warning:
+
+@code{langdefs.py: warning: lilypond-doc gettext domain not found.}
+
+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