Paths to internal executables (c.f. libexec) hard-coded

Kevin Funk kfunk at kde.org
Wed Aug 26 22:14:50 UTC 2015


On Wednesday 26 August 2015 13:40:20 Volker Krause wrote:
> On Wednesday 26 August 2015 13:15:15 Kevin Funk wrote:
> > Heya,
> > 
> > This is problem on Windows because the *final* installation location is
> > not
> > known at compile-time (obviously software is installed via installers,
> > users can pick up the installation prefix). Of course this also limits
> > the relocateability on other platforms, so it's not just a Windows issue
> > per se.
> > 
> > I've found this, which describes the issue in detail:
> >   https://www.mail-archive.com/kde-frameworks-devel@kde.org/msg01833.html
> > 
> > Consider this code (kio.git):
> >    const QLatin1String libExecDir(CMAKE_INSTALL_FULL_LIBEXECDIR_KF5);
> >    const QString kioslaveExecutable =
> >    
> >      QStandardPaths::findExecutable("kioslave", {libExecDir});
> > 
> > Similar code exists in other frameworks.
> > 
> > Problem:
> > - Hard-coding the install path is a no-go (for sure on Windows)
> > 
> > How can we solve this?
> > 
> > Proposals:
> > 
> > - Generic solution:
> >   - Add new API such as KSomeFittingClass::libexecPaths()
> >   
> >     which returns a list of candidates based on the platform
> >   
> >   - Then just do:
> >      `QSP::findExecutable("myexe", KSomeFittingClass::libexecPaths())`
> > 
> > - Windows solution only (also less pretty):
> >   - In every place where CMAKE_INSTALL_FULL_LIBEXECDIR_KF5 is used:
> >   - Replace install prefix by QCA::applicationDirPath() via #ifdef
> > 
> > Opinions?
> 
> You might find useful building blocks for this in GammaRay. Instead of hard-
> coding the absolute libexec dir there we compile in the relative path from
> bin to libexec (as that depends on the exact install layout you configure
> in CMake), and then combine that with QCoreApp::applicationDirPath() at
> runtime. Makes the whole installation relocatable, as long as you don't
> move things around within the install prefix itself.

Yep, thanks for this pointer. Didn't even know we had such code in GammaRay.

It's a bit more complex in KDE land because we have multiple levels of library 
dependencies, each can be installed into different locations.

Assume on Linux
- KF5 installed into /usr
- KDevelop into $HOME/opt

When invoking `kdevelop` we can't just use 
QCA::applicationDirPath()/../lib/libexec, b/c then we might not find 
executables installed by KF5 in /usr/lib/libexec.

If we want to support this case, then we'd need to create a 
KSomething::libexecPaths() method returning the following search path (in 
order):
- Windows: 
  - Just QCA::applicationDirPath() (we control the install layout anyway)
- Unix: 
  - a list based on {DY,}LD_LIBRARY_PATH, each suffixed by libexec/
  - then : As fallback: the hardcoded install prefix of KF5 as before 
(otherwise we might not check /usr/lib/libexec at all, if installed there)

This is somewhat in line what David F. suggested in his initial mail, I think.

If this is not feasible in near future, I'd also be fine just fixing the 
Windows-case by placing a few #ifdefs in KF5 code... (In fact, our shiny 
KDevelop Windows installer already contains such patches)
 
> regards,
> Volker

Cheers

-- 
Kevin Funk | kfunk at kde.org | http://kfunk.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kde-frameworks-devel/attachments/20150827/25d767f6/attachment.sig>


More information about the Kde-frameworks-devel mailing list