From 54fcf8bd8d222fedf89cd5345d9585cb2618f7d8 Mon Sep 17 00:00:00 2001 From: andriish Date: Mon, 27 Jan 2025 14:11:55 +0100 Subject: [PATCH] Use standard locations if the LD_LIBRARY_PATH or ROOTSYS are empty (#1378) Co-authored-by: Andrii Verbytskyi Co-authored-by: MarkusFrankATcernch Co-authored-by: Andre Sailer --- DDCore/python/dd4hepFactories.py | 3 +- DDCore/python/dd4hep_base.py | 18 ++- GaudiPluginService/src/PluginServiceV1.cpp | 142 ++++++++++----------- GaudiPluginService/src/PluginServiceV2.cpp | 2 +- 4 files changed, 85 insertions(+), 80 deletions(-) diff --git a/DDCore/python/dd4hepFactories.py b/DDCore/python/dd4hepFactories.py index 4a77012e9..aa970431c 100755 --- a/DDCore/python/dd4hepFactories.py +++ b/DDCore/python/dd4hepFactories.py @@ -27,7 +27,8 @@ def __init__(self): self.all_components = [] def scanPath(self): - ldp = os.environ['LD_LIBRARY_PATH'].split(':') + ldp = os.getenv("LD_LIBRARY_PATH", + "/usr/lib64:/usr/lib/:/usr/local/lib:/usr/lib64/root:/usr/lib/root:/usr/local/lib/root").split(':') for p in ldp: if len(p): logger.info('+== Search component directory: ' + p) diff --git a/DDCore/python/dd4hep_base.py b/DDCore/python/dd4hep_base.py index 64328ef28..5176a95bc 100644 --- a/DDCore/python/dd4hep_base.py +++ b/DDCore/python/dd4hep_base.py @@ -25,13 +25,15 @@ def compileAClick(dictionary, g4=True): """ from ROOT import gInterpreter, gSystem import os.path - dd4hep = os.environ['DD4hepINSTALL'] - inc = ' -I' + os.environ['ROOTSYS'] + '/include -I' + dd4hep + '/include ' - lib = ' -L' + dd4hep + '/lib -lDDCore -lDDG4 -lDDSegmentation ' + dd4hep = os.getenv("DD4hepINSTALL", "/usr") + rootsys = os.getenv("ROOTSYS", "/usr") + + inc = ' -I' + rootsys + '/include -I' + dd4hep + '/include ' + lib = ' -L' + dd4hep + '/lib64 ' + ' -L' + dd4hep + '/lib -lDDCore -lDDG4 -lDDSegmentation ' if g4: - geant4 = os.environ['G4INSTALL'] + geant4 = os.getenv('G4INSTALL', "/usr") inc = inc + ' -I' + geant4 + '/include/Geant4 -Wno-shadow -g -O0 ' - lib = lib + ' -L' + geant4 + '/lib -L' + geant4 + '/lib64 -lG4event -lG4tracking -lG4particles ' + lib = lib + ' -L' + geant4 + '/lib64 -L' + geant4 + '/lib -lG4event -lG4tracking -lG4particles ' gSystem.AddIncludePath(inc) gSystem.AddLinkedLibs(lib) @@ -50,7 +52,11 @@ def loaddd4hep(): import os import sys # Add ROOT to the python path in case it is not yet there.... - sys.path.append(os.environ['ROOTSYS'] + os.sep + 'lib') + rootsys = os.getenv("ROOTSYS", "/usr") + sys.path.append(os.path.join(rootsys, 'lib')) + sys.path.append(os.path.join(rootsys, 'lib64')) + sys.path.append(os.path.join(rootsys, 'lib', 'root')) + sys.path.append(os.path.join(rootsys, 'lib64', 'root')) from ROOT import gSystem import platform diff --git a/GaudiPluginService/src/PluginServiceV1.cpp b/GaudiPluginService/src/PluginServiceV1.cpp index d0f741bb7..2ec602b7b 100644 --- a/GaudiPluginService/src/PluginServiceV1.cpp +++ b/GaudiPluginService/src/PluginServiceV1.cpp @@ -156,84 +156,82 @@ namespace Gaudi { const char sep = ':'; #endif char* search_path = ::getenv( envVar ); - if ( search_path ) { - logger().debug( std::string( "searching factories in " ) + envVar ); - std::string path( search_path ); - std::string::size_type pos = 0; - std::string::size_type newpos = 0; - while ( pos != std::string::npos ) { - std::string dirName; - // get the next entry in the path - newpos = path.find( sep, pos ); - if ( newpos != std::string::npos ) { - dirName = path.substr( pos, newpos - pos ); - pos = newpos + 1; - } else { - dirName = path.substr( pos ); - pos = newpos; - } - logger().debug( std::string( " looking into " ) + dirName ); - // look for files called "*.components" in the directory - DIR* dir = opendir( dirName.c_str() ); - if ( dir ) { - struct dirent* entry; - while ( ( entry = readdir( dir ) ) ) { - std::string name( entry->d_name ); - // check if the file name ends with ".components" - std::string::size_type extpos = name.find( ".components" ); - if ( ( extpos != std::string::npos ) && ( ( extpos + 11 ) == name.size() ) ) { - std::string fullPath = ( dirName + '/' + name ); - { // check if it is a regular file - struct stat buf; - if ( 0 != ::stat( fullPath.c_str(), &buf ) ) - continue; - else if ( !S_ISREG( buf.st_mode ) ) - continue; + logger().debug( std::string( "searching factories in " ) + envVar ); + std::string path = search_path ? std::string(search_path) : "/usr/lib64:/usr/lib:/usr/local/lib"; + std::string::size_type pos = 0; + std::string::size_type newpos = 0; + while ( pos != std::string::npos ) { + std::string dirName; + // get the next entry in the path + newpos = path.find( sep, pos ); + if ( newpos != std::string::npos ) { + dirName = path.substr( pos, newpos - pos ); + pos = newpos + 1; + } else { + dirName = path.substr( pos ); + pos = newpos; + } + logger().debug( std::string( " looking into " ) + dirName ); + // look for files called "*.components" in the directory + DIR* dir = opendir( dirName.c_str() ); + if ( dir ) { + struct dirent* entry; + while ( ( entry = readdir( dir ) ) ) { + std::string name( entry->d_name ); + // check if the file name ends with ".components" + std::string::size_type extpos = name.find( ".components" ); + if ( ( extpos != std::string::npos ) && ( ( extpos + 11 ) == name.size() ) ) { + std::string fullPath = ( dirName + '/' + name ); + { // check if it is a regular file + struct stat buf; + if ( 0 != ::stat( fullPath.c_str(), &buf ) ) + continue; + else if ( !S_ISREG( buf.st_mode ) ) + continue; + } + // read the file + logger().debug( std::string( " reading " ) + name ); + std::ifstream factories{fullPath}; + std::string line; + int factoriesCount = 0; + int lineCount = 0; + while ( !factories.eof() ) { + ++lineCount; + std::getline( factories, line ); + trim( line ); + // skip empty lines and lines starting with '#' + if ( line.empty() || line[0] == '#' ) continue; + // only accept "v1" factories + if ( line.substr( 0, 4 ) == "v1::" ) + line = line.substr( 4 ); + else + continue; + // look for the separator + auto pos = line.find( ':' ); + if ( pos == std::string::npos ) { + logger().warning( "failed to parse line " + fullPath + ':' + std::to_string( lineCount ) ); + continue; } - // read the file - logger().debug( std::string( " reading " ) + name ); - std::ifstream factories{fullPath}; - std::string line; - int factoriesCount = 0; - int lineCount = 0; - while ( !factories.eof() ) { - ++lineCount; - std::getline( factories, line ); - trim( line ); - // skip empty lines and lines starting with '#' - if ( line.empty() || line[0] == '#' ) continue; - // only accept "v1" factories - if ( line.substr( 0, 4 ) == "v1::" ) - line = line.substr( 4 ); - else - continue; - // look for the separator - auto pos = line.find( ':' ); - if ( pos == std::string::npos ) { - logger().warning( "failed to parse line " + fullPath + ':' + std::to_string( lineCount ) ); - continue; - } - const std::string lib( line, 0, pos ); - const std::string fact( line, pos + 1 ); - m_factories.emplace( fact, FactoryInfo( lib ) ); + const std::string lib( line, 0, pos ); + const std::string fact( line, pos + 1 ); + m_factories.emplace( fact, FactoryInfo( lib ) ); #ifdef GAUDI_REFLEX_COMPONENT_ALIASES - // add an alias for the factory using the Reflex convention - std::string old_name = old_style_name( fact ); - if ( fact != old_name ) { - FactoryInfo old_info( lib ); - old_info.properties["ReflexName"] = "true"; - m_factories.emplace( old_name, old_info ); - } -#endif - ++factoriesCount; - } - if ( logger().level() <= Logger::Debug ) { - logger().debug( " found " + std::to_string( factoriesCount ) + " factories" ); + // add an alias for the factory using the Reflex convention + std::string old_name = old_style_name( fact ); + if ( fact != old_name ) { + FactoryInfo old_info( lib ); + old_info.properties["ReflexName"] = "true"; + m_factories.emplace( old_name, old_info ); } +#endif + ++factoriesCount; + } + if ( logger().level() <= Logger::Debug ) { + logger().debug( " found " + std::to_string( factoriesCount ) + " factories" ); } } - closedir( dir ); } + closedir( dir ); } } } diff --git a/GaudiPluginService/src/PluginServiceV2.cpp b/GaudiPluginService/src/PluginServiceV2.cpp index 7b520e75f..4afd1187d 100644 --- a/GaudiPluginService/src/PluginServiceV2.cpp +++ b/GaudiPluginService/src/PluginServiceV2.cpp @@ -158,7 +158,7 @@ namespace Gaudi { std::string search_path; const char* envPtr = std::getenv( envVar.c_str() ); - if ( envPtr ) search_path = envPtr; + search_path = envPtr ? envPtr : "/usr/lib64:/usr/lib:/usr/local/lib"; if ( search_path.empty() ) { return; }