14# pragma warning( disable : 279 )
37#include <boost/algorithm/string/case_conv.hpp>
38#include <boost/algorithm/string/classification.hpp>
39#include <boost/algorithm/string/replace.hpp>
40#include <boost/algorithm/string/split.hpp>
41#include <boost/algorithm/string/trim.hpp>
42#include <boost/filesystem/exception.hpp>
43#include <boost/filesystem/operations.hpp>
44#include <boost/log/core.hpp>
45#include <boost/log/expressions.hpp>
46#include <boost/log/trivial.hpp>
47#include <boost/log/utility/setup/common_attributes.hpp>
48#include <boost/log/utility/setup/console.hpp>
49#include <boost/program_options.hpp>
50#include <boost/regex.hpp>
51#include <boost/tokenizer.hpp>
54#include <fmt/format.h>
62namespace po = boost::program_options;
63namespace fs = boost::filesystem;
65#define LOG_ERROR BOOST_LOG_TRIVIAL( error )
66#define LOG_WARNING BOOST_LOG_TRIVIAL( warning )
67#define LOG_INFO BOOST_LOG_TRIVIAL( info )
80 std::string quote( std::string_view sv ) {
82 s << std::quoted( sv,
'\'' );
86 const std::string py_tab =
" ";
90 const boost::regex pythonIdentifier(
"^[a-zA-Z_][a-zA-Z0-9_]*$" );
93 enum class component_t {
112 const std::map<std::string, component_t> allowedFactories{
113 {
typeid( Gaudi::Algorithm::Factory::FactoryType ).name(), component_t::Algorithm },
114 {
typeid( Service::Factory::FactoryType ).name(), component_t::Service },
115 {
typeid( AlgTool::Factory::FactoryType ).name(), component_t::AlgTool },
117 {
typeid( Gaudi::Auditor::Factory::FactoryType ).name(), component_t::Auditor },
120 const std::string& toString( component_t type ) {
121 static const std::array<std::string, 11> names = {
"Module",
"DefaultName",
"Algorithm",
"AlgTool",
122 "Auditor",
"Service",
"ApplicationMgr",
"IInterface",
123 "Converter",
"DataObject",
"Unknown" };
124 return names.at(
static_cast<std::underlying_type_t<component_t>
>( type ) );
126 std::ostream&
operator<<( std::ostream& os, component_t type ) {
return os << toString( type ); }
128 std::set<std::string> ignored_interfaces{
129 {
"IInterface",
"IProperty",
"INamedInterface",
"IAlgorithm",
"IAlgTool",
"IService",
"IAuditor" } };
133 std::string pythonizeName(
const std::string& name ) {
134 static const string in(
"<>&*,: ()." );
135 static const string out(
"__rp__s___" );
136 auto r = boost::algorithm::replace_all_copy( name,
", ",
"," );
137 for (
auto& c : r ) {
138 auto rep = in.find( c );
139 if ( rep != string::npos ) c = out[rep];
144 template <
typename T>
145 std::type_index typeIndex() {
146 return std::type_index{
typeid( T ) };
149 inline std::string libNativeName(
const std::string& libName ) {
150#if defined( __linux ) || defined( __APPLE__ )
151 return "lib" + libName +
".so";
233 bool genComponent(
const std::string& libName,
const std::string& componentName, component_t componentType,
234 const vector<PropertyBase*>& properties,
235 const Gaudi::PluginService::Details::Registry::FactoryInfo& info );
237 bool genComponent2(
const std::string& componentName, component_t componentType,
238 const vector<PropertyBase*>& properties,
const std::vector<std::string>& interfaces,
239 const Gaudi::PluginService::Details::Registry::FactoryInfo& info );
241 void genImport( std::ostream& s, std::string_view frmt, std::string indent );
242 void genHeader( std::ostream& pyOut, std::ostream& dbOut );
243 void genBody( std::ostream& pyOut, std::ostream& dbOut ) {
244 pyOut <<
m_pyBuf.str() << flush;
245 dbOut <<
m_dbBuf.str() << flush;
247 void genTrailer( std::ostream& pyOut, std::ostream& dbOut );
256 namespace logging = boost::log;
257 namespace keywords = boost::log::keywords;
258 namespace expr = boost::log::expressions;
260 logging::add_console_log( std::cout, keywords::format =
261 ( expr::stream <<
"[" << std::setw( 7 ) << std::left
262 << logging::trivial::severity <<
"] " << expr::smessage ) );
264 logging::core::get()->set_filter( logging::trivial::severity >= level );
268int main(
int argc,
char** argv )
272 ? boost::log::trivial::info
273 : boost::log::trivial::warning );
275 fs::path pwd = fs::initial_path();
279 std::string userModule;
282 po::options_description
generic(
"Generic options" );
283 generic.add_options()(
"help,h",
"produce this help message" )(
284 "package-name,p", po::value<string>(),
"name of the package for which we create the configurables file" )(
285 "input-libraries,i", po::value<string>(),
"libraries to extract the component configurables from" )(
286 "input-cfg,c", po::value<string>(),
287 "path to the cfg file holding the description of the Configurable base "
288 "classes, the python module holding the Configurable definitions, etc..." )(
289 "output-dir,o", po::value<string>()->default_value(
"../genConfDir" ),
290 "output directory for genconf files." )(
"debug-level,d", po::value<int>()->default_value( 0 ),
"debug level" )(
291 "load-library,l", po::value<Strings_t>()->composing(),
"preloading library" )(
292 "user-module,m", po::value<string>(),
"user-defined module to be imported by the genConf-generated one" )(
293 "type", po::value<string>()->default_value(
"conf,conf2" ),
"comma-separate types of configurables to generate" );
297 po::options_description config(
"Configuration" );
298 config.add_options()(
"configurable-module", po::value<string>()->default_value(
"AthenaCommon" ),
299 "Name of the module holding the configurable classes" )(
300 "configurable-default-name", po::value<string>()->default_value(
"Configurable.DefaultName" ),
301 "Default name for the configurable instance" )(
"configurable-algorithm",
302 po::value<string>()->default_value(
"ConfigurableAlgorithm" ),
303 "Name of the configurable base class for Algorithm components" )(
304 "configurable-algtool", po::value<string>()->default_value(
"ConfigurableAlgTool" ),
305 "Name of the configurable base class for AlgTool components" )(
306 "configurable-auditor", po::value<string>()->default_value(
"ConfigurableAuditor" ),
307 "Name of the configurable base class for Auditor components" )(
308 "configurable-service", po::value<string>()->default_value(
"ConfigurableService" ),
309 "Name of the configurable base class for Service components" );
311 po::options_description cmdline_options;
312 cmdline_options.add( generic ).add( config );
314 po::options_description config_file_options;
315 config_file_options.add( config );
317 po::options_description visible(
"Allowed options" );
318 visible.add( generic ).add( config );
320 po::variables_map vm;
323 po::store( po::command_line_parser( argc, argv ).options( cmdline_options ).run(), vm );
328 if ( vm.contains(
"input-cfg" ) ) {
329 string cfgFileName = vm[
"input-cfg"].as<
string>();
330 cfgFileName = fs::system_complete( fs::path( cfgFileName ) ).string();
331 std::ifstream ifs( cfgFileName );
332 po::store( parse_config_file( ifs, config_file_options ), vm );
336 }
catch ( po::error& err ) {
337 LOG_ERROR <<
"error detected while parsing command options: " << err.what();
342 if ( vm.contains(
"help" ) ) {
343 cout << visible << endl;
347 if ( vm.contains(
"package-name" ) ) {
348 pkgName = vm[
"package-name"].as<
string>();
351 cout << visible << endl;
355 if ( vm.contains(
"user-module" ) ) {
356 userModule = vm[
"user-module"].as<
string>();
357 LOG_INFO <<
"INFO: will import user module " << userModule;
360 if ( vm.contains(
"input-libraries" ) ) {
364 std::string tmp = vm[
"input-libraries"].as<std::string>();
366 boost::split( libs, tmp, boost::is_any_of(
" " ), boost::token_compress_on );
368 LOG_ERROR <<
"input component library(ies) required";
369 cout << visible << endl;
373 if ( vm.contains(
"output-dir" ) ) { out = fs::system_complete( fs::path( vm[
"output-dir"].as<string>() ) ); }
375 if ( vm.contains(
"debug-level" ) ) { Gaudi::PluginService::SetDebug( vm[
"debug-level"].as<int>() ); }
377 if ( vm.contains(
"load-library" ) ) {
378 for (
const auto& lLib : vm[
"load-library"].as<Strings_t>() ) {
382 if ( err != 1 )
LOG_WARNING <<
"failed to load: " << lLib;
386 std::set<conf_t> confTypes;
387 if ( vm.contains(
"type" ) ) {
388 for (
const std::string& type : boost::tokenizer{ vm[
"type"].as<std::string>(), boost::char_separator{
"," } } ) {
389 if ( type ==
"conf" ) {
390 confTypes.insert( conf_t::CONF );
391 }
else if ( type ==
"conf2" ) {
392 confTypes.insert( conf_t::CONF2 );
394 LOG_ERROR <<
"unknown configurable type: " << type;
395 cout << visible << endl;
401 if ( !fs::exists( out ) ) {
403 fs::create_directory( out );
404 }
catch ( fs::filesystem_error& err ) {
405 LOG_ERROR <<
"error creating directory: " << err.what();
411 std::ostringstream msg;
412 msg <<
":::::: libraries : [ ";
413 std::copy( libs.begin(), libs.end(), std::ostream_iterator<std::string>( msg,
" " ) );
427 int sc = EXIT_FAILURE;
430 }
catch ( exception& e ) {
431 cout <<
"ERROR: Could not generate Configurable(s) !\n"
432 <<
"ERROR: Got exception: " << e.what() << endl;
437 std::ostringstream msg;
438 msg <<
":::::: libraries : [ ";
439 std::copy( libs.begin(), libs.end(), std::ostream_iterator<std::string>( msg,
" " ) );
440 msg <<
"] :::::: [DONE]";
450 const auto endLib = libs.end();
452 static const std::string gaudiSvc =
"GaudiCoreSvc";
453 const bool isGaudiSvc =
454 std::find_if( libs.begin(), endLib, [](
const auto& s ) {
455 return s.find( gaudiSvc ) != std::string::npos;
460 cout <<
"ERROR: ApplicationMgr can not be created. Check environment" << endl;
465 using Gaudi::PluginService::Details::Registry;
466 const Registry& registry = Registry::instance();
468 auto bkgNames = registry.loadedFactoryNames();
477 for (
const auto& iLib : libs ) {
478 std::string lib = fs::path( iLib ).stem().string();
479 if ( lib.compare( 0, 3,
"lib" ) == 0 ) {
480 lib = lib.substr( 3 );
482 LOG_INFO <<
":::: processing library: " << iLib <<
"...";
492 if ( !registry.loadPluginLibrary( iLib ) ) {
498 const auto& factories = registry.factories();
499 for (
const auto& factoryName : registry.loadedFactoryNames() ) {
500 if ( bkgNames.find( factoryName ) != bkgNames.end() ) {
501 if ( Gaudi::PluginService::Details::logger().level() <= 1 ) {
502 LOG_INFO <<
"\t==> skipping [" << factoryName <<
"]...";
506 auto entry = factories.find( factoryName );
507 if ( entry == end( factories ) ) {
508 LOG_ERROR <<
"inconsistency in component factories list: I cannot find anymore " << factoryName;
511 const auto& info = entry->second;
512 if ( !info.is_set() )
continue;
515 if ( !info.getprop(
"ReflexName" ).empty() )
continue;
521 if ( libNativeName( lib ) != info.library ) {
522 LOG_WARNING <<
"library [" << lib <<
"] exposes factory [" << factoryName <<
"] which is declared in ["
523 << info.library <<
"] !!";
527 component_t type = component_t::Unknown;
529 const auto ft = allowedFactories.find( info.factory.type().name() );
530 if ( ft != allowedFactories.end() ) {
532 }
else if ( factoryName ==
"ApplicationMgr" ) {
533 type = component_t::ApplicationMgr;
539 std::string name = boost::trim_copy( factoryName );
541 const auto className = info.getprop(
"ClassName" );
542 LOG_INFO <<
" - component: " << className <<
" (" << ( className != name ? ( name +
": " ) : std::string() )
545 string cname =
"DefaultName";
549 case component_t::Algorithm:
550 prop =
SmartIF<IAlgorithm>( Gaudi::Algorithm::Factory::create( factoryName, cname, svcLoc ).release() );
552 case component_t::Service:
553 prop =
SmartIF<IService>( Service::Factory::create( factoryName, cname, svcLoc ).release() );
555 case component_t::AlgTool:
557 SmartIF<IAlgTool>( AlgTool::Factory::create( factoryName, cname, toString( type ), dummySvc ).release() );
561 case component_t::Auditor:
564 case component_t::ApplicationMgr:
570 }
catch ( exception& e ) {
571 LOG_ERROR <<
"Error instantiating " << name <<
" from " << iLib;
572 LOG_ERROR <<
"Got exception: " << e.what();
576 LOG_ERROR <<
"Error instantiating " << name <<
" from " << iLib;
585 !
genComponent2( name, type, prop->getProperties(), prop->getInterfaceNames(), info ) ) {
590 LOG_ERROR <<
"could not cast IInterface* object to an IProperty* !";
591 LOG_ERROR <<
"NO Configurable will be generated for [" << name <<
"] !";
600 const std::string pyName = ( fs::path(
m_outputDirName ) / fs::path( lib +
"Conf.py" ) ).
string();
601 const std::string dbName = ( fs::path(
m_outputDirName ) / fs::path( lib +
".confdb" ) ).
string();
603 std::fstream py( pyName, std::ios_base::out | std::ios_base::trunc );
604 std::fstream db( dbName, std::ios_base::out | std::ios_base::trunc );
607 if ( !userModule.empty() ) py <<
"from " << userModule <<
" import *" << endl;
612 const std::string db2Name = ( fs::path(
m_outputDirName ) / fs::path( lib +
".confdb2_part" ) ).
string();
613 std::fstream db2( db2Name, std::ios_base::out | std::ios_base::trunc );
614 db2 <<
"{\n" <<
m_db2Buf.str() <<
"}\n";
622 return allGood ? EXIT_SUCCESS : EXIT_FAILURE;
627 std::string::size_type pos = 0, nxtpos = 0;
630 while ( std::string::npos != pos ) {
632 nxtpos =
m_configurable[component_t::Module].find_first_of(
',', pos );
635 mod =
m_configurable[component_t::Module].substr( pos, nxtpos - pos );
636 std::ostringstream
import;
637 import << fmt::format( fmt::runtime( frmt ), mod );
641 if ( std::string::npos == nxtpos ) {
643 s << indent << import.str() << "\n
" << flush;
644 pos = std::string::npos;
646 // we have a fallback for this
647 s << indent << "try:\n
" << indent << py_tab << import.str() << "\n
" << indent << "except ImportError:\n
" << flush;
650 // increase indentation level for next iteration
655//-----------------------------------------------------------------------------
656void configGenerator::genHeader( std::ostream& py, std::ostream& db )
657//-----------------------------------------------------------------------------
660 std::string now = Gaudi::Time::current().format( true );
661 py << "#
" << now //<< "\n
"
662 << "\
"\"\"Automatically generated. DO NOT EDIT please\"\"\"\n";
668 genImport( py,
"from {}.Configurable import *" );
671 db <<
"## -*- ascii -*- \n"
672 <<
"# db file automatically generated by genconf on: " << now <<
"\n"
680 db <<
"## " <<
m_pkgName <<
"\n" << std::flush;
685 component_t componentType,
const vector<PropertyBase*>& properties,
686 const Gaudi::PluginService::Details::Registry::FactoryInfo& info )
689 auto cname = pythonizeName( componentName );
690 const auto decl_loc = info.getprop(
"declaration_location" );
692 std::vector<std::pair<std::string, std::string>> propDoc;
693 propDoc.reserve( properties.size() );
696 m_pyBuf <<
" __slots__ = { \n";
697 for (
const auto& prop : properties ) {
698 const string& pname = prop->name();
700 if ( !boost::regex_match( pname, pythonIdentifier ) ) {
701 LOG_ERROR <<
"invalid property name \"" << pname <<
"\" in component " << cname <<
" (invalid Python identifier)"
704 m_pyBuf <<
" #ERROR-invalid identifier '" << pname <<
"'\n"
709 string pvalue, ptype;
711 m_pyBuf <<
" '" << pname <<
"' : " << pvalue <<
",\n";
713 if ( prop->documentation() !=
"none" ) {
714 propDoc.emplace_back( pname, prop->documentation() +
" [" + prop->ownerTypeName() +
"]" );
718 m_pyBuf <<
" _propertyDocDct = { \n";
719 for (
const auto& prop : propDoc ) {
720 m_pyBuf << std::setw( 5 ) <<
"'" << prop.first <<
"' : "
721 <<
"\"\"\" " << prop.second <<
" \"\"\",\n";
725 if ( !decl_loc.empty() ) {
m_pyBuf <<
" __declaration_location__ = '" << decl_loc <<
"'\n"; }
726 m_pyBuf <<
" def __init__(self, name = " <<
m_configurable[component_t::DefaultName] <<
", **kwargs):\n"
727 <<
" super(" << cname <<
", self).__init__(name)\n"
728 <<
" for n,v in kwargs.items():\n"
729 <<
" setattr(self, n, v)\n"
730 <<
" def getDlls( self ):\n"
731 <<
" return '" << libName <<
"'\n"
732 <<
" def getType( self ):\n"
733 <<
" return '" << componentName <<
"'\n"
734 <<
" pass # class " << cname <<
"\n"
738 const string pyName = ( fs::path(
m_outputDirName ) / fs::path( libName +
"Conf.py" ) ).
string();
739 const string modName = fs::path( pyName ).filename().stem().string();
742 m_dbBuf <<
m_pkgName <<
"." << modName <<
" " << libName <<
" " << cname <<
"\n" << flush;
749 const vector<PropertyBase*>& properties,
const vector<std::string>& interfaces,
750 const Gaudi::PluginService::Details::Registry::FactoryInfo& info )
753 m_db2Buf <<
" '" << componentName <<
"': {\n";
754 m_db2Buf <<
" '__component_type__': '";
755 switch ( componentType ) {
756 case component_t::Algorithm:
759 case component_t::AlgTool:
762 case component_t::ApplicationMgr:
763 case component_t::Service:
766 case component_t::Auditor:
773 const auto decl_loc = info.getprop(
"declaration_location" );
774 if ( !decl_loc.empty() ) {
m_db2Buf <<
"',\n '__declaration_location__': '" << decl_loc; }
776 m_db2Buf <<
"',\n '__interfaces__': (";
777 for (
const auto& intf : std::set<std::string>{ begin( interfaces ), end( interfaces ) } ) {
778 if ( ignored_interfaces.find( intf ) == end( ignored_interfaces ) ) {
m_db2Buf <<
'\'' << intf <<
"', "; }
780 m_db2Buf <<
"),\n 'properties': {\n";
783 for (
const auto& prop : properties ) {
784 const string& pname = prop->name();
786 if ( !boost::regex_match( pname, pythonIdentifier ) ) {
787 LOG_ERROR <<
"invalid property name \"" << pname <<
"\" in component " << componentName
788 <<
" (invalid Python identifier)" << std::endl;
789 m_db2Buf <<
" #ERROR-invalid identifier '" << pname <<
"'\n";
794 string pvalue, ptype;
797 m_db2Buf <<
" '" << pname <<
"': ('" << ptype <<
"', " << pvalue <<
", '''" << prop->documentation()
798 <<
" [" << prop->ownerTypeName() <<
"]'''";
799 auto sem = prop->semantics();
800 if ( !sem.empty() ) {
m_db2Buf <<
", '" << sem <<
'\''; }
813 const std::string cvalue = p->
toString();
814 const std::type_index ti = std::type_index( *p->
type_info() );
817 if ( ti == typeIndex<bool>() ) {
818 pvalue = ( cvalue ==
"0" || cvalue ==
"False" || cvalue ==
"false" ) ?
"False" :
"True";
819 }
else if ( ti == typeIndex<char>() || ti == typeIndex<signed char>() || ti == typeIndex<unsigned char>() ||
820 ti == typeIndex<short>() || ti == typeIndex<unsigned short>() || ti == typeIndex<int>() ||
821 ti == typeIndex<unsigned int>() || ti == typeIndex<long>() || ti == typeIndex<unsigned long>() ||
822 ti == typeIndex<long long>() || ti == typeIndex<unsigned long long>() ) {
824 }
else if ( ti == typeIndex<float>() || ti == typeIndex<double>() || ti == typeIndex<long double>() ) {
826 pvalue = boost::to_lower_copy( cvalue );
827 if ( std::string::npos != pvalue.find(
"nan" ) ) {
828 pvalue =
"float('nan')";
829 }
else if ( std::string::npos == pvalue.find(
"." ) && std::string::npos == pvalue.find(
"e" ) ) {
830 pvalue = cvalue +
".0";
832 }
else if ( ti == typeIndex<string>() ) {
833 pvalue = quote( cvalue );
834 }
else if ( ti == typeIndex<GaudiHandleBase>() ) {
838 pvalue = base.pythonRepr();
839 ptype = base.pythonPropertyClassName();
841 }
else if ( ti == typeIndex<GaudiHandleArrayBase>() ) {
845 pvalue = base.pythonRepr();
846 ptype = base.pythonPropertyClassName();
852 pvalue = base.pythonRepr();
855 std::ostringstream v_str;
856 v_str.setf( std::ios::showpoint );
858 pvalue = v_str.str();
869 if ( !propMgr || !appUI )
return EXIT_FAILURE;
873 propMgr->setProperty(
"AppName",
"" ).ignore( );
875 propMgr->setProperty(
"OutputLevel", 7 ).ignore( );
877 appUI->configure().ignore( );
879 msgSvc->setPropertyRepr(
"setWarning",
"['DefaultName', 'PropertyHolder']" )
881 msgSvc->setProperty(
"Format",
"%T %0W%M" ).ignore( );
std::ostream & operator<<(std::ostream &s, AlgsExecutionStates::State x)
Streaming of State values.
Alias for backward compatibility.
The Application Manager class.
DataHandleProperty.h GaudiKernel/DataHandleProperty.h.
A DataObject is the base class of any identifiable object on any data store.
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
const std::type_info * type_info() const
property type-info
virtual std::string toString() const =0
value -> string
virtual void toStream(std::ostream &out) const =0
value -> stream
Base class of array's of various gaudihandles.
const GaudiHandleArrayBase & value() const
Base class to handles to be used in lieu of naked pointers to various Gaudi components.
const GaudiHandleBase & value() const
The data converters are responsible to translate data from one representation into another.
Definition of the basic interface.
virtual unsigned long addRef() const =0
Increment the reference count of Interface instance.
virtual unsigned long release() const =0
Release Interface instance.
The IProperty is the basic interface for all components which have properties that can be set or get.
StatusCode setProperty(const Gaudi::Details::PropertyBase &p)
Set the property from a property.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Base class for all services.
Small smart pointer class with automatic reference counting for IInterface.
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
void ignore() const
Allow discarding a StatusCode without warning.
void pythonizeValue(const PropertyBase *prop, string &pvalue, string &ptype)
handle the "marshalling" of Properties
void setConfigurableDefaultName(const std::string &defaultName)
customize the default name for configurable instances
void setConfigurableTypes(const std::set< conf_t > &types)
customize configurable types to generate
configGenerator(const string &pkgName, const string &outputDirName)
string m_outputDirName
absolute path to the directory where genconf will store auto-generated files (Configurables and Confi...
void genHeader(std::ostream &pyOut, std::ostream &dbOut)
void setConfigurableAuditor(const std::string &cfgAuditor)
customize the configurable base class for AlgTool component
void genImport(std::ostream &s, std::string_view frmt, std::string indent)
std::set< conf_t > m_confTypes
Types of configurables to generate.
stringstream m_pyBuf
buffer of auto-generated configurables
bool m_importGaudiHandles
switch to decide if the generated configurables need to import GaudiHandles (ie: if one of the compon...
void genTrailer(std::ostream &pyOut, std::ostream &dbOut)
bool genComponent2(const std::string &componentName, component_t componentType, const vector< PropertyBase * > &properties, const std::vector< std::string > &interfaces, const Gaudi::PluginService::Details::Registry::FactoryInfo &info)
stringstream m_dbBuf
buffer of generated configurables informations for the "Db" file The "Db" file is holding information...
std::map< component_t, std::string > m_configurable
Configurable customization.
int genConfig(const Strings_t &modules, const string &userModule)
main entry point of this class:
void setConfigurableModule(const std::string &moduleName)
customize the Module name where configurable base classes are defined
void genBody(std::ostream &pyOut, std::ostream &dbOut)
stringstream m_db2Buf
buffer of generated GaudiConfig2 configurables
void setConfigurableService(const std::string &cfgService)
customize the configurable base class for Service component
void setConfigurableAlgorithm(const std::string &cfgAlgorithm)
customize the configurable base class for Algorithm component
bool genComponent(const std::string &libName, const std::string &componentName, component_t componentType, const vector< PropertyBase * > &properties, const Gaudi::PluginService::Details::Registry::FactoryInfo &info)
void setConfigurableAlgTool(const std::string &cfgAlgTool)
customize the configurable base class for AlgTool component
string m_pkgName
name of the package we are processing
std::vector< std::string > Strings_t
void init_logging(boost::log::trivial::severity_level level)
std::vector< fs::path > LibPathNames_t
GAUDI_API ISvcLocator * svcLocator()
GAUDI_API IAppMgrUI * createApplicationMgr()
GAUDI_API bool isEnvSet(const char *var)
Check if an environment variable is set or not.
GAUDI_API unsigned long loadDynamicLib(const std::string &name, ImageHandle *handle)
Load dynamic link library.
GAUDI_API const std::string getLastErrorString()
Get last system error as string.
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
void * ImageHandle
Definition of an image handle.
GAUDI_API std::string getEnv(const char *var)
get a particular environment variable (returning "UNKNOWN" if not set)