llvm-build: Add support for non-installed libraries (e.g., gtest).
authorDaniel Dunbar <daniel@zuster.org>
Tue, 15 May 2012 18:44:17 +0000 (18:44 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 15 May 2012 18:44:17 +0000 (18:44 +0000)
 - These libraries are only reported by llvm-config when run from a development
   tree.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156838 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LLVMBuild.html
tools/llvm-config/llvm-config.cpp
utils/llvm-build/llvmbuild/componentinfo.py
utils/llvm-build/llvmbuild/main.py
utils/unittest/LLVMBuild.txt

index 43726a1a0ff5e9aee4ca106f453a2a2d8c1165f9..9e7f8c7657758a1c5d1d443c54e2a00cd2944e5e 100644 (file)
@@ -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>
 
index 79fd7f8c5aec5636b430914d2e73ca490861b2cc..126542c4ecb7c8a099e2de7c8fd60a97d7232b66 100644 (file)
@@ -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];
index c32cc1aeb0663cd7616e9b24fdb861f44bde2fa1..e684ac2b7d21ca90e4a355dca607a30855e5b9ec 100644 (file)
@@ -116,6 +116,7 @@ class LibraryComponentInfo(ComponentInfo):
         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
@@ -124,7 +125,7 @@ class LibraryComponentInfo(ComponentInfo):
         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
@@ -139,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
@@ -160,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):
@@ -194,10 +200,10 @@ class OptionalLibraryComponentInfo(LibraryComponentInfo):
       return OptionalLibraryComponentInfo(subpath, **kwargs)
 
     def __init__(self, subpath, name, dependencies, parent, library_name,
-                 required_libraries, add_to_library_groups):
+                 required_libraries, add_to_library_groups, installed):
       LibraryComponentInfo.__init__(self, subpath, name, dependencies, parent,
                                     library_name, required_libraries,
-                                    add_to_library_groups)
+                                    add_to_library_groups, installed)
 
 class LibraryGroupComponentInfo(ComponentInfo):
     type_name = 'LibraryGroup'
index 48b59bdac38cf84a8f7de7822f9365dd744c8c1a..baecc6d899651704693af85f05d12bc83c33a77f 100644 (file)
@@ -341,8 +341,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,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()
@@ -363,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))
@@ -393,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, '};'
index 2810567f4ae557caee8f26d58735cc411f78b5f3..c276dd6e720ada591fbf64b4d09156895347aff3 100644 (file)
@@ -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