1*4882a593Smuzhiyun#!/usr/bin/env python 2*4882a593Smuzhiyunfrom hashlib import md5 3*4882a593Smuzhiyunfrom pathlib import Path 4*4882a593Smuzhiyunimport re 5*4882a593Smuzhiyunimport sys 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunimport sphinx 8*4882a593Smuzhiyunfrom sphinx.application import Sphinx 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun# This extension uses pyyaml, report an explicit 11*4882a593Smuzhiyun# error message if it's not installed 12*4882a593Smuzhiyuntry: 13*4882a593Smuzhiyun import yaml 14*4882a593Smuzhiyunexcept ImportError: 15*4882a593Smuzhiyun sys.stderr.write("The Yocto Project Sphinx documentation requires PyYAML.\ 16*4882a593Smuzhiyun \nPlease make sure to install pyyaml python package.\n") 17*4882a593Smuzhiyun sys.exit(1) 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun__version__ = '1.0' 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun# Variables substitutions. Uses {VAR} subst using variables defined in poky.yaml 22*4882a593Smuzhiyun# Each .rst file is processed after source-read event (subst_vars_replace runs once per file) 23*4882a593Smuzhiyunsubst_vars = {} 24*4882a593Smuzhiyun 25*4882a593Smuzhiyunpoky_hash = "" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyundef subst_vars_replace(app: Sphinx, docname, source): 28*4882a593Smuzhiyun result = source[0] 29*4882a593Smuzhiyun for k in subst_vars: 30*4882a593Smuzhiyun result = result.replace("&"+k+";", subst_vars[k]) 31*4882a593Smuzhiyun source[0] = result 32*4882a593Smuzhiyun 33*4882a593Smuzhiyundef yocto_vars_env_get_outdated(app: Sphinx, env, added, changed, removed): 34*4882a593Smuzhiyun ''' 35*4882a593Smuzhiyun If poky.yaml changed (BUILDDIR/.poky.yaml.cache does not exist or contains 36*4882a593Smuzhiyun an md5sum different from poky.yaml's current md5sum), force rebuild of all 37*4882a593Smuzhiyun *.rst files in SOURCEDIR whose content has at least one occurence of `&.*;` 38*4882a593Smuzhiyun (see PATTERN global variable). 39*4882a593Smuzhiyun ''' 40*4882a593Smuzhiyun try: 41*4882a593Smuzhiyun poky_cache = Path(app.outdir) / ".poky.yaml.cache" 42*4882a593Smuzhiyun cache_hash = poky_cache.read_text() 43*4882a593Smuzhiyun except FileNotFoundError: 44*4882a593Smuzhiyun cache_hash = None 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun if poky_hash == cache_hash: 47*4882a593Smuzhiyun return [] 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun docs = [] 50*4882a593Smuzhiyun for p in Path(app.srcdir).rglob("*.rst"): 51*4882a593Smuzhiyun if PATTERN.search(p.read_text()): 52*4882a593Smuzhiyun p_rel_no_ext = p.relative_to(app.srcdir).parent / p.stem 53*4882a593Smuzhiyun docs.append(str(p_rel_no_ext)) 54*4882a593Smuzhiyun return docs 55*4882a593Smuzhiyun 56*4882a593Smuzhiyundef yocto_vars_build_finished(app: Sphinx, exception): 57*4882a593Smuzhiyun poky_cache = Path(app.outdir) / ".poky.yaml.cache" 58*4882a593Smuzhiyun poky_cache.write_text(poky_hash) 59*4882a593Smuzhiyun return [] 60*4882a593Smuzhiyun 61*4882a593SmuzhiyunPATTERN = re.compile(r'&(.*?);') 62*4882a593Smuzhiyundef expand(val, src): 63*4882a593Smuzhiyun return PATTERN.sub(lambda m: expand(src.get(m.group(1), ''), src), val) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyundef setup(app: Sphinx): 66*4882a593Smuzhiyun global poky_hash 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun with open("poky.yaml") as file: 69*4882a593Smuzhiyun hasher = md5() 70*4882a593Smuzhiyun buff = file.read() 71*4882a593Smuzhiyun hasher.update(buff.encode('utf-8')) 72*4882a593Smuzhiyun poky_hash = hasher.hexdigest() 73*4882a593Smuzhiyun subst_vars.update(yaml.safe_load(buff)) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun for k in subst_vars: 76*4882a593Smuzhiyun subst_vars[k] = expand(subst_vars[k], subst_vars) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun app.connect('source-read', subst_vars_replace) 79*4882a593Smuzhiyun app.connect('env-get-outdated', yocto_vars_env_get_outdated) 80*4882a593Smuzhiyun app.connect('build-finished', yocto_vars_build_finished) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun return dict( 83*4882a593Smuzhiyun version = __version__, 84*4882a593Smuzhiyun parallel_read_safe = True, 85*4882a593Smuzhiyun parallel_write_safe = True 86*4882a593Smuzhiyun ) 87