| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #! /usr/bin/env python3
- '''
- Builds MuPDF docs.
- * Takes care of using a venv and installing required packages and running
- `sphinx-build`.
- * Works on Unix and Windows.
- * Currently only builds HTML docs.
- * Arguments are handled in the order in which they occur on the command line.
- * Generated docs start at: build/docs/html/index.html
- Args:
- build:
- Build docs:
- * Create and enter a Python venv.
- * Install packages as specified in file `docs/src/requirements.txt`.
- * Run `sphinx-build`.
- clean:
- Removes generated directory.
- -h
- --help
- Show this help.
- --pip 0|1
- If 0, we do not create the venv or install packages into it. Instead we
- assume that the venv has already been created and contains the required
- Python packages. This runs slightly faster.
- If no args are given, we do `build`.
- Example timings:
- 60s Clean build (including creating venv and installing packages).
- 10s Rebuild with no changes.
- 3.3s Rebuild with no changes and --pip 0.
- '''
- import shutil
- import os
- import platform
- import subprocess
- import sys
- def main():
- pip = True
- if len(sys.argv) == 1:
- sys.argv.append('build')
- args = iter(sys.argv[1:])
- while 1:
- try:
- arg = next(args)
- except StopIteration:
- break
- if arg in ('-h', '--help'):
- print(__doc__.strip())
- elif arg == 'clean':
- print(f'Removing: {dir_out}')
- shutil.rmtree(dir_out, ignore_errors=True)
- elif arg == 'build':
- build(pip)
- elif arg == '--pip':
- pip = int(next(args))
- def build(pip):
- windows = platform.system() == 'Windows'
- openbsd = platform.system() == 'OpenBSD'
- macos = platform.system() == 'Darwin'
- root = os.path.relpath(os.path.abspath(f'{__file__}/../..'))
- dir_in = f'{root}/docs/src'
- dir_out = f'{root}/build/docs'
- dir_venv = f'{root}/build/docs/venv'
- # We construct a command that does everything we need to do.
- #
- command = 'true'
- # Create venv.
- #
- print(f'Using Python venv: {dir_venv}')
- if pip:
- command += f' && {sys.executable} -m venv {dir_venv}'
- else:
- assert os.path.isdir(dir_venv), f'Python venv directory does not exist: {dir_venv}'
- # Activate the venv.
- #
- if windows:
- # Most of the time we can use `/` on Windows, but for activating a venv
- # we need to use `os.sep`.
- command += f' && ./{dir_venv}/Scripts/activate'.replace('/', os.sep)
- else:
- command += f' && . {dir_venv}/bin/activate'
- # Install required packages.
- #
- if pip:
- command += f' && python -m pip install --upgrade pip'
- command += f' && python -m pip install'
- with open(f'{dir_in}/requirements.txt') as f:
- for line in f:
- package = line.strip()
- if package.startswith('#') or not package:
- continue
- if (openbsd or macos) and package == 'rst2pdf':
- print(f'Not installing on OpenBSD/MacOS because install fails: {package}')
- continue
- command += f' {package}'
- # Run sphinx-build.
- #
- command += f' && sphinx-build -M html {dir_in} {dir_out}'
- # Run command.
- #
- print(f'Running command: {command}')
- sys.stdout.flush()
- subprocess.run(command, shell=True, check=True)
- print(f'')
- print(f'sphinx-build succeeded.')
- print(f'Have built documentation:')
- print(f' {dir_out}/html/index.html')
- if __name__ == '__main__':
- main()
|