|  | # coding=utf-8 | 
|  | # | 
|  | # QEMU depfile generation extension | 
|  | # | 
|  | # Copyright (c) 2020 Red Hat, Inc. | 
|  | # | 
|  | # This work is licensed under the terms of the GNU GPLv2 or later. | 
|  | # See the COPYING file in the top-level directory. | 
|  |  | 
|  | """depfile is a Sphinx extension that writes a dependency file for | 
|  | an external build system""" | 
|  |  | 
|  | import os | 
|  | import sphinx | 
|  | import sys | 
|  | from pathlib import Path | 
|  |  | 
|  | __version__ = '1.0' | 
|  |  | 
|  | def get_infiles(env): | 
|  | for x in env.found_docs: | 
|  | yield env.doc2path(x) | 
|  | yield from ((os.path.join(env.srcdir, dep) | 
|  | for dep in env.dependencies[x])) | 
|  | for mod in sys.modules.values(): | 
|  | if hasattr(mod, '__file__'): | 
|  | if mod.__file__: | 
|  | yield mod.__file__ | 
|  | # this is perhaps going to include unused files: | 
|  | for static_path in env.config.html_static_path + env.config.templates_path: | 
|  | for path in Path(static_path).rglob('*'): | 
|  | yield str(path) | 
|  |  | 
|  |  | 
|  | def write_depfile(app, exception): | 
|  | if exception: | 
|  | return | 
|  |  | 
|  | env = app.env | 
|  | if not env.config.depfile: | 
|  | return | 
|  |  | 
|  | # Using a directory as the output file does not work great because | 
|  | # its timestamp does not necessarily change when the contents change. | 
|  | # So create a timestamp file. | 
|  | if env.config.depfile_stamp: | 
|  | with open(env.config.depfile_stamp, 'w') as f: | 
|  | pass | 
|  |  | 
|  | with open(env.config.depfile, 'w') as f: | 
|  | print((env.config.depfile_stamp or app.outdir) + ": \\", file=f) | 
|  | print(*get_infiles(env), file=f) | 
|  | for x in get_infiles(env): | 
|  | print(x + ":", file=f) | 
|  |  | 
|  |  | 
|  | def setup(app): | 
|  | app.add_config_value('depfile', None, 'env') | 
|  | app.add_config_value('depfile_stamp', None, 'env') | 
|  | app.connect('build-finished', write_depfile) | 
|  |  | 
|  | return dict( | 
|  | version = __version__, | 
|  | parallel_read_safe = True, | 
|  | parallel_write_safe = True | 
|  | ) |