#include <cstdlib>
#include <fstream>
#include <iostream>
#include <list>
#include <memory>
#include <string>
#include <dlfcn.h>
#include <getopt.h>
#include <Gaudi/PluginService.h>
#include <Gaudi/PluginServiceV1.h>
Go to the source code of this file.
|
void | help (const std::string &argv0) |
|
void | usage (const std::string &argv0) |
|
int | main (int argc, char *argv[]) |
|
◆ GAUDI_PLUGIN_SERVICE_V2
#define GAUDI_PLUGIN_SERVICE_V2 |
◆ help()
void help |
( |
const std::string & |
argv0 | ) |
|
Definition at line 28 of file listcomponents.cpp.
29 std::cout <<
"Usage: " << argv0
30 <<
" [option] library1 [library2 ...]\n"
31 "\n list the component factories present in the given libraries\n\n"
33 " -h, --help show this help message and exit\n"
34 " -o OUTPUT, --output OUTPUT\n"
35 " write the list of factories on the file OUTPUT, use - for\n"
36 " standard output (default)\n"
◆ main()
int main |
( |
int |
argc, |
|
|
char * |
argv[] |
|
) |
| |
Definition at line 48 of file listcomponents.cpp.
49 auto& reg2 = Gaudi::PluginService::v2::Details::Registry::instance();
52 using key_type = Gaudi::PluginService::v2::Details::Registry::KeyType;
55 std::map<key_type, std::string> loaded;
57 for (
const auto&
name : reg2.loadedFactoryNames() ) loaded.emplace(
name,
"<preloaded>" );
58 for (
const auto&
name : reg1.loadedFactoryNames() ) loaded.emplace(
name,
"<preloaded>" );
61 std::list<char*> libs;
62 std::string output_opt(
"-" );
64 std::string argv0(
argv[0] );
66 auto i = argv0.rfind(
'/' );
67 if ( i != std::string::npos ) argv0 = argv0.substr( i + 1 );
72 const std::string arg(
argv[i] );
73 if ( arg ==
"-o" || arg ==
"--output" ) {
77 std::cerr <<
"ERROR: missing argument for option " << arg << std::endl;
78 std::cerr <<
"See `" << argv0 <<
" -h' for more details." << std::endl;
81 }
else if ( arg ==
"-h" || arg ==
"--help" ) {
85 libs.push_back(
argv[i] );
96 std::unique_ptr<std::ostream> output_file;
97 if ( output_opt !=
"-" ) { output_file.reset(
new std::ofstream{ output_opt } ); }
98 std::ostream&
output = ( output_file ? *output_file : std::cout );
100 auto dump_from = [&
output, &loaded](
const auto& reg,
const char* lib,
const char*
prefix ) {
101 for (
const auto& factoryName : reg.loadedFactoryNames() ) {
104 const auto& info = reg.factories().find( factoryName )->second;
105 if ( lib != info.library && !info.library.empty() && info.library !=
"unknown" ) {
106 std::cerr <<
"WARNING: library [" << lib <<
"] exposes factory [" << factoryName <<
"] which is declared in ["
107 << info.library <<
"] !!" << std::endl;
110 auto f = loaded.find( factoryName );
111 if ( f == loaded.end() ) {
112 output <<
prefix <<
"::" << lib <<
":" << factoryName << std::endl;
113 loaded.emplace( factoryName, lib );
115 std::cerr <<
"WARNING: factory '" << factoryName <<
"' already found in " << f->second << std::endl;
120 for (
const char* lib : libs ) {
121 if ( dlopen( lib, RTLD_LAZY | RTLD_LOCAL ) ) {
122 dump_from( reg2, lib,
"v2" );
123 dump_from( reg1, lib,
"v1" );
125 std::cerr <<
"ERROR: failed to load " << lib <<
": " << dlerror() << std::endl;
◆ usage()
void usage |
( |
const std::string & |
argv0 | ) |
|
Definition at line 40 of file listcomponents.cpp.
41 std::cout <<
"Usage: " << argv0
42 <<
" [option] library1 [library2 ...]\n"
44 << argv0 <<
" -h' for more information.\n"