The Gaudi Framework  v29r0 (ff2e7097)
listcomponents.cpp File Reference
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <list>
#include <memory>
#include <set>
#include <string>
#include <dlfcn.h>
#include <getopt.h>
#include <Gaudi/PluginService.h>
Include dependency graph for listcomponents.cpp:

Go to the source code of this file.

Functions

void help (std::string argv0)
 
void usage (std::string argv0)
 
int main (int argc, char *argv[])
 

Function Documentation

void help ( std::string  argv0)
Author
Marco Clemencic marco.nosp@m..cle.nosp@m.menci.nosp@m.c@ce.nosp@m.rn.ch

Definition at line 27 of file listcomponents.cpp.

28 {
29  std::cout << "Usage: " << argv0 << " [option] library1 [library2 ...]\n"
30  "\n list the component factories present in the given libraries\n\n"
31  "Options:\n\n"
32  " -h, --help show this help message and exit\n"
33  " -o OUTPUT, --output OUTPUT\n"
34  " write the list of factories on the file OUTPUT, use - for\n"
35  " standard output (default)\n"
36  << std::endl;
37 }
T endl(T...args)
int main ( int  argc,
char *  argv[] 
)

Definition at line 47 of file listcomponents.cpp.

48 {
51 
52  // cache to keep track of the loaded factories
54  // initialize the local cache
55  for ( const auto& elem : reg.loadedFactories() ) loaded.emplace( elem, "<preloaded>" );
56 
57  // Parse command line
58  std::list<char*> libs;
59  std::string output_opt( "-" );
60  {
61  std::string argv0( argv[0] );
62  {
63  auto i = argv0.rfind( '/' );
64  if ( i != std::string::npos ) argv0 = argv0.substr( i + 1 );
65  }
66 
67  int i = 1;
68  while ( i < argc ) {
69  const std::string arg( argv[i] );
70  if ( arg == "-o" || arg == "--output" ) {
71  if ( ++i < argc ) {
72  output_opt = argv[i];
73  } else {
74  std::cerr << "ERROR: missing argument for option " << arg << std::endl;
75  std::cerr << "See `" << argv0 << " -h' for more details." << std::endl;
76  return EXIT_FAILURE;
77  }
78  } else if ( arg == "-h" || arg == "--help" ) {
79  help( argv0 );
80  return EXIT_SUCCESS;
81  } else {
82  libs.push_back( argv[i] );
83  }
84  ++i;
85  }
86  if ( libs.empty() ) {
87  usage( argv0 );
88  return EXIT_FAILURE;
89  }
90  }
91 
92  // handle output option
94  if ( output_opt != "-" ) {
95  output_file.reset( new std::ofstream{output_opt} );
96  }
97  std::ostream& output = ( output_file ? *output_file : std::cout );
98 
99  // loop over the list of libraries passed on the command line
100  for ( char* lib : libs ) {
101  if ( dlopen( lib, RTLD_LAZY | RTLD_LOCAL ) ) {
102  for ( const auto& factory : reg.loadedFactories() ) {
103  auto f = loaded.find( factory );
104  if ( f == loaded.end() ) {
105  output << lib << ":" << factory << std::endl;
106  loaded.emplace( factory, lib );
107  } else
108  std::cerr << "WARNING: factory '" << factory << "' already found in " << f->second << std::endl;
109  }
110  } else {
111  std::cerr << "ERROR: failed to load " << lib << ": " << dlerror() << std::endl;
112  return EXIT_FAILURE;
113  }
114  }
115  return EXIT_SUCCESS;
116 }
T empty(T...args)
list argv
Definition: gaudirun.py:235
T endl(T...args)
void usage(std::string argv0)
T end(T...args)
STL class.
std::set< KeyType > loadedFactories() const
Return a list of all the known and loaded factories.
STL class.
T push_back(T...args)
STL class.
void help(std::string argv0)
T reset(T...args)
STL class.
T find(T...args)
static Registry & instance()
Retrieve the singleton instance of Registry.
T emplace(T...args)
In-memory database of the loaded factories.
void usage ( std::string  argv0)

Definition at line 39 of file listcomponents.cpp.

40 {
41  std::cout << "Usage: " << argv0 << " [option] library1 [library2 ...]\n"
42  "Try `"
43  << argv0 << " -h' for more information.\n"
44  << std::endl;
45 }
T endl(T...args)