listcomponents.cpp File Reference
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <list>
#include <memory>
#include <cstdlib>
#include <getopt.h>
#include <dlfcn.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.

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

Definition at line 44 of file listcomponents.cpp.

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

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