llvm-build: Add support for non-installed libraries (e.g., gtest).
 - 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
diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
index 79fd7f8..126542c 100644
--- a/tools/llvm-config/llvm-config.cpp
+++ b/tools/llvm-config/llvm-config.cpp
@@ -54,7 +54,8 @@
 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 @@
     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 @@
 /// \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 @@
     }
 
     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 @@
         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 @@
 
     // 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];