Home | History | Annotate | Download | only in llvm-config
      1 //===-- llvm-config.cpp - LLVM project configuration utility --------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This tool encapsulates information about an LLVM project configuration for
     11 // use by other project's build environments (to determine installed path,
     12 // available features, required libraries, etc.).
     13 //
     14 // Note that although this tool *may* be used by some parts of LLVM's build
     15 // itself (i.e., the Makefiles use it to compute required libraries when linking
     16 // tools), this tool is primarily designed to support external projects.
     17 //
     18 //===----------------------------------------------------------------------===//
     19 
     20 #include "llvm/ADT/STLExtras.h"
     21 #include "llvm/ADT/StringMap.h"
     22 #include "llvm/ADT/StringRef.h"
     23 #include "llvm/ADT/Twine.h"
     24 #include "llvm/Config/config.h"
     25 #include "llvm/Config/llvm-config.h"
     26 #include "llvm/Support/FileSystem.h"
     27 #include "llvm/Support/Path.h"
     28 #include "llvm/Support/raw_ostream.h"
     29 #include <cstdlib>
     30 #include <set>
     31 #include <vector>
     32 
     33 using namespace llvm;
     34 
     35 // Include the build time variables we can report to the user. This is generated
     36 // at build time from the BuildVariables.inc.in file by the build system.
     37 #include "BuildVariables.inc"
     38 
     39 // Include the component table. This creates an array of struct
     40 // AvailableComponent entries, which record the component name, library name,
     41 // and required components for all of the available libraries.
     42 //
     43 // Not all components define a library, we also use "library groups" as a way to
     44 // create entries for pseudo groups like x86 or all-targets.
     45 #include "LibraryDependencies.inc"
     46 
     47 /// \brief Traverse a single component adding to the topological ordering in
     48 /// \arg RequiredLibs.
     49 ///
     50 /// \param Name - The component to traverse.
     51 /// \param ComponentMap - A prebuilt map of component names to descriptors.
     52 /// \param VisitedComponents [in] [out] - The set of already visited components.
     53 /// \param RequiredLibs [out] - The ordered list of required libraries.
     54 static void VisitComponent(StringRef Name,
     55                            const StringMap<AvailableComponent*> &ComponentMap,
     56                            std::set<AvailableComponent*> &VisitedComponents,
     57                            std::vector<StringRef> &RequiredLibs,
     58                            bool IncludeNonInstalled) {
     59   // Lookup the component.
     60   AvailableComponent *AC = ComponentMap.lookup(Name);
     61   assert(AC && "Invalid component name!");
     62 
     63   // Add to the visited table.
     64   if (!VisitedComponents.insert(AC).second) {
     65     // We are done if the component has already been visited.
     66     return;
     67   }
     68 
     69   // Only include non-installed components if requested.
     70   if (!AC->IsInstalled && !IncludeNonInstalled)
     71     return;
     72 
     73   // Otherwise, visit all the dependencies.
     74   for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) {
     75     VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents,
     76                    RequiredLibs, IncludeNonInstalled);
     77   }
     78 
     79   // Add to the required library list.
     80   if (AC->Library)
     81     RequiredLibs.push_back(AC->Library);
     82 }
     83 
     84 /// \brief Compute the list of required libraries for a given list of
     85 /// components, in an order suitable for passing to a linker (that is, libraries
     86 /// appear prior to their dependencies).
     87 ///
     88 /// \param Components - The names of the components to find libraries for.
     89 /// \param RequiredLibs [out] - On return, the ordered list of libraries that
     90 /// are required to link the given components.
     91 /// \param IncludeNonInstalled - Whether non-installed components should be
     92 /// reported.
     93 void ComputeLibsForComponents(const std::vector<StringRef> &Components,
     94                               std::vector<StringRef> &RequiredLibs,
     95                               bool IncludeNonInstalled) {
     96   std::set<AvailableComponent*> VisitedComponents;
     97 
     98   // Build a map of component names to information.
     99   StringMap<AvailableComponent*> ComponentMap;
    100   for (unsigned i = 0; i != array_lengthof(AvailableComponents); ++i) {
    101     AvailableComponent *AC = &AvailableComponents[i];
    102     ComponentMap[AC->Name] = AC;
    103   }
    104 
    105   // Visit the components.
    106   for (unsigned i = 0, e = Components.size(); i != e; ++i) {
    107     // Users are allowed to provide mixed case component names.
    108     std::string ComponentLower = Components[i].lower();
    109 
    110     // Validate that the user supplied a valid component name.
    111     if (!ComponentMap.count(ComponentLower)) {
    112       llvm::errs() << "llvm-config: unknown component name: " << Components[i]
    113                    << "\n";
    114       exit(1);
    115     }
    116 
    117     VisitComponent(ComponentLower, ComponentMap, VisitedComponents,
    118                    RequiredLibs, IncludeNonInstalled);
    119   }
    120 
    121   // The list is now ordered with leafs first, we want the libraries to printed
    122   // in the reverse order of dependency.
    123   std::reverse(RequiredLibs.begin(), RequiredLibs.end());
    124 }
    125 
    126 /* *** */
    127 
    128 void usage() {
    129   errs() << "\
    130 usage: llvm-config <OPTION>... [<COMPONENT>...]\n\
    131 \n\
    132 Get various configuration information needed to compile programs which use\n\
    133 LLVM.  Typically called from 'configure' scripts.  Examples:\n\
    134   llvm-config --cxxflags\n\
    135   llvm-config --ldflags\n\
    136   llvm-config --libs engine bcreader scalaropts\n\
    137 \n\
    138 Options:\n\
    139   --version         Print LLVM version.\n\
    140   --prefix          Print the installation prefix.\n\
    141   --src-root        Print the source root LLVM was built from.\n\
    142   --obj-root        Print the object root used to build LLVM.\n\
    143   --bindir          Directory containing LLVM executables.\n\
    144   --includedir      Directory containing LLVM headers.\n\
    145   --libdir          Directory containing LLVM libraries.\n\
    146   --cppflags        C preprocessor flags for files that include LLVM headers.\n\
    147   --cflags          C compiler flags for files that include LLVM headers.\n\
    148   --cxxflags        C++ compiler flags for files that include LLVM headers.\n\
    149   --ldflags         Print Linker flags.\n\
    150   --libs            Libraries needed to link against LLVM components.\n\
    151   --libnames        Bare library names for in-tree builds.\n\
    152   --libfiles        Fully qualified library filenames for makefile depends.\n\
    153   --components      List of all possible components.\n\
    154   --targets-built   List of all targets currently built.\n\
    155   --host-target     Target triple used to configure LLVM.\n\
    156   --build-mode      Print build mode of LLVM tree (e.g. Debug or Release).\n\
    157 Typical components:\n\
    158   all               All LLVM libraries (default).\n\
    159   engine            Either a native JIT or a bitcode interpreter.\n";
    160   exit(1);
    161 }
    162 
    163 /// \brief Compute the path to the main executable.
    164 std::string GetExecutablePath(const char *Argv0) {
    165   // This just needs to be some symbol in the binary; C++ doesn't
    166   // allow taking the address of ::main however.
    167   void *P = (void*) (intptr_t) GetExecutablePath;
    168   return llvm::sys::fs::getMainExecutable(Argv0, P);
    169 }
    170 
    171 int main(int argc, char **argv) {
    172   std::vector<StringRef> Components;
    173   bool PrintLibs = false, PrintLibNames = false, PrintLibFiles = false;
    174   bool HasAnyOption = false;
    175 
    176   // llvm-config is designed to support being run both from a development tree
    177   // and from an installed path. We try and auto-detect which case we are in so
    178   // that we can report the correct information when run from a development
    179   // tree.
    180   bool IsInDevelopmentTree;
    181   enum { MakefileStyle, CMakeStyle, CMakeBuildModeStyle } DevelopmentTreeLayout;
    182   llvm::SmallString<256> CurrentPath(GetExecutablePath(argv[0]));
    183   std::string CurrentExecPrefix;
    184   std::string ActiveObjRoot;
    185 
    186   // Create an absolute path, and pop up one directory (we expect to be inside a
    187   // bin dir).
    188   sys::fs::make_absolute(CurrentPath);
    189   CurrentExecPrefix = sys::path::parent_path(
    190     sys::path::parent_path(CurrentPath)).str();
    191 
    192   // Check to see if we are inside a development tree by comparing to possible
    193   // locations (prefix style or CMake style).
    194   if (sys::fs::equivalent(CurrentExecPrefix,
    195                           Twine(LLVM_OBJ_ROOT) + "/" + LLVM_BUILDMODE)) {
    196     IsInDevelopmentTree = true;
    197     DevelopmentTreeLayout = MakefileStyle;
    198 
    199     // If we are in a development tree, then check if we are in a BuildTools
    200     // directory. This indicates we are built for the build triple, but we
    201     // always want to provide information for the host triple.
    202     if (sys::path::filename(LLVM_OBJ_ROOT) == "BuildTools") {
    203       ActiveObjRoot = sys::path::parent_path(LLVM_OBJ_ROOT);
    204     } else {
    205       ActiveObjRoot = LLVM_OBJ_ROOT;
    206     }
    207   } else if (sys::fs::equivalent(CurrentExecPrefix, LLVM_OBJ_ROOT)) {
    208     IsInDevelopmentTree = true;
    209     DevelopmentTreeLayout = CMakeStyle;
    210     ActiveObjRoot = LLVM_OBJ_ROOT;
    211   } else if (sys::fs::equivalent(CurrentExecPrefix,
    212                                  Twine(LLVM_OBJ_ROOT) + "/bin")) {
    213     IsInDevelopmentTree = true;
    214     DevelopmentTreeLayout = CMakeBuildModeStyle;
    215     ActiveObjRoot = LLVM_OBJ_ROOT;
    216   } else {
    217     IsInDevelopmentTree = false;
    218     DevelopmentTreeLayout = MakefileStyle; // Initialized to avoid warnings.
    219   }
    220 
    221   // Compute various directory locations based on the derived location
    222   // information.
    223   std::string ActivePrefix, ActiveBinDir, ActiveIncludeDir, ActiveLibDir;
    224   std::string ActiveIncludeOption;
    225   if (IsInDevelopmentTree) {
    226     ActiveIncludeDir = std::string(LLVM_SRC_ROOT) + "/include";
    227     ActivePrefix = CurrentExecPrefix;
    228 
    229     // CMake organizes the products differently than a normal prefix style
    230     // layout.
    231     switch (DevelopmentTreeLayout) {
    232     case MakefileStyle:
    233       ActiveBinDir = ActiveObjRoot + "/" + LLVM_BUILDMODE + "/bin";
    234       ActiveLibDir = ActiveObjRoot + "/" + LLVM_BUILDMODE + "/lib";
    235       break;
    236     case CMakeStyle:
    237       ActiveBinDir = ActiveObjRoot + "/bin";
    238       ActiveLibDir = ActiveObjRoot + "/lib";
    239       break;
    240     case CMakeBuildModeStyle:
    241       ActiveBinDir = ActiveObjRoot + "/bin/" + LLVM_BUILDMODE;
    242       ActiveLibDir = ActiveObjRoot + "/lib/" + LLVM_BUILDMODE;
    243       break;
    244     }
    245 
    246     // We need to include files from both the source and object trees.
    247     ActiveIncludeOption = ("-I" + ActiveIncludeDir + " " +
    248                            "-I" + ActiveObjRoot + "/include");
    249   } else {
    250     ActivePrefix = CurrentExecPrefix;
    251     ActiveIncludeDir = ActivePrefix + "/include";
    252     ActiveBinDir = ActivePrefix + "/bin";
    253     ActiveLibDir = ActivePrefix + "/lib";
    254     ActiveIncludeOption = "-I" + ActiveIncludeDir;
    255   }
    256 
    257   raw_ostream &OS = outs();
    258   for (int i = 1; i != argc; ++i) {
    259     StringRef Arg = argv[i];
    260 
    261     if (Arg.startswith("-")) {
    262       HasAnyOption = true;
    263       if (Arg == "--version") {
    264         OS << PACKAGE_VERSION << '\n';
    265       } else if (Arg == "--prefix") {
    266         OS << ActivePrefix << '\n';
    267       } else if (Arg == "--bindir") {
    268         OS << ActiveBinDir << '\n';
    269       } else if (Arg == "--includedir") {
    270         OS << ActiveIncludeDir << '\n';
    271       } else if (Arg == "--libdir") {
    272         OS << ActiveLibDir << '\n';
    273       } else if (Arg == "--cppflags") {
    274         OS << ActiveIncludeOption << ' ' << LLVM_CPPFLAGS << '\n';
    275       } else if (Arg == "--cflags") {
    276         OS << ActiveIncludeOption << ' ' << LLVM_CFLAGS << '\n';
    277       } else if (Arg == "--cxxflags") {
    278         OS << ActiveIncludeOption << ' ' << LLVM_CXXFLAGS << '\n';
    279       } else if (Arg == "--ldflags") {
    280         OS << "-L" << ActiveLibDir << ' ' << LLVM_LDFLAGS
    281            << ' ' << LLVM_SYSTEM_LIBS << '\n';
    282       } else if (Arg == "--libs") {
    283         PrintLibs = true;
    284       } else if (Arg == "--libnames") {
    285         PrintLibNames = true;
    286       } else if (Arg == "--libfiles") {
    287         PrintLibFiles = true;
    288       } else if (Arg == "--components") {
    289         for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) {
    290           // Only include non-installed components when in a development tree.
    291           if (!AvailableComponents[j].IsInstalled && !IsInDevelopmentTree)
    292             continue;
    293 
    294           OS << ' ';
    295           OS << AvailableComponents[j].Name;
    296         }
    297         OS << '\n';
    298       } else if (Arg == "--targets-built") {
    299         OS << LLVM_TARGETS_BUILT << '\n';
    300       } else if (Arg == "--host-target") {
    301         OS << LLVM_DEFAULT_TARGET_TRIPLE << '\n';
    302       } else if (Arg == "--build-mode") {
    303         OS << LLVM_BUILDMODE << '\n';
    304       } else if (Arg == "--obj-root") {
    305         OS << LLVM_OBJ_ROOT << '\n';
    306       } else if (Arg == "--src-root") {
    307         OS << LLVM_SRC_ROOT << '\n';
    308       } else {
    309         usage();
    310       }
    311     } else {
    312       Components.push_back(Arg);
    313     }
    314   }
    315 
    316   if (!HasAnyOption)
    317     usage();
    318 
    319   if (PrintLibs || PrintLibNames || PrintLibFiles) {
    320     // If no components were specified, default to "all".
    321     if (Components.empty())
    322       Components.push_back("all");
    323 
    324     // Construct the list of all the required libraries.
    325     std::vector<StringRef> RequiredLibs;
    326     ComputeLibsForComponents(Components, RequiredLibs,
    327                              /*IncludeNonInstalled=*/IsInDevelopmentTree);
    328 
    329     for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) {
    330       StringRef Lib = RequiredLibs[i];
    331       if (i)
    332         OS << ' ';
    333 
    334       if (PrintLibNames) {
    335         OS << Lib;
    336       } else if (PrintLibFiles) {
    337         OS << ActiveLibDir << '/' << Lib;
    338       } else if (PrintLibs) {
    339         // If this is a typical library name, include it using -l.
    340         if (Lib.startswith("lib") && Lib.endswith(".a")) {
    341           OS << "-l" << Lib.slice(3, Lib.size()-2);
    342           continue;
    343         }
    344 
    345         // Otherwise, print the full path.
    346         OS << ActiveLibDir << '/' << Lib;
    347       }
    348     }
    349     OS << '\n';
    350   } else if (!Components.empty()) {
    351     errs() << "llvm-config: error: components given, but unused\n\n";
    352     usage();
    353   }
    354 
    355   return 0;
    356 }
    357