1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- """Contains helper functions to compute checksums for LLVM checkouts.
- """
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- import logging
- import os
- import os.path
- import sys
- class LLVMProject(object):
- """An LLVM project with a descriptive name and a relative checkout path.
- """
- def __init__(self, name, relpath):
- self.name = name
- self.relpath = relpath
- def is_subproject(self, other_project):
- """ Check if self is checked out as a subdirectory of other_project.
- """
- return self.relpath.startswith(other_project.relpath)
- def WalkProjectFiles(checkout_root, all_projects, project, visitor):
- """ Walk over all files inside a project without recursing into subprojects, '.git' and '.svn' subfolders.
- checkout_root: root of the LLVM checkout.
- all_projects: projects in the LLVM checkout.
- project: a project to walk the files of. Must be inside all_projects.
- visitor: a function called on each visited file.
- """
- assert project in all_projects
- ignored_paths = set()
- for other_project in all_projects:
- if other_project != project and other_project.is_subproject(project):
- ignored_paths.add(os.path.join(checkout_root, other_project.relpath))
- def raise_error(err):
- raise err
- project_root = os.path.join(checkout_root, project.relpath)
- for root, dirs, files in os.walk(project_root, onerror=raise_error):
- dirs[:] = [
- d for d in dirs
- if d != ".svn" and d != ".git" and
- os.path.join(root, d) not in ignored_paths
- ]
- for f in files:
- visitor(os.path.join(root, f))
- def CreateLLVMProjects(single_tree_checkout):
- """Returns a list of LLVMProject instances, describing relative paths of a typical LLVM checkout.
- Args:
- single_tree_checkout:
- When True, relative paths for each project points to a typical single
- source tree checkout.
- When False, relative paths for each projects points to a separate
- directory. However, clang-tools-extra is an exception, its relative path
- will always be 'clang/tools/extra'.
- """
- # FIXME: cover all of llvm projects.
- # Projects that reside inside 'projects/' in a single source tree checkout.
- ORDINARY_PROJECTS = [
- "compiler-rt", "dragonegg", "libcxx", "libcxxabi", "libunwind",
- "parallel-libs", "test-suite"
- ]
- # Projects that reside inside 'tools/' in a single source tree checkout.
- TOOLS_PROJECTS = ["clang", "lld", "lldb", "llgo"]
- if single_tree_checkout:
- projects = [LLVMProject("llvm", "")]
- projects += [
- LLVMProject(p, os.path.join("projects", p)) for p in ORDINARY_PROJECTS
- ]
- projects += [
- LLVMProject(p, os.path.join("tools", p)) for p in TOOLS_PROJECTS
- ]
- projects.append(
- LLVMProject("clang-tools-extra",
- os.path.join("tools", "clang", "tools", "extra")))
- else:
- projects = [LLVMProject("llvm", "llvm")]
- projects += [LLVMProject(p, p) for p in ORDINARY_PROJECTS]
- projects += [LLVMProject(p, p) for p in TOOLS_PROJECTS]
- projects.append(
- LLVMProject("clang-tools-extra", os.path.join("clang", "tools",
- "extra")))
- return projects
|