[llvm-build] Make Py3 compatible.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188424 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar
2013-08-14 23:15:39 +00:00
parent f62372f6a3
commit b49fb7bcd5
4 changed files with 117 additions and 102 deletions

View File

@ -1 +1 @@
from main import main from llvmbuild.main import main

View File

@ -2,11 +2,14 @@
Descriptor objects for entities that are part of the LLVM project. Descriptor objects for entities that are part of the LLVM project.
""" """
import ConfigParser from __future__ import absolute_import
import StringIO try:
import configparser
except:
import ConfigParser as configparser
import sys import sys
from util import * from llvmbuild.util import *
class ParseError(Exception): class ParseError(Exception):
pass pass
@ -29,7 +32,7 @@ class ComponentInfo(object):
def __init__(self, subpath, name, dependencies, parent): def __init__(self, subpath, name, dependencies, parent):
if not subpath.startswith('/'): if not subpath.startswith('/'):
raise ValueError,"invalid subpath: %r" % subpath raise ValueError("invalid subpath: %r" % subpath)
self.subpath = subpath self.subpath = subpath
self.name = name self.name = name
self.dependencies = list(dependencies) self.dependencies = list(dependencies)
@ -100,11 +103,11 @@ class GroupComponentInfo(ComponentInfo):
ComponentInfo.__init__(self, subpath, name, [], parent) ComponentInfo.__init__(self, subpath, name, [], parent)
def get_llvmbuild_fragment(self): def get_llvmbuild_fragment(self):
result = StringIO.StringIO() return """\
print >>result, 'type = %s' % self.type_name type = %s
print >>result, 'name = %s' % self.name name = %s
print >>result, 'parent = %s' % self.parent parent = %s
return result.getvalue() """ % (self.type_name, self.name, self.parent)
class LibraryComponentInfo(ComponentInfo): class LibraryComponentInfo(ComponentInfo):
type_name = 'Library' type_name = 'Library'
@ -152,21 +155,22 @@ class LibraryComponentInfo(ComponentInfo):
yield ('library group', r) yield ('library group', r)
def get_llvmbuild_fragment(self): def get_llvmbuild_fragment(self):
result = StringIO.StringIO() result = """\
print >>result, 'type = %s' % self.type_name type = %s
print >>result, 'name = %s' % self.name name = %s
print >>result, 'parent = %s' % self.parent parent = %s
""" % (self.type_name, self.name, self.parent)
if self.library_name is not None: if self.library_name is not None:
print >>result, 'library_name = %s' % self.library_name result += 'library_name = %s\n' % self.library_name
if self.required_libraries: if self.required_libraries:
print >>result, 'required_libraries = %s' % ' '.join( result += 'required_libraries = %s\n' % ' '.join(
self.required_libraries) self.required_libraries)
if self.add_to_library_groups: if self.add_to_library_groups:
print >>result, 'add_to_library_groups = %s' % ' '.join( result += 'add_to_library_groups = %s\n' % ' '.join(
self.add_to_library_groups) self.add_to_library_groups)
if not self.installed: if not self.installed:
print >>result, 'installed = 0' result += 'installed = 0\n'
return result.getvalue() return result
def get_library_name(self): def get_library_name(self):
return self.library_name or self.name return self.library_name or self.name
@ -237,17 +241,18 @@ class LibraryGroupComponentInfo(ComponentInfo):
yield ('library group', r) yield ('library group', r)
def get_llvmbuild_fragment(self): def get_llvmbuild_fragment(self):
result = StringIO.StringIO() result = """\
print >>result, 'type = %s' % self.type_name type = %s
print >>result, 'name = %s' % self.name name = %s
print >>result, 'parent = %s' % self.parent parent = %s
""" % (self.type_name, self.name, self.parent)
if self.required_libraries and not self._is_special_group: if self.required_libraries and not self._is_special_group:
print >>result, 'required_libraries = %s' % ' '.join( result += 'required_libraries = %s\n' % ' '.join(
self.required_libraries) self.required_libraries)
if self.add_to_library_groups: if self.add_to_library_groups:
print >>result, 'add_to_library_groups = %s' % ' '.join( result += 'add_to_library_groups = %s\n' % ' '.join(
self.add_to_library_groups) self.add_to_library_groups)
return result.getvalue() return result
def get_llvmconfig_component_name(self): def get_llvmconfig_component_name(self):
return self.name.lower() return self.name.lower()
@ -309,21 +314,22 @@ class TargetGroupComponentInfo(ComponentInfo):
yield ('library group', r) yield ('library group', r)
def get_llvmbuild_fragment(self): def get_llvmbuild_fragment(self):
result = StringIO.StringIO() result = """\
print >>result, 'type = %s' % self.type_name type = %s
print >>result, 'name = %s' % self.name name = %s
print >>result, 'parent = %s' % self.parent parent = %s
""" % (self.type_name, self.name, self.parent)
if self.required_libraries: if self.required_libraries:
print >>result, 'required_libraries = %s' % ' '.join( result += 'required_libraries = %s\n' % ' '.join(
self.required_libraries) self.required_libraries)
if self.add_to_library_groups: if self.add_to_library_groups:
print >>result, 'add_to_library_groups = %s' % ' '.join( result += 'add_to_library_groups = %s\n' % ' '.join(
self.add_to_library_groups) self.add_to_library_groups)
for bool_key in ('has_asmparser', 'has_asmprinter', 'has_disassembler', for bool_key in ('has_asmparser', 'has_asmprinter', 'has_disassembler',
'has_jit'): 'has_jit'):
if getattr(self, bool_key): if getattr(self, bool_key):
print >>result, '%s = 1' % (bool_key,) result += '%s = 1\n' % (bool_key,)
return result.getvalue() return result
def get_llvmconfig_component_name(self): def get_llvmconfig_component_name(self):
return self.name.lower() return self.name.lower()
@ -352,13 +358,13 @@ class ToolComponentInfo(ComponentInfo):
yield ('required library', r) yield ('required library', r)
def get_llvmbuild_fragment(self): def get_llvmbuild_fragment(self):
result = StringIO.StringIO() return """\
print >>result, 'type = %s' % self.type_name type = %s
print >>result, 'name = %s' % self.name name = %s
print >>result, 'parent = %s' % self.parent parent = %s
print >>result, 'required_libraries = %s' % ' '.join( required_libraries = %s
self.required_libraries) """ % (self.type_name, self.name, self.parent,
return result.getvalue() ' '.join(self.required_libraries))
class BuildToolComponentInfo(ToolComponentInfo): class BuildToolComponentInfo(ToolComponentInfo):
type_name = 'BuildTool' type_name = 'BuildTool'
@ -418,7 +424,7 @@ _component_type_map = dict(
TargetGroupComponentInfo, OptionalLibraryComponentInfo)) TargetGroupComponentInfo, OptionalLibraryComponentInfo))
def load_from_path(path, subpath): def load_from_path(path, subpath):
# Load the LLVMBuild.txt file as an .ini format file. # Load the LLVMBuild.txt file as an .ini format file.
parser = ConfigParser.RawConfigParser() parser = configparser.RawConfigParser()
parser.read(path) parser.read(path)
# Extract the common section. # Extract the common section.
@ -459,8 +465,9 @@ def _read_components_from_parser(parser, path, subpath):
section, path, "unable to instantiate: %r" % type_name) section, path, "unable to instantiate: %r" % type_name)
import traceback import traceback
traceback.print_exc() traceback.print_exc()
raise SystemExit, 1 raise SystemExit(1)
except ParseError,e: except ParseError:
e = sys.exc_info()[1]
fatal("unable to load component %r in %r: %s" % ( fatal("unable to load component %r in %r: %s" % (
section, path, e.message)) section, path, e.message))

