| The Gaudi Framework v32r1 (f65d50dc)

Macros | Functions
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 <Gaudi/PluginServiceV1.h>`
Include dependency graph for listcomponents.cpp:

Go to the source code of this file.

## Macros
#define | GAUDI_PLUGIN_SERVICE_V2

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

## Macro Definition Documentation

## ◆ GAUDI_PLUGIN_SERVICE_V2

#define GAUDI_PLUGIN_SERVICE_V2

Author
  Marco Clemencic marco.nosp@m..cle.nosp@m.menci.nosp@m.c@ce.nosp@m.rn.ch

Definition at line 25 of file listcomponents.cpp.

## Function Documentation

## ◆ help()

void help | ( | std::string | argv0 | ) |

Definition at line 29 of file listcomponents.cpp.

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

## ◆ main()

int main | ( | int | argc,
|  | char * | argv[]
| ) |  |

Definition at line 49 of file listcomponents.cpp.

49 {
50 auto& reg2 = Gaudi::PluginService::v2::Details::Registry::instance();
51 auto& reg1 = Gaudi::PluginService::v1::Details::Registry::instance();
52
53 using key_type = Gaudi::PluginService::v2::Details::Registry::KeyType;
54
55 // cache to keep track of the loaded factories
56 std::map<key_type, std::string> loaded;
57 // initialize the local cache
58 for ( const auto& name : reg2.loadedFactoryNames() ) loaded.emplace( name, "<preloaded>" );
59 for ( const auto& name : reg1.loadedFactoryNames() ) loaded.emplace( name, "<preloaded>" );
60
61 // Parse command line
62 std::list<char*> libs;
63 std::string output_opt( "-" );
64 {
65 std::string argv0( argv[0] );
66 {
67 auto i = argv0.rfind( '/' );
68 if ( i != std::string::npos ) argv0 = argv0.substr( i + 1 );
69 }
70
71 int i = 1;
72 while ( i < argc ) {
73 const std::string arg( argv[i] );
74 if ( arg == "-o" || arg == "--output" ) {
75 if ( ++i < argc ) {
76 output_opt = argv[i];
77 } else {
78 std::cerr << "ERROR: missing argument for option " << arg << std::endl;
79 std::cerr << "See `" << argv0 << " -h' for more details." << std::endl;
80 return EXIT_FAILURE;
81 }
82 } else if ( arg == "-h" || arg == "--help" ) {
83 help( argv0 );
84 return EXIT_SUCCESS;
85 } else {
86 libs.push_back( argv[i] );
87 }
88 ++i;
89 }
90 if ( libs.empty() ) {
91 usage( argv0 );
92 return EXIT_FAILURE;
93 }
94 }
95
96 // handle output option
97 std::unique_ptr<std::ostream> output_file;
98 if ( output_opt != "-" ) { output_file.reset( new std::ofstream{output_opt} ); }
99 std::ostream& output = ( output_file ? *output_file : std::cout );
100
101 auto dump_from = [&output, &loaded]( auto& reg, const char* lib, const char* prefix ) {
102 for ( const auto& factoryName : reg.loadedFactoryNames() ) {
103 auto f = loaded.find( factoryName );
104 if ( f == loaded.end() ) {
105 output << prefix << "::" << lib << ":" << factoryName << std::endl;
106 loaded.emplace( factoryName, lib );
107 } else
108 std::cerr << "WARNING: factory '" << factoryName << "' already found in " << f->second << std::endl;
109 }
110 };
111
112 // loop over the list of libraries passed on the command line
113 for ( const char* lib : libs ) {
114 if ( dlopen( lib, RTLD_LAZY | RTLD_LOCAL ) ) {
115 dump_from( reg2, lib, "v2" );
116 dump_from( reg1, lib, "v1" );
117 } else {
118 std::cerr << "ERROR: failed to load " << lib << ": " << dlerror() << std::endl;
119 return EXIT_FAILURE;
120 }
121 }
122 return EXIT_SUCCESS;
123 }
std::list::empty
T empty(T... args)
Gaudi::PluginService::v1::Details::Registry::instance
static Registry & instance()
Retrieve the singleton instance of Registry.
Definition: PluginServiceV1.cpp:136
gaudiComponentHelp.name
name
Definition: gaudiComponentHelp.py:41
gaudirun.output
output
Definition: gaudirun.py:484
gaudirun.argv
list argv
Definition: gaudirun.py:298
std::endl
T endl(T... args)
usage
void usage(std::string argv0)
Definition: listcomponents.cpp:41
std::map::end
T end(T... args)
std::map
STL class.
std::string
STL class.
std::list::push_back
T push_back(T... args)
std::ofstream
STL class.
help
void help(std::string argv0)
Definition: listcomponents.cpp:29
gaudirun.prefix
string prefix
Definition: gaudirun.py:331
std::unique_ptr::reset
T reset(T... args)
std::list
STL class.
plotBacklogPyRoot.argc
argc
Definition: plotBacklogPyRoot.py:142
std::map::find
T find(T... args)
std::unique_ptr
STL class.
std::map::emplace
T emplace(T... args)
std::cerr

## ◆ usage()

void usage | ( | std::string | argv0 | ) |

Definition at line 41 of file listcomponents.cpp.

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