diff options
-rw-r--r-- | llvm/CMakeLists.txt | 10 | ||||
-rw-r--r-- | llvm/Makefile.config.in | 7 | ||||
-rw-r--r-- | llvm/Makefile.rules | 1 | ||||
-rw-r--r-- | llvm/docs/LLVMBuild.html | 5 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/IntelJITEvents/LLVMBuild.txt | 2 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-config/llvm-config.cpp | 23 | ||||
-rw-r--r-- | llvm/utils/llvm-build/llvmbuild/componentinfo.py | 46 | ||||
-rw-r--r-- | llvm/utils/llvm-build/llvmbuild/main.py | 45 | ||||
-rw-r--r-- | llvm/utils/unittest/LLVMBuild.txt | 2 |
10 files changed, 122 insertions, 21 deletions
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 329dd30..321023ae 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -268,11 +268,21 @@ set(LLVMCONFIGLIBRARYDEPENDENCIESINC "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc") set(LLVMBUILDCMAKEFRAG "${LLVM_BINARY_DIR}/LLVMBuild.cmake") + +# Create the list of optional components that are enabled +if (LLVM_USE_INTEL_JITEVENTS) + set(LLVMOPTIONALCOMPONENTS IntelJITEvents) +endif (LLVM_USE_INTEL_JITEVENTS) +if (LLVM_USE_OPROFILE) + set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT) +endif (LLVM_USE_OPROFILE) + message(STATUS "Constructing LLVMBuild project information") execute_process( COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL} --native-target "${LLVM_NATIVE_ARCH}" --enable-targets "${LLVM_TARGETS_TO_BUILD}" + --enable-optional-components "${LLVMOPTIONALCOMPONENTS}" --write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC} --write-cmake-fragment ${LLVMBUILDCMAKEFRAG} ERROR_VARIABLE LLVMBUILDOUTPUT diff --git a/llvm/Makefile.config.in b/llvm/Makefile.config.in index 33fbb2a..2ffdacb 100644 --- a/llvm/Makefile.config.in +++ b/llvm/Makefile.config.in @@ -351,3 +351,10 @@ INTEL_JITEVENTS_LIBDIR := @INTEL_JITEVENTS_LIBDIR@ # Flags to control building support for OProfile JIT API USE_OPROFILE := @USE_OPROFILE@ + +ifeq ($(USE_INTEL_JITEVENTS), 1) + OPTIONAL_COMPONENTS += IntelJITEvents +endif +ifeq ($(USE_OPROFILE), 1) + OPTIONAL_COMPONENTS += OProfileJIT +endif diff --git a/llvm/Makefile.rules b/llvm/Makefile.rules index 0984dc0..70dd62d 100644 --- a/llvm/Makefile.rules +++ b/llvm/Makefile.rules @@ -100,6 +100,7 @@ $(LLVMBuildMakeFrag): $(PROJ_SRC_ROOT)/Makefile.rules \ $(Verb) $(LLVMBuildTool) \ --native-target "$(TARGET_NATIVE_ARCH)" \ --enable-targets "$(TARGETS_TO_BUILD)" \ + --enable-optional-components "$(OPTIONAL_COMPONENTS)" \ --write-library-table $(LLVMConfigLibraryDependenciesInc) \ --write-make-fragment $(LLVMBuildMakeFrag) diff --git a/llvm/docs/LLVMBuild.html b/llvm/docs/LLVMBuild.html index f39a8a6..a8420dd 100644 --- a/llvm/docs/LLVMBuild.html +++ b/llvm/docs/LLVMBuild.html @@ -272,6 +272,11 @@ required_libraries = Archive BitReader Core Support TransformUtils components. For example, the <i>X86</i> target might define a library group for all of the <i>X86</i> components. That library group might then be included in the <i>all-targets</i> library group.</p></li> + + <li><i>installed</i> <b>[optional]</b> <b>[boolean]</b> + <p>Whether this library is installed. Libraries that are not installed + are only reported by <tt>llvm-config</tt> when it is run as part of a + development directory.</p></li> </ul> </li> diff --git a/llvm/lib/ExecutionEngine/IntelJITEvents/LLVMBuild.txt b/llvm/lib/ExecutionEngine/IntelJITEvents/LLVMBuild.txt index 80d2273..9c06fda 100644 --- a/llvm/lib/ExecutionEngine/IntelJITEvents/LLVMBuild.txt +++ b/llvm/lib/ExecutionEngine/IntelJITEvents/LLVMBuild.txt @@ -18,6 +18,6 @@ [common] [component_0] -type = Library +type = OptionalLibrary name = IntelJITEvents parent = ExecutionEngine diff --git a/llvm/lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt b/llvm/lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt index 4516dfa..e30516e 100644 --- a/llvm/lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt +++ b/llvm/lib/ExecutionEngine/OProfileJIT/LLVMBuild.txt @@ -18,6 +18,6 @@ [common] [component_0] -type = Library +type = OptionalLibrary name = OProfileJIT parent = ExecutionEngine diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp index 79fd7f8..126542c4 100644 --- a/llvm/tools/llvm-config/llvm-config.cpp +++ b/llvm/tools/llvm-config/llvm-config.cpp @@ -54,7 +54,8 @@ using namespace llvm; static void VisitComponent(StringRef Name, const StringMap<AvailableComponent*> &ComponentMap, std::set<AvailableComponent*> &VisitedComponents, - std::vector<StringRef> &RequiredLibs) { + std::vector<StringRef> &RequiredLibs, + bool IncludeNonInstalled) { // Lookup the component. AvailableComponent *AC = ComponentMap.lookup(Name); assert(AC && "Invalid component name!"); @@ -65,10 +66,14 @@ static void VisitComponent(StringRef Name, return; } + // Only include non-installed components if requested. + if (!AC->IsInstalled && !IncludeNonInstalled) + return; + // Otherwise, visit all the dependencies. for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) { VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents, - RequiredLibs); + RequiredLibs, IncludeNonInstalled); } // Add to the required library list. @@ -83,8 +88,11 @@ static void VisitComponent(StringRef Name, /// \param Components - The names of the components to find libraries for. /// \param RequiredLibs [out] - On return, the ordered list of libraries that /// are required to link the given components. +/// \param IncludeNonInstalled - Whether non-installed components should be +/// reported. void ComputeLibsForComponents(const std::vector<StringRef> &Components, - std::vector<StringRef> &RequiredLibs) { + std::vector<StringRef> &RequiredLibs, + bool IncludeNonInstalled) { std::set<AvailableComponent*> VisitedComponents; // Build a map of component names to information. @@ -107,7 +115,7 @@ void ComputeLibsForComponents(const std::vector<StringRef> &Components, } VisitComponent(ComponentLower, ComponentMap, VisitedComponents, - RequiredLibs); + RequiredLibs, IncludeNonInstalled); } // The list is now ordered with leafs first, we want the libraries to printed @@ -278,6 +286,10 @@ int main(int argc, char **argv) { PrintLibFiles = true; } else if (Arg == "--components") { for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) { + // Only include non-installed components when in a development tree. + if (!AvailableComponents[j].IsInstalled && !IsInDevelopmentTree) + continue; + OS << ' '; OS << AvailableComponents[j].Name; } @@ -310,7 +322,8 @@ int main(int argc, char **argv) { // Construct the list of all the required libraries. std::vector<StringRef> RequiredLibs; - ComputeLibsForComponents(Components, RequiredLibs); + ComputeLibsForComponents(Components, RequiredLibs, + /*IncludeNonInstalled=*/IsInDevelopmentTree); for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) { StringRef Lib = RequiredLibs[i]; diff --git a/llvm/utils/llvm-build/llvmbuild/componentinfo.py b/llvm/utils/llvm-build/llvmbuild/componentinfo.py index 230ae21..e684ac2 100644 --- a/llvm/utils/llvm-build/llvmbuild/componentinfo.py +++ b/llvm/utils/llvm-build/llvmbuild/componentinfo.py @@ -68,6 +68,21 @@ class ComponentInfo(object): def get_llvmbuild_fragment(self): abstract + def get_parent_target_group(self): + """get_parent_target_group() -> ComponentInfo or None + + Return the nearest parent target group (if any), or None if the + component is not part of any target group. + """ + + # If this is a target group, return it. + if self.type_name == 'TargetGroup': + return self + + # Otherwise recurse on the parent, if any. + if self.parent_instance: + return self.parent_instance.get_parent_target_group() + class GroupComponentInfo(ComponentInfo): """ Group components have no semantics as far as the build system are concerned, @@ -95,16 +110,22 @@ class LibraryComponentInfo(ComponentInfo): type_name = 'Library' @staticmethod - def parse(subpath, items): + def parse_items(items): kwargs = ComponentInfo.parse_items(items) kwargs['library_name'] = items.get_optional_string('library_name') kwargs['required_libraries'] = items.get_list('required_libraries') kwargs['add_to_library_groups'] = items.get_list( 'add_to_library_groups') + kwargs['installed'] = items.get_optional_bool('installed', True) + return kwargs + + @staticmethod + def parse(subpath, items): + kwargs = LibraryComponentInfo.parse_items(items) return LibraryComponentInfo(subpath, **kwargs) def __init__(self, subpath, name, dependencies, parent, library_name, - required_libraries, add_to_library_groups): + required_libraries, add_to_library_groups, installed): ComponentInfo.__init__(self, subpath, name, dependencies, parent) # If given, the name to use for the library instead of deriving it from @@ -119,6 +140,9 @@ class LibraryComponentInfo(ComponentInfo): # considered part of. self.add_to_library_groups = list(add_to_library_groups) + # Whether or not this library is installed. + self.installed = installed + def get_component_references(self): for r in ComponentInfo.get_component_references(self): yield r @@ -140,6 +164,8 @@ class LibraryComponentInfo(ComponentInfo): if self.add_to_library_groups: print >>result, 'add_to_library_groups = %s' % ' '.join( self.add_to_library_groups) + if not self.installed: + print >>result, 'installed = 0' return result.getvalue() def get_library_name(self): @@ -165,6 +191,20 @@ class LibraryComponentInfo(ComponentInfo): def get_llvmconfig_component_name(self): return self.get_library_name().lower() +class OptionalLibraryComponentInfo(LibraryComponentInfo): + type_name = "OptionalLibrary" + + @staticmethod + def parse(subpath, items): + kwargs = LibraryComponentInfo.parse_items(items) + return OptionalLibraryComponentInfo(subpath, **kwargs) + + def __init__(self, subpath, name, dependencies, parent, library_name, + required_libraries, add_to_library_groups, installed): + LibraryComponentInfo.__init__(self, subpath, name, dependencies, parent, + library_name, required_libraries, + add_to_library_groups, installed) + class LibraryGroupComponentInfo(ComponentInfo): type_name = 'LibraryGroup' @@ -375,7 +415,7 @@ _component_type_map = dict( for t in (GroupComponentInfo, LibraryComponentInfo, LibraryGroupComponentInfo, ToolComponentInfo, BuildToolComponentInfo, - TargetGroupComponentInfo)) + TargetGroupComponentInfo, OptionalLibraryComponentInfo)) def load_from_path(path, subpath): # Load the LLVMBuild.txt file as an .ini format file. parser = ConfigParser.RawConfigParser() diff --git a/llvm/utils/llvm-build/llvmbuild/main.py b/llvm/utils/llvm-build/llvmbuild/main.py index 36bca87..baecc6d 100644 --- a/llvm/utils/llvm-build/llvmbuild/main.py +++ b/llvm/utils/llvm-build/llvmbuild/main.py @@ -312,15 +312,26 @@ subdirectories = %s f.close() - def write_library_table(self, output_path): + def write_library_table(self, output_path, enabled_optional_components): # Write out the mapping from component names to required libraries. # # We do this in topological order so that we know we can append the # dependencies for added library groups. entries = {} for c in self.ordered_component_infos: + # Skip optional components which are not enabled. + if c.type_name == 'OptionalLibrary' \ + and c.name not in enabled_optional_components: + continue + + # Skip target groups which are not enabled. + tg = c.get_parent_target_group() + if tg and not tg.enabled: + continue + # Only certain components are in the table. - if c.type_name not in ('Library', 'LibraryGroup', 'TargetGroup'): + if c.type_name not in ('Library', 'OptionalLibrary', \ + 'LibraryGroup', 'TargetGroup'): continue # Compute the llvm-config "component name". For historical reasons, @@ -328,10 +339,12 @@ subdirectories = %s llvmconfig_component_name = c.get_llvmconfig_component_name() # Get the library name, or None for LibraryGroups. - if c.type_name == 'Library': + 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 = [ @@ -344,7 +357,8 @@ 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() @@ -352,16 +366,16 @@ subdirectories = %s # 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)) @@ -382,18 +396,21 @@ subdirectories = %s print >>f, ' /// The name of the library for this component (or NULL).' print >>f, ' const char *Library;' print >>f, '' + print >>f, ' /// Whether the component is installed.' + print >>f, ' bool IsInstalled;' + 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: + 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, + print >>f, ' { "%s", %s, %d, { %s } },' % ( + name, library_name_as_cstr, is_installed, ', '.join('"%s"' % dep for dep in required_names)) print >>f, '};' @@ -778,6 +795,11 @@ given by --build-root) at the same SUBPATH""", help=("Enable the given space or semi-colon separated " "list of targets, or all targets if not present"), action="store", default=None) + group.add_option("", "--enable-optional-components", + dest="optional_components", metavar="NAMES", + help=("Enable the given space or semi-colon separated " + "list of optional components"), + action="store", default=None) parser.add_option_group(group) (opts, args) = parser.parse_args() @@ -819,7 +841,8 @@ given by --build-root) at the same SUBPATH""", # Write out the required library table, if requested. if opts.write_library_table: - project_info.write_library_table(opts.write_library_table) + project_info.write_library_table(opts.write_library_table, + opts.optional_components) # Write out the make fragment, if requested. if opts.write_make_fragment: diff --git a/llvm/utils/unittest/LLVMBuild.txt b/llvm/utils/unittest/LLVMBuild.txt index 2810567..c276dd6 100644 --- a/llvm/utils/unittest/LLVMBuild.txt +++ b/llvm/utils/unittest/LLVMBuild.txt @@ -20,9 +20,11 @@ type = Library name = gtest parent = Libraries required_libraries = Support +installed = 0 [component_1] type = Library name = gtest_main parent = Libraries required_libraries = gtest +installed = 0 |