diff --git a/doc/.gitignore b/doc/.gitignore
new file mode 100644
index 00000000..e324eac9
--- /dev/null
+++ b/doc/.gitignore
@@ -0,0 +1 @@
+/generated
diff --git a/doc/support/compat.sh b/doc/support/compat.sh
new file mode 100644
index 00000000..e7135239
--- /dev/null
+++ b/doc/support/compat.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Copyright 2015 The Crashpad Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if [[ "${BASH_SOURCE[0]}" = "${0}" ]]; then
+ echo "${0}: this file must be sourced, not run directly" >& 2
+ exit 1
+fi
+
+# Some extensions of command-line tools behave differently on different systems.
+# $sed_ext should be a sed invocation that enables extended regular expressions.
+# $date_time_t should be a date invocation that causes it to print the date and
+# time corresponding to a time_t string that immediately follows it.
+case "$(uname -s)" in
+ Darwin)
+ sed_ext="sed -E"
+ date_time_t="date -r"
+ ;;
+ Linux)
+ sed_ext="sed -r"
+ date_time_t="date -d@"
+ ;;
+ *)
+ echo "${0}: unknown operating system" >& 2
+ exit 1
+ ;;
+esac
diff --git a/doc/support/generate.sh b/doc/support/generate.sh
new file mode 100755
index 00000000..dcb74375
--- /dev/null
+++ b/doc/support/generate.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+# Copyright 2015 The Crashpad Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+function maybe_mkdir() {
+ local dir="${1}"
+ if [[ ! -d "${dir}" ]]; then
+ mkdir "${dir}"
+ fi
+}
+
+# Run from the Crashpad project root directory.
+cd "$(dirname "${0}")/../.."
+
+source doc/support/compat.sh
+
+doc/support/generate_doxygen.sh
+doc/support/generate_asciidoc.sh
+
+output_dir=doc/generated
+maybe_mkdir "${output_dir}"
+
+for subdir in doc doxygen man ; do
+ output_subdir="${output_dir}/${subdir}"
+ maybe_mkdir "${output_subdir}"
+ rsync -Ilr --delete --exclude .git "out/doc/${subdir}/html/" \
+ "${output_subdir}/"
+done
+
+# Move doc/index.html to index.html, adjusting relative paths to other files in
+# doc.
+${sed_ext} -e 's%%%g' \
+ < "${output_dir}/doc/index.html" > "${output_dir}/index.html"
+
+# Create man/index.html
+cd "${output_dir}/man"
+cat > index.html << __EOF__
+
+
+Crashpad Man Pages
+
+__EOF__
+
+for html_file in *.html; do
+ if [[ "${html_file}" = "index.html" ]]; then
+ continue
+ fi
+ basename=$(${sed_ext} -e 's/\.html$//' <<< "${html_file}")
+ cat >> index.html << __EOF__
+ -
+ ${basename}
+
+__EOF__
+done
+
+cat >> index.html << __EOF__
+
+__EOF__
diff --git a/doc/support/generate_asciidoc.sh b/doc/support/generate_asciidoc.sh
index b636fe70..54a57349 100755
--- a/doc/support/generate_asciidoc.sh
+++ b/doc/support/generate_asciidoc.sh
@@ -23,6 +23,8 @@ set -e
# Run from the Crashpad project root directory.
cd "$(dirname "${0}")/../.."
+source doc/support/compat.sh
+
output_dir=out/doc
rm -rf \
@@ -33,26 +35,6 @@ mkdir -p \
"${output_dir}/man/html" \
"${output_dir}/man/man"
-# Some extensions of command-line tools behave differently on different systems.
-# $sed_ext should be a sed invocation that enables extended regular expressions.
-# $date_time_t should be a date invocation that causes it to print the date and
-# time corresponding to a time_t string that immediately follows it.
-uname_s="$(uname -s)"
-case "${uname_s}" in
- Darwin)
- sed_ext="sed -E"
- date_time_t="date -r"
- ;;
- Linux)
- sed_ext="sed -r"
- date_time_t="date -d@"
- ;;
- *)
- echo "${0}: unknown operating system" >& 2
- exit 1
- ;;
-esac
-
# Get the version from package.h.
version=$(${sed_ext} -n -e 's/^#define PACKAGE_VERSION "(.*)"$/\1/p' package.h)