Skip to content

Commit eb60afb

Browse files
committed
Add --jobs to allow for some parallelism.
From 45mn to 5mn for a full build on my machine with -j 16.
1 parent c0c633b commit eb60afb

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

build_docs.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
3232
"""
3333

34+
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED
3435
import logging
3536
import os
3637
import subprocess
@@ -170,9 +171,8 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
170171
log_directory='/var/log/docsbuild/', language=None):
171172
if not language:
172173
language = 'en'
173-
checkout = os.path.join(build_root, 'python{version}{lang}'.format(
174-
version=str(version).replace('.', ''),
175-
lang=language if language != 'en' else ''))
174+
checkout = os.path.join(
175+
build_root, str(version), 'cpython-{lang}'.format(lang=language))
176176
logging.info("Build start for version: %s, language: %s",
177177
str(version), language)
178178
sphinxopts = SPHINXOPTS[language].copy()
@@ -185,7 +185,7 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
185185
os.chmod(language_dir, 0o775)
186186
target = os.path.join(language_dir, str(version))
187187
gettext_language_tag = pep_545_tag_to_gettext_tag(language)
188-
locale_dirs = os.path.join(build_root, 'locale')
188+
locale_dirs = os.path.join(build_root, str(version), 'locale')
189189
locale_clone_dir = os.path.join(
190190
locale_dirs, gettext_language_tag, 'LC_MESSAGES')
191191
locale_repo = 'https://github.com/python/python-docs-{}.git'.format(
@@ -214,8 +214,8 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
214214
sphinxbuild = os.path.join(venv, "bin/sphinx-build")
215215
blurb = os.path.join(venv, "bin/blurb")
216216
shell_out(
217-
"cd Doc; make PYTHON=%s SPHINXBUILD=%s BLURB=%s VENVDIR=%s SPHINXOPTS='%s' %s >> %s 2>&1" %
218-
(python, sphinxbuild, blurb, venv, ' '.join(sphinxopts), maketarget,
217+
"make -C %s PYTHON=%s SPHINXBUILD=%s BLURB=%s VENVDIR=%s SPHINXOPTS='%s' %s >> %s 2>&1" %
218+
(os.path.join(checkout, 'Doc'), python, sphinxbuild, blurb, venv, ' '.join(sphinxopts), maketarget,
219219
os.path.join(log_directory, logname)), shell=True)
220220
shell_out(['chgrp', '-R', group, log_directory])
221221
changed = changed_files(os.path.join(checkout, "Doc/build/html"), target)
@@ -306,6 +306,12 @@ def parse_args():
306306
help="Language translation, as a PEP 545 language tag like"
307307
" 'fr' or 'pt-br'.",
308308
metavar='fr')
309+
parser.add_argument(
310+
"--jobs", "-j",
311+
type=int,
312+
default=4,
313+
help="Specifies the number of jobs (languages, versions) "
314+
"to run simultaneously.")
309315
return parser.parse_args()
310316

311317

@@ -335,15 +341,21 @@ def main():
335341
# instead of none. "--languages en" builds *no* translation,
336342
# as "en" is the untranslated one.
337343
args.languages = LANGUAGES
338-
for version, git_branch, devel in branches_to_do:
339-
for language in args.languages:
340-
try:
341-
build_one(version, git_branch, devel, args.quick, venv,
342-
args.build_root, args.www_root,
343-
args.skip_cache_invalidation, args.group,
344-
args.log_directory, language)
345-
except Exception:
346-
logging.exception("docs build raised exception")
344+
with ThreadPoolExecutor(max_workers=args.jobs) as executor:
345+
futures = []
346+
for version, git_branch, devel in branches_to_do:
347+
for language in args.languages:
348+
futures.append((version, language, executor.submit(
349+
build_one, version, git_branch, devel, args.quick, venv,
350+
args.build_root, args.www_root,
351+
args.skip_cache_invalidation, args.group,
352+
args.log_directory, language)))
353+
wait([future[2] for future in futures], return_when=ALL_COMPLETED)
354+
for version, language, future in futures:
355+
if future.exception():
356+
logging.error("Exception while building %s version %s: %s",
357+
language, version,
358+
future.exception())
347359

348360

349361
if __name__ == '__main__':

0 commit comments

Comments
 (0)