brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 337dd44 Raw
100 lines · python
1"""Contains helper functions to compute checksums for LLVM checkouts.2"""3from __future__ import absolute_import4from __future__ import division5from __future__ import print_function6 7import logging8import os9import os.path10import sys11 12 13class LLVMProject(object):14    """An LLVM project with a descriptive name and a relative checkout path."""15 16    def __init__(self, name, relpath):17        self.name = name18        self.relpath = relpath19 20    def is_subproject(self, other_project):21        """Check if self is checked out as a subdirectory of other_project."""22        return self.relpath.startswith(other_project.relpath)23 24 25def WalkProjectFiles(checkout_root, all_projects, project, visitor):26    """Walk over all files inside a project without recursing into subprojects, '.git' and '.svn' subfolders.27 28    checkout_root: root of the LLVM checkout.29    all_projects: projects in the LLVM checkout.30    project: a project to walk the files of. Must be inside all_projects.31    visitor: a function called on each visited file.32    """33    assert project in all_projects34 35    ignored_paths = set()36    for other_project in all_projects:37        if other_project != project and other_project.is_subproject(project):38            ignored_paths.add(os.path.join(checkout_root, other_project.relpath))39 40    def raise_error(err):41        raise err42 43    project_root = os.path.join(checkout_root, project.relpath)44    for root, dirs, files in os.walk(project_root, onerror=raise_error):45        dirs[:] = [46            d47            for d in dirs48            if d != ".svn"49            and d != ".git"50            and os.path.join(root, d) not in ignored_paths51        ]52        for f in files:53            visitor(os.path.join(root, f))54 55 56def CreateLLVMProjects(single_tree_checkout):57    """Returns a list of LLVMProject instances, describing relative paths of a typical LLVM checkout.58 59    Args:60      single_tree_checkout:61        When True, relative paths for each project points to a typical single62          source tree checkout.63        When False, relative paths for each projects points to a separate64          directory. However, clang-tools-extra is an exception, its relative path65          will always be 'clang/tools/extra'.66    """67    # FIXME: cover all of llvm projects.68 69    # Projects that reside inside 'projects/' in a single source tree checkout.70    ORDINARY_PROJECTS = [71        "compiler-rt",72        "dragonegg",73        "libcxx",74        "libcxxabi",75        "libunwind",76        "test-suite",77    ]78    # Projects that reside inside 'tools/' in a single source tree checkout.79    TOOLS_PROJECTS = ["clang", "lld", "lldb"]80 81    if single_tree_checkout:82        projects = [LLVMProject("llvm", "")]83        projects += [84            LLVMProject(p, os.path.join("projects", p)) for p in ORDINARY_PROJECTS85        ]86        projects += [LLVMProject(p, os.path.join("tools", p)) for p in TOOLS_PROJECTS]87        projects.append(88            LLVMProject(89                "clang-tools-extra", os.path.join("tools", "clang", "tools", "extra")90            )91        )92    else:93        projects = [LLVMProject("llvm", "llvm")]94        projects += [LLVMProject(p, p) for p in ORDINARY_PROJECTS]95        projects += [LLVMProject(p, p) for p in TOOLS_PROJECTS]96        projects.append(97            LLVMProject("clang-tools-extra", os.path.join("clang", "tools", "extra"))98        )99    return projects100