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>
57#include <nlohmann/json.hpp>
63namespace po = boost::program_options;
64namespace fs = boost::filesystem;
66#define LOG_ERROR BOOST_LOG_TRIVIAL( error )
67#define LOG_WARNING BOOST_LOG_TRIVIAL( warning )
68#define LOG_INFO BOOST_LOG_TRIVIAL( info )
81 std::string quote( std::string_view sv ) {
83 s << std::quoted( sv,
'\'' );
87 const std::string py_tab =
" ";
91 const boost::regex pythonIdentifier(
"^[a-zA-Z_][a-zA-Z0-9_]*$" );
94 enum class component_t {
113 const std::map<std::string, component_t> allowedFactories{
114 {
typeid( Gaudi::Algorithm::Factory::FactoryType ).name(), component_t::Algorithm },
115 {
typeid( Service::Factory::FactoryType ).name(), component_t::Service },
116 {
typeid( AlgTool::Factory::FactoryType ).name(), component_t::AlgTool },
118 {
typeid( Gaudi::Auditor::Factory::FactoryType ).name(), component_t::Auditor },
121 const std::string& toString( component_t type ) {
122 static const std::array<std::string, 11> names = {
"Module",
"DefaultName",
"Algorithm",
"AlgTool",
123 "Auditor",
"Service",
"ApplicationMgr",
"IInterface",
124 "Converter",
"DataObject",
"Unknown" };
125 return names.at(
static_cast<std::underlying_type_t<component_t>
>( type ) );
127 std::ostream&
operator<<( std::ostream& os, component_t type ) {
return os << toString( type ); }
129 std::set<std::string> ignored_interfaces{
130 {
"IInterface",
"IProperty",
"INamedInterface",
"IAlgorithm",
"IAlgTool",
"IService",
"IAuditor" } };
134 std::string pythonizeName(
const std::string& name ) {
135 static const string in(
"<>&*,: ()." );
136 static const string out(
"__rp__s___" );
137 auto r = boost::algorithm::replace_all_copy( name,
", ",
"," );
138 for (
auto& c : r ) {
139 auto rep = in.find( c );
140 if ( rep != string::npos ) c = out[rep];
145 template <
typename T>
146 std::type_index typeIndex() {
147 return std::type_index{
typeid( T ) };
150 inline std::string libNativeName(
const std::string& libName ) {
151#if defined( __linux ) || defined( __APPLE__ )
152 return "lib" + libName +
".so";
234 bool genComponent(
const std::string& libName,
const std::string& componentName, component_t componentType,
235 const vector<PropertyBase*>& properties,
236 const Gaudi::PluginService::Details::Registry::FactoryInfo& info );
238 bool genComponent2(
const std::string& componentName, component_t componentType,
239 const vector<PropertyBase*>& properties,
const std::vector<std::string>& interfaces,
240 const Gaudi::PluginService::Details::Registry::FactoryInfo& info );
242 void genImport( std::ostream& s, std::string_view frmt, std::string indent );
243 void genHeader( std::ostream& pyOut, std::ostream& dbOut );
244 void genBody( std::ostream& pyOut, std::ostream& dbOut ) {
245 pyOut <<
m_pyBuf.str() << flush;
246 dbOut <<
m_dbBuf.str() << flush;
248 void genTrailer( std::ostream& pyOut, std::ostream& dbOut );
257 namespace logging = boost::log;
258 namespace keywords = boost::log::keywords;
259 namespace expr = boost::log::expressions;
261 logging::add_console_log( std::cout, keywords::format =
262 ( expr::stream <<
"[" << std::setw( 7 ) << std::left
263 << logging::trivial::severity <<
"] " << expr::smessage ) );
265 logging::core::get()->set_filter( logging::trivial::severity >= level );
269int main(
int argc,
char** argv )
273 ? boost::log::trivial::info
274 : boost::log::trivial::warning );
276 fs::path pwd = fs::initial_path();
280 std::string userModule;
283 po::options_description
generic(
"Generic options" );
284 generic.add_options()(
"help,h",
"produce this help message" )(
285 "package-name,p", po::value<string>(),
"name of the package for which we create the configurables file" )(
286 "input-libraries,i", po::value<string>(),
"libraries to extract the component configurables from" )(
287 "input-cfg,c", po::value<string>(),
288 "path to the cfg file holding the description of the Configurable base "
289 "classes, the python module holding the Configurable definitions, etc..." )(
290 "output-dir,o", po::value<string>()->default_value(
"../genConfDir" ),
291 "output directory for genconf files." )(
"debug-level,d", po::value<int>()->default_value( 0 ),
"debug level" )(
292 "load-library,l", po::value<Strings_t>()->composing(),
"preloading library" )(
293 "user-module,m", po::value<string>(),
"user-defined module to be imported by the genConf-generated one" )(
294 "type", po::value<string>()->default_value(
"conf,conf2" ),
"comma-separate types of configurables to generate" );
298 po::options_description config(
"Configuration" );
299 config.add_options()(
"configurable-module", po::value<string>()->default_value(
"AthenaCommon" ),
300 "Name of the module holding the configurable classes" )(
301 "configurable-default-name", po::value<string>()->default_value(
"Configurable.DefaultName" ),
302 "Default name for the configurable instance" )(
"configurable-algorithm",
303 po::value<string>()->default_value(
"ConfigurableAlgorithm" ),
304 "Name of the configurable base class for Algorithm components" )(
305 "configurable-algtool", po::value<string>()->default_value(
"ConfigurableAlgTool" ),
306 "Name of the configurable base class for AlgTool components" )(
307 "configurable-auditor", po::value<string>()->default_value(
"ConfigurableAuditor" ),
308 "Name of the configurable base class for Auditor components" )(
309 "configurable-service", po::value<string>()->default_value(
"ConfigurableService" ),
310 "Name of the configurable base class for Service components" );
312 po::options_description cmdline_options;
313 cmdline_options.add( generic ).add( config );
315 po::options_description config_file_options;
316 config_file_options.add( config );
318 po::options_description visible(
"Allowed options" );
319 visible.add( generic ).add( config );
321 po::variables_map vm;
324 po::store( po::command_line_parser( argc, argv ).options( cmdline_options ).run(), vm );
329 if ( vm.contains(
"input-cfg" ) ) {
330 string cfgFileName = vm[
"input-cfg"].as<
string>();
331 cfgFileName = fs::system_complete( fs::path( cfgFileName ) ).string();
332 std::ifstream ifs( cfgFileName );
333 po::store( parse_config_file( ifs, config_file_options ), vm );
337 }
catch ( po::error& err ) {
338 LOG_ERROR <<
"error detected while parsing command options: " << err.what();
343 if ( vm.contains(
"help" ) ) {
344 cout << visible << endl;
348 if ( vm.contains(
"package-name" ) ) {
349 pkgName = vm[
"package-name"].as<
string>();
352 cout << visible << endl;
356 if ( vm.contains(
"user-module" ) ) {
357 userModule = vm[
"user-module"].as<
string>();
358 LOG_INFO <<
"INFO: will import user module " << userModule;
361 if ( vm.contains(
"input-libraries" ) ) {
365 std::string tmp = vm[
"input-libraries"].as<std::string>();
367 boost::split( libs, tmp, boost::is_any_of(
" " ), boost::token_compress_on );
369 LOG_ERROR <<
"input component library(ies) required";
370 cout << visible << endl;
374 if ( vm.contains(
"output-dir" ) ) { out = fs::system_complete( fs::path( vm[
"output-dir"].as<string>() ) ); }
376 if ( vm.contains(
"debug-level" ) ) { Gaudi::PluginService::SetDebug( vm[
"debug-level"].as<int>() ); }
378 if ( vm.contains(
"load-library" ) ) {
379 for (
const auto& lLib : vm[
"load-library"].as<Strings_t>() ) {
383 if ( err != 1 )
LOG_WARNING <<
"failed to load: " << lLib;
387 std::set<conf_t> confTypes;
388 if ( vm.contains(
"type" ) ) {
389 for (
const std::string& type : boost::tokenizer{ vm[
"type"].as<std::string>(), boost::char_separator{
"," } } ) {
390 if ( type ==
"conf" ) {
391 confTypes.insert( conf_t::CONF );
392 }
else if ( type ==
"conf2" ) {
393 confTypes.insert( conf_t::CONF2 );
395 LOG_ERROR <<
"unknown configurable type: " << type;
396 cout << visible << endl;
402 if ( !fs::exists( out ) ) {
404 fs::create_directory( out );
405 }
catch ( fs::filesystem_error& err ) {
406 LOG_ERROR <<
"error creating directory: " << err.what();
412 std::ostringstream msg;
413 msg <<
":::::: libraries : [ ";
414 std::copy( libs.begin(), libs.end(), std::ostream_iterator<std::string>( msg,
" " ) );
428 int sc = EXIT_FAILURE;
431 }
catch ( exception& e ) {
432 cout <<
"ERROR: Could not generate Configurable(s) !\n"
433 <<
"ERROR: Got exception: " << e.what() << endl;
438 std::ostringstream msg;
439 msg <<
":::::: libraries : [ ";
440 std::copy( libs.begin(), libs.end(), std::ostream_iterator<std::string>( msg,
" " ) );
441 msg <<
"] :::::: [DONE]";
451 const auto endLib = libs.end();
453 static const std::string gaudiSvc =
"GaudiCoreSvc";
454 const bool isGaudiSvc =
455 std::find_if( libs.begin(), endLib, [](
const auto& s ) {
456 return s.find( gaudiSvc ) != std::string::npos;
461 cout <<
"ERROR: ApplicationMgr can not be created. Check environment" << endl;
466 using Gaudi::PluginService::Details::Registry;
467 const Registry& registry = Registry::instance();
469 auto bkgNames = registry.loadedFactoryNames();
478 for (
const auto& iLib : libs ) {
479 std::string lib = fs::path( iLib ).stem().string();
480 if ( lib.compare( 0, 3,
"lib" ) == 0 ) {
481 lib = lib.substr( 3 );
483 LOG_INFO <<
":::: processing library: " << iLib <<
"...";
493 if ( !registry.loadPluginLibrary( iLib ) ) {
499 const auto& factories = registry.factories();
500 for (
const auto& factoryName : registry.loadedFactoryNames() ) {
501 if ( bkgNames.find( factoryName ) != bkgNames.end() ) {
502 if ( Gaudi::PluginService::Details::logger().level() <= 1 ) {
503 LOG_INFO <<
"\t==> skipping [" << factoryName <<
"]...";
507 auto entry = factories.find( factoryName );
508 if ( entry == end( factories ) ) {
509 LOG_ERROR <<
"inconsistency in component factories list: I cannot find anymore " << factoryName;
512 const auto& info = entry->second;
513 if ( !info.is_set() )
continue;
516 if ( !info.getprop(
"ReflexName" ).empty() )
continue;
522 if ( libNativeName( lib ) != info.library ) {
523 LOG_WARNING <<
"library [" << lib <<
"] exposes factory [" << factoryName <<
"] which is declared in ["
524 << info.library <<
"] !!";
528 component_t type = component_t::Unknown;
530 const auto ft = allowedFactories.find( info.factory.type().name() );
531 if ( ft != allowedFactories.end() ) {
533 }
else if ( factoryName ==
"ApplicationMgr" ) {
534 type = component_t::ApplicationMgr;
540 std::string name = boost::trim_copy( factoryName );
542 const auto className = info.getprop(
"ClassName" );
543 LOG_INFO <<
" - component: " << className <<
" (" << ( className != name ? ( name +
": " ) : std::string() )
546 string cname =
"DefaultName";
550 case component_t::Algorithm:
551 prop =
SmartIF<IAlgorithm>( Gaudi::Algorithm::Factory::create( factoryName, cname, svcLoc ).release() );
553 case component_t::Service:
554 prop =
SmartIF<IService>( Service::Factory::create( factoryName, cname, svcLoc ).release() );
556 case component_t::AlgTool:
558 SmartIF<IAlgTool>( AlgTool::Factory::create( factoryName, cname, toString( type ), dummySvc ).release() );
562 case component_t::Auditor:
565 case component_t::ApplicationMgr:
571 }
catch ( exception& e ) {
572 LOG_ERROR <<
"Error instantiating " << name <<
" from " << iLib;
573 LOG_ERROR <<
"Got exception: " << e.what();
577 LOG_ERROR <<
"Error instantiating " << name <<
" from " << iLib;
586 !
genComponent2( name, type, prop->getProperties(), prop->getInterfaceNames(), info ) ) {
591 LOG_ERROR <<
"could not cast IInterface* object to an IProperty* !";
592 LOG_ERROR <<
"NO Configurable will be generated for [" << name <<
"] !";
601 const std::string pyName = ( fs::path(
m_outputDirName ) / fs::path( lib +
"Conf.py" ) ).
string();
602 const std::string dbName = ( fs::path(
m_outputDirName ) / fs::path( lib +
".confdb" ) ).
string();
604 std::fstream py( pyName, std::ios_base::out | std::ios_base::trunc );
605 std::fstream db( dbName, std::ios_base::out | std::ios_base::trunc );
608 if ( !userModule.empty() ) py <<
"from " << userModule <<
" import *" << endl;
613 const std::string db2Name = ( fs::path(
m_outputDirName ) / fs::path( lib +
".confdb2_part" ) ).
string();
614 std::fstream db2( db2Name, std::ios_base::out | std::ios_base::trunc );
615 db2 <<
"{\n" <<
m_db2Buf.str() <<
"}\n";
623 return allGood ? EXIT_SUCCESS : EXIT_FAILURE;
628 std::string::size_type pos = 0, nxtpos = 0;
631 while ( std::string::npos != pos ) {
633 nxtpos =
m_configurable[component_t::Module].find_first_of(
',', pos );
636 mod =
m_configurable[component_t::Module].substr( pos, nxtpos - pos );
637 std::ostringstream import_cmd;
638 import_cmd << fmt::format( fmt::runtime( frmt ), mod );
642 if ( std::string::npos == nxtpos ) {
644 s << indent << import_cmd.str() <<
"\n" << flush;
645 pos = std::string::npos;
648 s << indent <<
"try:\n"
649 << indent << py_tab << import_cmd.str() <<
"\n"
650 << indent <<
"except ImportError:\n"
666 <<
"\"\"\"Automatically generated. DO NOT EDIT please\"\"\"\n";
672 genImport( py,
"from {}.Configurable import *" );
675 db <<
"## -*- ascii -*- \n"
676 <<
"# db file automatically generated by genconf on: " << now <<
"\n"
684 db <<
"## " <<
m_pkgName <<
"\n" << std::flush;
689 component_t componentType,
const vector<PropertyBase*>& properties,
690 const Gaudi::PluginService::Details::Registry::FactoryInfo& info )
693 auto cname = pythonizeName( componentName );
694 const auto decl_loc = info.getprop(
"declaration_location" );
696 std::vector<std::pair<std::string, std::string>> propDoc;
697 propDoc.reserve( properties.size() );
700 m_pyBuf <<
" __slots__ = { \n";
701 for (
const auto& prop : properties ) {
702 const string& pname = prop->name();
704 if ( !boost::regex_match( pname, pythonIdentifier ) ) {
705 LOG_ERROR <<
"invalid property name \"" << pname <<
"\" in component " << cname <<
" (invalid Python identifier)"
708 m_pyBuf <<
" #ERROR-invalid identifier '" << pname <<
"'\n"
713 string pvalue, ptype;
715 m_pyBuf <<
" '" << pname <<
"' : " << pvalue <<
",\n";
717 if ( prop->documentation() !=
"none" ) {
718 propDoc.emplace_back( pname, prop->documentation() +
" [" + prop->ownerTypeName() +
"]" );
722 m_pyBuf <<
" _propertyDocDct = { \n";
723 for (
const auto& prop : propDoc ) {
724 m_pyBuf << std::setw( 5 ) <<
"'" << prop.first <<
"' : "
725 <<
"\"\"\" " << prop.second <<
" \"\"\",\n";
729 if ( !decl_loc.empty() ) {
m_pyBuf <<
" __declaration_location__ = '" << decl_loc <<
"'\n"; }
730 m_pyBuf <<
" def __init__(self, name = " <<
m_configurable[component_t::DefaultName] <<
", **kwargs):\n"
731 <<
" super(" << cname <<
", self).__init__(name)\n"
732 <<
" for n,v in kwargs.items():\n"
733 <<
" setattr(self, n, v)\n"
734 <<
" def getDlls( self ):\n"
735 <<
" return '" << libName <<
"'\n"
736 <<
" def getType( self ):\n"
737 <<
" return '" << componentName <<
"'\n"
738 <<
" pass # class " << cname <<
"\n"
742 const string pyName = ( fs::path(
m_outputDirName ) / fs::path( libName +
"Conf.py" ) ).
string();
743 const string modName = fs::path( pyName ).filename().stem().string();
746 m_dbBuf <<
m_pkgName <<
"." << modName <<
" " << libName <<
" " << cname <<
"\n" << flush;
753 const vector<PropertyBase*>& properties,
const vector<std::string>& interfaces,
754 const Gaudi::PluginService::Details::Registry::FactoryInfo& info )
757 m_db2Buf <<
" '" << componentName <<
"': {\n";
758 m_db2Buf <<
" '__component_type__': '";
759 switch ( componentType ) {
760 case component_t::Algorithm:
763 case component_t::AlgTool:
766 case component_t::ApplicationMgr:
767 case component_t::Service:
770 case component_t::Auditor:
777 const auto decl_loc = info.getprop(
"declaration_location" );
778 if ( !decl_loc.empty() ) {
m_db2Buf <<
"',\n '__declaration_location__': '" << decl_loc; }
780 m_db2Buf <<
"',\n '__interfaces__': (";
781 for (
const auto& intf : std::set<std::string>{ begin( interfaces ), end( interfaces ) } ) {
782 if ( ignored_interfaces.find( intf ) == end( ignored_interfaces ) ) {
m_db2Buf <<
'\'' << intf <<
"', "; }
784 m_db2Buf <<
"),\n 'properties': {\n";
787 for (
const auto& prop : properties ) {
788 const string& pname = prop->name();
790 if ( !boost::regex_match( pname, pythonIdentifier ) ) {
791 LOG_ERROR <<
"invalid property name \"" << pname <<
"\" in component " << componentName
792 <<
" (invalid Python identifier)" << std::endl;
793 m_db2Buf <<
" #ERROR-invalid identifier '" << pname <<
"'\n";
798 string pvalue, ptype;
801 m_db2Buf <<
" '" << pname <<
"': ('" << ptype <<
"', " << pvalue <<
", '''" << prop->documentation()
802 <<
" [" << prop->ownerTypeName() <<
"]'''";
803 auto sem = prop->semantics();
804 if ( !sem.empty() ) {
m_db2Buf <<
", '" << sem <<
'\''; }
817 const std::string cvalue = p->
toString();
818 const std::type_index ti = std::type_index( *p->
type_info() );
821 if ( ti == typeIndex<bool>() ) {
822 pvalue = ( cvalue ==
"0" || cvalue ==
"False" || cvalue ==
"false" ) ?
"False" :
"True";
823 }
else if ( ti == typeIndex<char>() || ti == typeIndex<signed char>() || ti == typeIndex<unsigned char>() ||
824 ti == typeIndex<short>() || ti == typeIndex<unsigned short>() || ti == typeIndex<int>() ||
825 ti == typeIndex<unsigned int>() || ti == typeIndex<long>() || ti == typeIndex<unsigned long>() ||
826 ti == typeIndex<long long>() || ti == typeIndex<unsigned long long>() ) {
828 }
else if ( ti == typeIndex<float>() || ti == typeIndex<double>() || ti == typeIndex<long double>() ) {
830 pvalue = boost::to_lower_copy( cvalue );
831 if ( std::string::npos != pvalue.find(
"nan" ) ) {
832 pvalue =
"float('nan')";
833 }
else if ( std::string::npos == pvalue.find(
"." ) && std::string::npos == pvalue.find(
"e" ) ) {
834 pvalue = cvalue +
".0";
836 }
else if ( ti == typeIndex<string>() ) {
837 pvalue = quote( cvalue );
838 }
else if ( ti == typeIndex<nlohmann::json>() ) {
839 pvalue = quote( cvalue );
840 }
else if ( ti == typeIndex<GaudiHandleBase>() ) {
844 pvalue = base.pythonRepr();
845 ptype = base.pythonPropertyClassName();
847 }
else if ( ti == typeIndex<GaudiHandleArrayBase>() ) {
851 pvalue = base.pythonRepr();
852 ptype = base.pythonPropertyClassName();
858 pvalue = base.pythonRepr();
861 std::ostringstream v_str;
862 v_str.setf( std::ios::showpoint );
864 pvalue = v_str.str();
875 if ( !propMgr || !appUI )
return EXIT_FAILURE;
879 propMgr->setProperty(
"AppName",
"" ).ignore( );
881 propMgr->setProperty(
"OutputLevel", 7 ).ignore( );
883 appUI->configure().ignore( );
885 msgSvc->setPropertyRepr(
"setWarning",
"['DefaultName', 'PropertyHolder']" )
887 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
std::string format(bool local, std::string spec="%c") const
Format the time using strftime.
static Time current()
Returns the current time.
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)