X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2Fllvm-build%2Fllvmbuild%2Fmain.py;h=5ffed0c385e0aca0aa4b6262cf15e9befc99e5f0;hb=875710a2fd6b3c4f814961582594bd5c1cdb493a;hp=48b59bdac38cf84a8f7de7822f9365dd744c8c1a;hpb=177a119621f14a6ced87982ada75372815b636cf;p=oota-llvm.git diff --git a/utils/llvm-build/llvmbuild/main.py b/utils/llvm-build/llvmbuild/main.py index 48b59bdac38..5ffed0c385e 100644 --- a/utils/llvm-build/llvmbuild/main.py +++ b/utils/llvm-build/llvmbuild/main.py @@ -1,11 +1,11 @@ -import StringIO +from __future__ import absolute_import import os import sys -import componentinfo -import configutil +import llvmbuild.componentinfo as componentinfo +import llvmbuild.configutil as configutil -from util import * +from llvmbuild.util import fatal, note ### @@ -55,7 +55,7 @@ def make_install_dir(path): Create the given directory path for installation, including any parents. """ - # os.makedirs considers it an error to be called with an existant path. + # os.makedirs considers it an error to be called with an existent path. if not os.path.exists(path): os.makedirs(path) @@ -182,9 +182,11 @@ class LLVMProjectInfo(object): # out easily. If we don't, we should special case the check. self.ordered_component_infos = [] - components_to_visit = set(self.component_infos) + components_to_visit = sorted( + set(self.component_infos), + key = lambda c: c.name) while components_to_visit: - visit_component_info(iter(components_to_visit).next(), [], set()) + visit_component_info(components_to_visit[0], [], set()) # Canonicalize children lists. for c in self.ordered_component_infos: @@ -192,7 +194,7 @@ class LLVMProjectInfo(object): def print_tree(self): 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: visit(c, depth + 1) visit(self.component_info_map['$ROOT']) @@ -281,7 +283,7 @@ subdirectories = %s header_name = '.' + os.path.join(subpath, 'LLVMBuild.txt') header_pad = '-' * (80 - len(header_fmt % (header_name, ''))) header_string = header_fmt % (header_name, header_pad) - print >>f, """\ + f.write("""\ %s ; ; The LLVM Compiler Infrastructure @@ -298,17 +300,18 @@ subdirectories = %s ; http://llvm.org/docs/LLVMBuild.html ; ;===------------------------------------------------------------------------===; -""" % header_string + +""" % header_string) # Write out each fragment.each component fragment. for name,fragment in fragments: comment = comments_map.get(name) if comment is not None: f.write(comment) - print >>f, "[%s]" % name + f.write("[%s]\n" % name) f.write(fragment) if fragment is not fragments[-1][1]: - print >>f + f.write('\n') f.close() @@ -341,8 +344,10 @@ subdirectories = %s # Get the library name, or None for LibraryGroups. if c.type_name == 'Library' or c.type_name == 'OptionalLibrary': library_name = c.get_prefixed_library_name() + is_installed = c.installed else: library_name = None + is_installed = True # Get the component names of all the required libraries. required_llvmconfig_component_names = [ @@ -355,29 +360,30 @@ subdirectories = %s # Add the entry. entries[c.name] = (llvmconfig_component_name, library_name, - required_llvmconfig_component_names) + required_llvmconfig_component_names, + is_installed) # 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 # only listing entries that have no other dependents. root_entries = set(e[0] for e in entries) - for _,_,deps in entries: + for _,_,deps,_ in entries: root_entries -= set(deps) - entries.append(('all', None, root_entries)) + entries.append(('all', None, root_entries, True)) entries.sort() # Compute the maximum number of required libraries, plus one so there is # always a sentinel. max_required_libraries = max(len(deps) - for _,_,deps in entries) + 1 + for _,_,deps,_ in entries) + 1 # Write out the library table. make_install_dir(os.path.dirname(output_path)) f = open(output_path, 'w') - print >>f, """\ + f.write("""\ //===- llvm-build generated file --------------------------------*- C++ -*-===// // // Component Library Depenedency Table @@ -385,29 +391,33 @@ subdirectories = %s // Automatically generated file, do not edit! // //===----------------------------------------------------------------------===// -""" - print >>f, 'struct AvailableComponent {' - print >>f, ' /// The name of the component.' - print >>f, ' const char *Name;' - print >>f, '' - print >>f, ' /// The name of the library for this component (or NULL).' - print >>f, ' const char *Library;' - print >>f, '' - print >>f, '\ - /// The list of libraries required when linking this component.' - print >>f, ' const char *RequiredLibraries[%d];' % ( - max_required_libraries) - print >>f, '} AvailableComponents[%d] = {' % len(entries) - for name,library_name,required_names in entries: + +""") + f.write('struct AvailableComponent {\n') + f.write(' /// The name of the component.\n') + f.write(' const char *Name;\n') + f.write('\n') + f.write(' /// The name of the library for this component (or NULL).\n') + f.write(' const char *Library;\n') + f.write('\n') + f.write(' /// Whether the component is installed.\n') + f.write(' bool IsInstalled;\n') + f.write('\n') + f.write('\ + /// The list of libraries required when linking this component.\n') + f.write(' const char *RequiredLibraries[%d];\n' % ( + max_required_libraries)) + f.write('} AvailableComponents[%d] = {\n' % len(entries)) + for name,library_name,required_names,is_installed in entries: if library_name is None: library_name_as_cstr = '0' else: library_name_as_cstr = '"lib%s.a"' % library_name - print >>f, ' { "%s", %s, { %s } },' % ( - name, library_name_as_cstr, + f.write(' { "%s", %s, %d, { %s } },\n' % ( + name, library_name_as_cstr, is_installed, ', '.join('"%s"' % dep - for dep in required_names)) - print >>f, '};' + for dep in required_names))) + f.write('};\n') f.close() def get_required_libraries_for_component(self, ci, traverse_groups = False): @@ -504,7 +514,7 @@ subdirectories = %s header_name = os.path.basename(output_path) header_pad = '-' * (80 - len(header_fmt % (header_name, ''))) header_string = header_fmt % (header_name, header_pad) - print >>f, """\ + f.write("""\ %s # # The LLVM Compiler Infrastructure @@ -520,10 +530,11 @@ subdirectories = %s # This file is autogenerated by llvm-build, do not edit! # #===------------------------------------------------------------------------===# -""" % header_string + +""" % header_string) # Write the dependency information in the best way we can. - print >>f, """ + f.write(""" # LLVMBuild CMake fragment dependencies. # # CMake has no builtin way to declare that the configuration depends on @@ -533,30 +544,71 @@ subdirectories = %s # CMake. # # FIXME: File a CMake RFE to get a properly supported version of this -# feature.""" +# feature. +""") for dep in dependencies: - print >>f, """\ + f.write("""\ configure_file(\"%s\" - ${CMAKE_CURRENT_BINARY_DIR}/DummyConfigureOutput)""" % ( - cmake_quote_path(dep),) + ${CMAKE_CURRENT_BINARY_DIR}/DummyConfigureOutput)\n""" % ( + cmake_quote_path(dep),)) # Write the properties we use to encode the required library dependency # information in a form CMake can easily use directly. - print >>f, """ + f.write(""" # Explicit library dependency information. # # 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: + # We only write the information for libraries currently. + if ci.type_name != 'Library': + continue + + f.write("""\ +set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)\n""" % ( + ci.get_prefixed_library_name(), " ".join(sorted( + dep.get_prefixed_library_name() + for dep in self.get_required_libraries_for_component(ci))))) + + f.close() + + def write_cmake_exports_fragment(self, output_path): + """ + write_cmake_exports_fragment(output_path) -> None + + Generate a CMake fragment which includes LLVMBuild library + dependencies expressed similarly to how CMake would write + them via install(EXPORT). + """ + + dependencies = list(self.get_fragment_dependencies()) + + # Write out the CMake exports fragment. + make_install_dir(os.path.dirname(output_path)) + f = open(output_path, 'w') + + f.write("""\ +# Explicit library dependency information. +# +# The following property assignments tell CMake about link +# dependencies of libraries imported from LLVM. +""") for ci in self.ordered_component_infos: # We only write the information for libraries currently. if ci.type_name != 'Library': continue - print >>f, """\ -set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)""" % ( + # Skip disabled targets. + tg = ci.get_parent_target_group() + if tg and not tg.enabled: + continue + + f.write("""\ +set_property(TARGET %s PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES %s)\n""" % ( ci.get_prefixed_library_name(), " ".join(sorted( 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() @@ -582,7 +634,7 @@ set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)""" % ( header_name = os.path.basename(output_path) header_pad = '-' * (80 - len(header_fmt % (header_name, ''))) header_string = header_fmt % (header_name, header_pad) - print >>f, """\ + f.write("""\ %s # # The LLVM Compiler Infrastructure @@ -598,30 +650,33 @@ set_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_%s %s)""" % ( # This file is autogenerated by llvm-build, do not edit! # #===------------------------------------------------------------------------===# -""" % header_string + +""" % header_string) # Write the dependencies for the fragment. # # FIXME: Technically, we need to properly quote for Make here. - print >>f, """\ + f.write("""\ # Clients must explicitly enable LLVMBUILD_INCLUDE_DEPENDENCIES to get # these dependencies. This is a compromise to help improve the -# performance of recursive Make systems.""" - print >>f, 'ifeq ($(LLVMBUILD_INCLUDE_DEPENDENCIES),1)' - print >>f, "# The dependencies for this Makefile fragment itself." - print >>f, "%s: \\" % (mk_quote_string_for_target(output_path),) +# performance of recursive Make systems. +""") + f.write('ifeq ($(LLVMBUILD_INCLUDE_DEPENDENCIES),1)\n') + 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: - print >>f, "\t%s \\" % (dep,) - print >>f + f.write("\t%s \\\n" % (dep,)) + f.write('\n') # Generate dummy rules for each of the dependencies, so that things # 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 -# removed.""" +# removed. +""") for dep in dependencies: - print >>f, "%s:" % (mk_quote_string_for_target(dep),) - print >>f, 'endif' + f.write("%s:\n" % (mk_quote_string_for_target(dep),)) + f.write('endif\n') f.close() @@ -664,7 +719,9 @@ def add_magic_target_components(parser, project, opts): enable_targets = available_targets.values() else: # We support both space separated and semi-colon separated lists. - if ' ' in opts.enable_targets: + if opts.enable_targets == '': + enable_target_names = [] + elif ' ' in opts.enable_targets: enable_target_names = opts.enable_targets.split() else: enable_target_names = opts.enable_targets.split(';') @@ -726,7 +783,7 @@ def add_magic_target_components(parser, project, opts): # If we have a native target with a JIT, use that for the engine. Otherwise, # use the interpreter. if native_target and native_target.enabled and native_target.has_jit: - engine_group.required_libraries.append('JIT') + engine_group.required_libraries.append('MCJIT') engine_group.required_libraries.append(native_group.name) else: engine_group.required_libraries.append('Interpreter') @@ -764,6 +821,10 @@ def main(): dest="write_cmake_fragment", metavar="PATH", help="Write the CMake project information to PATH", action="store", default=None) + group.add_option("", "--write-cmake-exports-fragment", + dest="write_cmake_exports_fragment", metavar="PATH", + help="Write the CMake exports information to PATH", + action="store", default=None) group.add_option("", "--write-make-fragment", dest="write_make_fragment", metavar="PATH", help="Write the Makefile project information to PATH", @@ -793,7 +854,7 @@ given by --build-root) at the same SUBPATH""", dest="optional_components", metavar="NAMES", help=("Enable the given space or semi-colon separated " "list of optional components"), - action="store", default=None) + action="store", default="") parser.add_option_group(group) (opts, args) = parser.parse_args() @@ -801,7 +862,7 @@ given by --build-root) at the same SUBPATH""", # Determine the LLVM source path, if not given. source_root = opts.source_root if source_root: - if not os.path.exists(os.path.join(source_root, 'lib', 'VMCore', + if not os.path.exists(os.path.join(source_root, 'lib', 'IR', 'Function.cpp')): parser.error('invalid LLVM source root: %r' % source_root) else: @@ -809,7 +870,7 @@ given by --build-root) at the same SUBPATH""", llvm_build_path = os.path.dirname(llvmbuild_path) utils_path = os.path.dirname(llvm_build_path) source_root = os.path.dirname(utils_path) - if not os.path.exists(os.path.join(source_root, 'lib', 'VMCore', + if not os.path.exists(os.path.join(source_root, 'lib', 'IR', 'Function.cpp')): parser.error('unable to infer LLVM source root, please specify') @@ -845,6 +906,8 @@ given by --build-root) at the same SUBPATH""", # Write out the cmake fragment, if requested. if opts.write_cmake_fragment: project_info.write_cmake_fragment(opts.write_cmake_fragment) + if opts.write_cmake_exports_fragment: + project_info.write_cmake_exports_fragment(opts.write_cmake_exports_fragment) # Configure target definition files, if requested. if opts.configure_target_def_files: