mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
llvm-build: Switch to using the common subdirectory list instead of
autodiscovery. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146437 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b0c594fd42
commit
e5609abccb
@ -147,7 +147,7 @@ $ROOT of project trees for things which can be checked out separately. -->
|
||||
<i>; Comments start with a semi-colon.</i>
|
||||
|
||||
<i>; Sections are declared using square brackets.</i>
|
||||
[component 0]
|
||||
[component_0]
|
||||
|
||||
<i>; Properties are declared using '=' and are contained in the previous section.
|
||||
;
|
||||
@ -160,7 +160,7 @@ boolean_property_name = 1 <em>(or 0)</em>
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<p>LLVMBuild files are expected to define a strict set of section and
|
||||
<p>LLVMBuild files are expected to define a strict set of sections and
|
||||
properties. An typical component description file for a library
|
||||
component would look typically look like the following example:</p>
|
||||
<div class="doc_code">
|
||||
@ -176,14 +176,22 @@ required_libraries = Archive BitReader Core Support TransformUtils
|
||||
<p>A full description of the exact sections and properties which are allowed
|
||||
follows.</p>
|
||||
|
||||
<p>Each file may define exactly one common component, named "common". The
|
||||
common component may define the following properties:</p>
|
||||
<ul>
|
||||
<li><i>subdirectories</i> <b>[optional]</b>
|
||||
<p>If given, a list of the names of the subdirectories from the current
|
||||
subpath to search for additional LLVMBuild files.</p></li>
|
||||
</ul>
|
||||
|
||||
<p>Each file may define multiple components. Each component is described by a
|
||||
section who name starts with "component". The remainder of the section name is
|
||||
ignored, but each section name must be unique. Typically components are just
|
||||
number in order for files with multiple components ("component_0",
|
||||
"component_1", and so on).<p>
|
||||
|
||||
<p><b>Section names not matches this format are currently
|
||||
unused and are disallowed.</b></p>
|
||||
<p><b>Section names not matches this format (or the "common" section) are
|
||||
currently unused and are disallowed.</b></p>
|
||||
|
||||
<p>Every component is defined by the properties in the section. The exact list
|
||||
of properties that are allowed depends on the component
|
||||
|
@ -381,6 +381,16 @@ def load_from_path(path, subpath):
|
||||
parser = ConfigParser.RawConfigParser()
|
||||
parser.read(path)
|
||||
|
||||
# Extract the common section.
|
||||
if parser.has_section("common"):
|
||||
common = IniFormatParser(parser.items("common"))
|
||||
parser.remove_section("common")
|
||||
else:
|
||||
common = IniFormatParser({})
|
||||
|
||||
return common, _read_components_from_parser(parser, path, subpath)
|
||||
|
||||
def _read_components_from_parser(parser, path, subpath):
|
||||
# We load each section which starts with 'component' as a distinct component
|
||||
# description (so multiple components can be described in one file).
|
||||
for section in parser.sections():
|
||||
|
@ -64,32 +64,26 @@ def make_install_dir(path):
|
||||
class LLVMProjectInfo(object):
|
||||
@staticmethod
|
||||
def load_infos_from_path(llvmbuild_source_root):
|
||||
# FIXME: Implement a simple subpath file list cache, so we don't restat
|
||||
# directories we have already traversed.
|
||||
def recurse(subpath):
|
||||
# Load the LLVMBuild file.
|
||||
llvmbuild_path = os.path.join(llvmbuild_source_root + subpath,
|
||||
'LLVMBuild.txt')
|
||||
if not os.path.exists(llvmbuild_path):
|
||||
fatal("missing LLVMBuild.txt file at: %r" % (llvmbuild_path,))
|
||||
|
||||
# First, discover all the LLVMBuild.txt files.
|
||||
#
|
||||
# FIXME: We would like to use followlinks=True here, but that isn't
|
||||
# compatible with Python 2.4. Instead, we will either have to special
|
||||
# case projects we would expect to possibly be linked to, or implement
|
||||
# our own walk that can follow links. For now, it doesn't matter since
|
||||
# we haven't picked up the LLVMBuild system in any other LLVM projects.
|
||||
for dirpath,dirnames,filenames in os.walk(llvmbuild_source_root):
|
||||
# If there is no LLVMBuild.txt file in a directory, we don't recurse
|
||||
# past it. This is a simple way to prune our search, although it
|
||||
# makes it easy for users to add LLVMBuild.txt files in places they
|
||||
# won't be seen.
|
||||
if 'LLVMBuild.txt' not in filenames:
|
||||
del dirnames[:]
|
||||
continue
|
||||
|
||||
# Otherwise, load the LLVMBuild file in this directory.
|
||||
assert dirpath.startswith(llvmbuild_source_root)
|
||||
subpath = '/' + dirpath[len(llvmbuild_source_root)+1:]
|
||||
llvmbuild_path = os.path.join(dirpath, 'LLVMBuild.txt')
|
||||
for info in componentinfo.load_from_path(llvmbuild_path, subpath):
|
||||
# Parse the components from it.
|
||||
common,info_iter = componentinfo.load_from_path(llvmbuild_path,
|
||||
subpath)
|
||||
for info in info_iter:
|
||||
yield info
|
||||
|
||||
# Recurse into the specified subdirectories.
|
||||
for subdir in common.get_list("subdirectories"):
|
||||
for item in recurse(os.path.join(subpath, subdir)):
|
||||
yield item
|
||||
|
||||
return recurse("/")
|
||||
|
||||
@staticmethod
|
||||
def load_from_path(source_root, llvmbuild_source_root):
|
||||
infos = list(
|
||||
|
Loading…
x
Reference in New Issue
Block a user