kdecore/Makefile.am | 2 + kdecore/klibloader.cpp | 86 +++++++++++++++++++++++++++---------------------- kdecore/klibloader.h | 2 - kinit/kinit.cpp | 8 +--- 4 files changed, 55 insertions(+), 43 deletions(-) --- kdelibs-3.5.5/kdecore/Makefile.am.orig 2006-10-01 19:33:38.000000000 +0200 +++ kdelibs-3.5.5/kdecore/Makefile.am 2007-01-05 00:17:27.235678750 +0100 @@ -115,8 +115,10 @@ kuser.cpp kconfigskeleton.cpp kconfigdialogmanager.cpp klockfile.cpp \ kqiodevicegzip_p.cpp ktimezones.cpp +CXXFLAGS += -fexceptions libkdecore_la_LDFLAGS = $(QT_LDFLAGS) $(KDE_RPATH) $(KDE_MT_LDFLAGS) $(X_LDFLAGS) $(USER_LDFLAGS) -version-info 6:0:2 -no-undefined libkdecore_la_LIBADD = malloc/libklmalloc.la network/libkdecorenetwork.la $(SVGICON_LIB) ../dcop/libDCOP.la ../libltdl/libltdlc.la $(LIB_XEXT) $(LIBRESOLV) $(LIBUTIL) $(LIBART_LIBS) $(LIB_IDN) ../kdefx/libkdefx.la +libkdecore_la_LIBADD += -lboost_filesystem -lboost_regex libkdecore_la_NMCHECK = $(srcdir)/libkdecore.nmcheck libkdecore_la_NMCHECKWEAK = $(srcdir)/libkdecore_weak.nmcheck $(srcdir)/libqt-mt_weak.nmcheck \ $(top_srcdir)/dcop/libDCOP_weak.nmcheck $(top_srcdir)/kdecore/standard_weak.nmcheck --- kdelibs-3.5.5/kdecore/klibloader.h.orig 2005-10-10 17:06:03.000000000 +0200 +++ kdelibs-3.5.5/kdecore/klibloader.h 2007-01-04 23:19:39.868039250 +0100 @@ -270,7 +270,7 @@ * wants to open modules. * @param name of the library. If it is not a path, the function searches in * the "module" and "lib" resources. If there is no extension, - * ".la" will be appended. + * ".so*" will be appended. * @param instance a KInstance used to get the standard paths */ static QString findLibrary( const char * name, const KInstance * instance = KGlobal::instance() ); --- kdelibs-3.5.5/kdecore/klibloader.cpp.orig 2006-01-19 17:06:18.000000000 +0000 +++ kdelibs-3.5.5/kdecore/klibloader.cpp 2007-01-05 00:08:39.215039750 +0000 @@ -331,43 +331,59 @@ d = 0L; } -static inline QCString makeLibName( const char* name ) +#include +#include +#include +#include + +QCString makeSharedLibraryName( char const* name, QString const& dir ) { - QCString libname(name); - // only append ".la" if there is no extension - // this allows to load non-libtool libraries as well - // (mhk, 20000228) - int pos = libname.findRev('/'); - if (pos < 0) - pos = 0; - if (libname.find('.', pos) < 0) - libname += ".la"; - return libname; + try + { + boost::filesystem::path d( dir.ascii() ); + std::string p = d.string() + "/" + name + ".so"; + if ( boost::filesystem::exists( p ) ) + return p.c_str(); + boost::regex re( p + "\\..+", boost::regex::extended ); + for ( boost::filesystem::directory_iterator i( d ); + i != boost::filesystem::directory_iterator(); ++i ) + { + boost::smatch m; + if ( boost::regex_match( i->string(), m, re ) ) + return m.str().c_str(); + } + } + catch ( boost::filesystem::filesystem_error const& ) + { + } + return QCString(); } -//static QString KLibLoader::findLibrary( const char * name, const KInstance * instance ) { - QCString libname = makeLibName( name ); - - // only look up the file if it is not an absolute filename - // (mhk, 20000228) - QString libfile; - if (!QDir::isRelativePath(libname)) - libfile = QFile::decodeName( libname ); - else - { - libfile = instance->dirs()->findResource( "module", libname ); - if ( libfile.isEmpty() ) - { - libfile = instance->dirs()->findResource( "lib", libname ); -#ifndef NDEBUG - if ( !libfile.isEmpty() && libname.left(3) == "lib" ) // don't warn for kdeinit modules - kdDebug(150) << "library " << libname << " not found under 'module' but under 'lib'" << endl; -#endif - } - } - return libfile; + try + { + if ( boost::filesystem::exists( name ) ) + return name; + } + catch ( boost::filesystem::filesystem_error const& ) + { + } + QStringList dirs = instance->dirs()->resourceDirs( "module" ); + for ( QStringList::ConstIterator i = dirs.begin(); i != dirs.end(); ++i ) + { + QCString p = makeSharedLibraryName( name, *i ); + if ( !p.isNull() ) + return p; + } + dirs = instance->dirs()->resourceDirs( "lib" ); + for ( QStringList::ConstIterator i = dirs.begin(); i != dirs.end(); ++i ) + { + QCString p = makeSharedLibraryName( name, *i ); + if ( !p.isNull() ) + return p; + } + return QString::null; } @@ -418,11 +434,7 @@ QString libfile = findLibrary( name ); if ( libfile.isEmpty() ) { - const QCString libname = makeLibName( name ); -#ifndef NDEBUG - kdDebug(150) << "library=" << name << ": No file named " << libname << " found in paths." << endl; -#endif - d->errorMessage = i18n("Library files for \"%1\" not found in paths.").arg(libname); + d->errorMessage = i18n("Library files for \"%1\" not found in paths.").arg(name); return 0; } --- kdelibs-3.5.5/kinit/kinit.cpp.orig 2006-10-01 19:33:32.000000000 +0200 +++ kdelibs-3.5.5/kinit/kinit.cpp 2007-01-04 23:39:00.780591750 +0100 @@ -447,7 +447,7 @@ { /* Relative name without '.la' */ name = _name; - lib = name + ".la"; + lib = name; exec = name; libpath = QFile::encodeName(KLibLoader::findLibrary( lib, s_instance )); execpath = execpath_avoid_loops( exec, envc, envs, avoid_loops ); @@ -458,9 +458,7 @@ name = _name; name = name.mid( name.findRev('/') + 1); exec = _name; - if (lib.right(3) == ".la") - libpath = lib; - else + if ( libpath.findRev( ".so" ) == -1 ) execpath = exec; } if (!args) @@ -1807,7 +1805,7 @@ #ifndef __CYGWIN__ if (!d.suicide && !getenv("KDE_IS_PRELINKED")) { - QString konq = locate("lib", "libkonq.la", s_instance); + QString konq = KLibLoader::findLibrary( "libkonq", s_instance ); if (!konq.isEmpty()) (void) lt_dlopen(QFile::encodeName(konq).data()); }