View File

@ -1,11 +1,11 @@
import StringIO from __future__ import absolute_import
import os import os
import sys import sys
import componentinfo import llvmbuild.componentinfo as componentinfo
import configutil import llvmbuild.configutil as configutil
from util import * from llvmbuild.util import *
### ###
@ -186,7 +186,7 @@ class LLVMProjectInfo(object):
set(self.component_infos), set(self.component_infos),
key = lambda c: c.name) key = lambda c: c.name)
while components_to_visit: while components_to_visit:
visit_component_info(iter(components_to_visit).next(), [], set()) visit_component_info(components_to_visit[0], [], set())
# Canonicalize children lists. # Canonicalize children lists.
for c in self.ordered_component_infos: for c in self.ordered_component_infos:
@ -194,7 +194,7 @@ class LLVMProjectInfo(object):
def print_tree(self): def print_tree(self):
def visit(node, depth = 0): def visit(node, depth = 0):
print '%s%-40s (%s)' % (' '*depth, node.name, node.type_name) print('%s%-40s (%s)' % (' '*depth, node.name, node.type_name))
for c in node.children: for c in node.children:
visit(c, depth + 1) visit(c, depth + 1)
visit(self.component_info_map['$ROOT']) visit(self.component_info_map['$ROOT'])
@ -283,7 +283,7 @@ subdirectories = %s
header_name = '.' + os.path.join(subpath, 'LLVMBuild.txt') header_name = '.' + os.path.join(subpath, 'LLVMBuild.txt')
header_pad = '-' * (80 - len(header_fmt % (header_name, ''))) header_pad = '-' * (80 - len(header_fmt % (header_name, '')))
header_string = header_fmt % (header_name, header_pad) header_string = header_fmt % (header_name, header_pad)
print >>f, """\ f.write("""\
%s %s
; ;
; The LLVM Compiler Infrastructure ; The LLVM Compiler Infrastructure
@ -300,17 +300,18 @@ subdirectories = %s
; http://llvm.org/docs/LLVMBuild.html ; http://llvm.org/docs/LLVMBuild.html
; ;
;===------------------------------------------------------------------------===; ;===------------------------------------------------------------------------===;
""" % header_string
""" % header_string)
# Write out each fragment.each component fragment. # Write out each fragment.each component fragment.
for name,fragment in fragments: for name,fragment in fragments:
comment = comments_map.get(name) comment = comments_map.get(name)
if comment is not None: if comment is not None:
f.write(comment) f.write(comment)
print >>f, "[%s]" % name f.write("[%s]\n" % name)
f.write(fragment) f.write(fragment)
if fragment is not fragments[-1][1]: if fragment is not fragments[-1][1]:
print >>f f.write('\n')
f.close() f.close()
@ -363,7 +364,7 @@ subdirectories = %s
is_installed) is_installed)
# Convert to a list of entries and sort by name. # Convert to a list of entries and sort by name.
entries = entries.values() entries = list(entries.values())
# Create an 'all' pseudo component. We keep the dependency list small by # Create an 'all' pseudo component. We keep the dependency list small by
# only listing entries that have no other dependents. # only listing entries that have no other dependents.
@ -382,7 +383,7 @@ subdirectories = %s
# Write out the library table. # Write out the library table.
make_install_dir(os.path.dirname(output_path)) make_install_dir(os.path.dirname(output_path))
f = open(output_path, 'w') f = open(output_path, 'w')
print >>f, """\ f.write("""\
//===- llvm-build generated file --------------------------------*- C++ -*-===// //===- llvm-build generated file --------------------------------*- C++ -*-===//
// //
// Component Library Depenedency Table // Component Library Depenedency Table
@ -390,32 +391,33 @@ subdirectories = %s
// Automatically generated file, do not edit! // Automatically generated file, do not edit!
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
"""
print >>f, 'struct AvailableComponent {' """)
print >>f, ' /// The name of the component.' f.write('struct AvailableComponent {\n')
print >>f, ' const char *Name;' f.write(' /// The name of the component.\n')
print >>f, '' f.write(' const char *Name;\n')
print >>f, ' /// The name of the library for this component (or NULL).' f.write('\n')
print >>f, ' const char *Library;' f.write(' /// The name of the library for this component (or NULL).\n')
print >>f, '' f.write(' const char *Library;\n')
print >>f, ' /// Whether the component is installed.' f.write('\n')
print >>f, ' bool IsInstalled;' f.write(' /// Whether the component is installed.\n')
print >>f, '' f.write(' bool IsInstalled;\n')
print >>f, '\ f.write('\n')
/// The list of libraries required when linking this component.' f.write('\
print >>f, ' const char *RequiredLibraries[%d];' % ( /// The list of libraries required when linking this component.\n')
max_required_libraries) f.write(' const char *RequiredLibraries[%d];\n' % (
print >>f, '} AvailableComponents[%d] = {' % len(entries) max_required_libraries))
f.write('} AvailableComponents[%d] = {\n' % len(entries))
for name,library_name,required_names,is_installed in entries: for name,library_name,required_names,is_installed in entries:
if library_name is None: if library_name is None:
library_name_as_cstr = '0' library_name_as_cstr = '0'
else: else:
library_name_as_cstr = '"lib%s.a"' % library_name library_name_as_cstr = '"lib%s.a"' % library_name
print >>f, ' { "%s", %s, %d, { %s } },' % ( f.write(' { "%s", %s, %d, { %s } },\n' % (
name, library_name_as_cstr, is_installed, name, library_name_as_cstr, is_installed,
', '.join('"%s"' % dep ', '.join('"%s"' % dep
for dep in required_names)) for dep in required_names)))
print >>f, '};' f.write('};\n')
f.close() f.close()
def get_required_libraries_for_component(self, ci, traverse_groups = False): def get_required_libraries_for_component(self, ci, traverse_groups = False):
@ -512,7 +514,7 @@ subdirectories = %s
header_name = os.path.basename(output_path) header_name = os.path.basename(output_path)
header_pad = '-' * (80 - len(header_fmt % (header_name, ''))) header_pad = '-' * (80 - len(header_fmt % (header_name, '')))
header_string = header_fmt % (header_name, header_pad) header_string = header_fmt % (header_name, header_pad)
print >>f, """\ f.write("""\
%s %s
# #
# The LLVM Compiler Infrastructure # The LLVM Compiler Infrastructure
@ -528,10 +530,11 @@ subdirectories = %s
# This file is autogenerated by llvm-build, do not edit! # This file is autogenerated by llvm-build, do not edit!
# #
#===------------------------------------------------------------------------===# #===------------------------------------------------------------------------===#
""" % header_string
""" % header_string)
# Write the dependency information in the best way we can. # Write the dependency information in the best way we can.
print >>f, """ f.write("""
# LLVMBuild CMake fragment dependencies. # LLVMBuild CMake fragment dependencies.
# #
# CMake has no builtin way to declare that the configuration depends on # CMake has no builtin way to declare that the configuration depends on
@ -541,30 +544,32 @@ subdirectories = %s
# CMake. # CMake.
# #
# FIXME: File a CMake RFE to get a properly supported version of this # FIXME: File a CMake RFE to get a properly supported version of this
# feature.""" # feature.
""")
for dep in dependencies: for dep in dependencies:
print >>f, """\ f.write("""\
configure_file(\"%s\" configure_file(\"%s\"
${CMAKE_CURRENT_BINARY_DIR}/DummyConfigureOutput)""" % ( ${CMAKE_CURRENT_BINARY_DIR}/DummyConfigureOutput)\n""" % (
cmake_quote_path(dep),) cmake_quote_path(dep),))
# Write the properties we use to encode the required library dependency # Write the properties we use to encode the required library dependency
# information in a form CMake can easily use directly. # information in a form CMake can easily use directly.
print >>f, """ f.write("""
# Explicit library dependency information. # Explicit library dependency information.
# #
# The following property assignments effectively create a map from component # The following property assignments effectively create a map from component
# names to required libraries, in a way that is easily accessed from CMake.""" # names to required libraries, in a way that is easily accessed from CMake.
""")
for ci in self.ordered_component_infos: for ci in self.ordered_component_infos:
# We only write the information for libraries currently. # We only write the information for libraries currently.
if ci.type_name != 'Library': if ci.type_name != 'Library':
continue continue
print >>f, """\ f.write("""\
set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)""" % ( set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)\n""" % (
ci.get_prefixed_library_name(), " ".join(sorted( ci.get_prefixed_library_name(), " ".join(sorted(
dep.get_prefixed_library_name() dep.get_prefixed_library_name()
for dep in self.get_required_libraries_for_component(ci)))) for dep in self.get_required_libraries_for_component(ci)))))
f.close() f.close()
@ -590,7 +595,7 @@ set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)""" % (
header_name = os.path.basename(output_path) header_name = os.path.basename(output_path)
header_pad = '-' * (80 - len(header_fmt % (header_name, ''))) header_pad = '-' * (80 - len(header_fmt % (header_name, '')))
header_string = header_fmt % (header_name, header_pad) header_string = header_fmt % (header_name, header_pad)
print >>f, """\ f.write("""\
%s %s
# #
# The LLVM Compiler Infrastructure # The LLVM Compiler Infrastructure
@ -606,30 +611,33 @@ set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)""" % (
# This file is autogenerated by llvm-build, do not edit! # This file is autogenerated by llvm-build, do not edit!
# #
#===------------------------------------------------------------------------===# #===------------------------------------------------------------------------===#
""" % header_string
""" % header_string)
# Write the dependencies for the fragment. # Write the dependencies for the fragment.
# #
# FIXME: Technically, we need to properly quote for Make here. # FIXME: Technically, we need to properly quote for Make here.
print >>f, """\ f.write("""\
# Clients must explicitly enable LLVMBUILD_INCLUDE_DEPENDENCIES to get # Clients must explicitly enable LLVMBUILD_INCLUDE_DEPENDENCIES to get
# these dependencies. This is a compromise to help improve the # these dependencies. This is a compromise to help improve the
# performance of recursive Make systems.""" # performance of recursive Make systems.
print >>f, 'ifeq ($(LLVMBUILD_INCLUDE_DEPENDENCIES),1)' """)
print >>f, "# The dependencies for this Makefile fragment itself." f.write('ifeq ($(LLVMBUILD_INCLUDE_DEPENDENCIES),1)\n')
print >>f, "%s: \\" % (mk_quote_string_for_target(output_path),) f.write("# The dependencies for this Makefile fragment itself.\n")
f.write("%s: \\\n" % (mk_quote_string_for_target(output_path),))
for dep in dependencies: for dep in dependencies:
print >>f, "\t%s \\" % (dep,) f.write("\t%s \\\n" % (dep,))
print >>f f.write('\n')
# Generate dummy rules for each of the dependencies, so that things # Generate dummy rules for each of the dependencies, so that things
# continue to work correctly if any of those files are moved or removed. # continue to work correctly if any of those files are moved or removed.
print >>f, """\ f.write("""\
# The dummy targets to allow proper regeneration even when files are moved or # The dummy targets to allow proper regeneration even when files are moved or
# removed.""" # removed.
""")
for dep in dependencies: for dep in dependencies:
print >>f, "%s:" % (mk_quote_string_for_target(dep),) f.write("%s:\n" % (mk_quote_string_for_target(dep),))
print >>f, 'endif' f.write('endif\n')
f.close() f.close()
@ -801,7 +809,7 @@ given by --build-root) at the same SUBPATH""",
dest="optional_components", metavar="NAMES", dest="optional_components", metavar="NAMES",
help=("Enable the given space or semi-colon separated " help=("Enable the given space or semi-colon separated "
"list of optional components"), "list of optional components"),
action="store", default=None) action="store", default="")
parser.add_option_group(group) parser.add_option_group(group)
(opts, args) = parser.parse_args() (opts, args) = parser.parse_args()

View File

@ -3,7 +3,7 @@ import sys
def _write_message(kind, message): def _write_message(kind, message):
program = os.path.basename(sys.argv[0]) program = os.path.basename(sys.argv[0])
print >>sys.stderr, '%s: %s: %s' % (program, kind, message) sys.stderr.write('%s: %s: %s\n' % (program, kind, message))
note = lambda message: _write_message('note', message) note = lambda message: _write_message('note', message)
warning = lambda message: _write_message('warning', message) warning = lambda message: _write_message('warning', message)