def read_build_config(docdir): """Read the active build config and return the relevant doc paths. The return value is cached so re-generating with the same docdir won't invoke the build system a second time.""" trees = {} python_package_dirs = set() is_main = docdir == MAIN_DOC_PATH relevant_mozbuild_path = None if is_main else docdir # Reading the Sphinx variables doesn't require a full build context. # Only define the parts we need. class fakeconfig(object): topsrcdir = build.topsrcdir variables = ("SPHINX_TREES", "SPHINX_PYTHON_PACKAGE_DIRS") reader = BuildReader(fakeconfig()) result = reader.find_variables_from_ast(variables, path=relevant_mozbuild_path) for path, name, key, value in result: reldir = os.path.dirname(path) if name == "SPHINX_TREES": # If we're building a subtree, only process that specific subtree. # topsrcdir always uses POSIX-style path, normalize it for proper comparison. absdir = os.path.normpath( os.path.join(build.topsrcdir, reldir, value)) if not is_main and absdir not in (docdir, MAIN_DOC_PATH): continue assert key if key.startswith("/"): key = key[1:] else: key = os.path.normpath(os.path.join(reldir, key)) if key in trees: raise Exception( "%s has already been registered as a destination." % key) trees[key] = os.path.join(reldir, value) if name == "SPHINX_PYTHON_PACKAGE_DIRS": python_package_dirs.add(os.path.join(reldir, value)) return trees, python_package_dirs