On Friday, 6 September 2013 12:56:56 CEST, Pali Rohár wrote:
You forgot to include [1] link.

Oops, http://labplot.sourceforge.net/developer/plugins/.

-> Is there really a problem with adding a *static plugin*
into a *shared library*?


I think yes, because that qt plugin instance function comes from static library linked into dynamic. And for this is whole-archive flag needed.

By "static plugin", I meant using the Q_IMPORT_PLUGIN within a shared library. I understand that the implementation of this plugin cannot be done via a static library because one cannot build a shared library from a few static libraries in cmake without explicit linker massaging.

This is easy and simple, just one cmake option switch and if statement. And it can be usefull if trojita is compiled with 2 defined static plugins and other dynamic plugins are not needed.

Yes, it's doable. It's also a hack, it is contrary to how it's done by other projects, very non-Qtish, and also discouraged by Thiago, Thomas and me.

I'd prefer to rely on the dynamic linker to check for
"obviously bad" installation -- hence my suggestion to move
the basic static plugins into a required shared library.


Searching for plugins is not done by dynamic linker, but by trojita code itself (in our case by QPluginLoader).

...which is why I like Thomas' suggestion to use actual instantiation of the basic plugins like passwords-in-qsettings, i.e. the call to a "impl = new FooPlugin(...)". FooPlugin's constructor can come from a shared library, and dynamic linker will make sure that Trojita won't run unless that library is found -- that's what I meant here.

No, this is for users who do not want precompiled OBS version with more plugins...

Ah, so this is about "how to package Trojita". In order to target the RPM and DEB-based distributions, I'd like to ship one package "trojita" which contains just the application (with some shared libraries if it needs them, and *including* the basic plugins like passwords-in-qsettings, preferably not as dlopen()-ed plugins). Next to that "trojita" package, let's create a ton of packages for the optional plugins -- basically one package per one plugin. Yes, this means that the standalone "trojita" package will ship with a "useless" shared library libtrojitapluginsprivate. That's acceptable to me.

(On Gentoo, there should be a single package with USE flags controling what to build, but that's not relevant for mainstream desktop Linux.)

Yes, moving build directory is something which we do not care about. But moving binary without build directory should work and not break full application.

The only two configuration I want to help Unix users with are:

1) proper installation via `make install` or package manager
2) runnig straight from the build directory

This is also common on windows platform, where user choose where he will put executable binary *not* at compile time.

I'm fine with a Windows-specific feature saying "look for runtime-loaded objects next to the directory where the binary resides" (which is, to be absolutely clear here, to be determined at runtime). I don't have any opinion (yet) on whether this shall be enabled on Unix as well; I suspect I'll be inclined to "no".

OK for you?

1) Hardcode --whole-archive and produce the following targets:
[...]
This means to drop all non gcc compilers/linkers. And you already wrote that these hacks are not acceptable.

Perosnally, I'd call this a "cmake limitation", but I agree that it is suboptimal.

2) Produce a ton of shared libraries
[...]
See my objections about tons of private libraries.

For me, a good argument against this is that these libraries are actually not self-contained, but come with interdependencies. I also do not want to go this direction.

Yes, option 3) is for me the best. It only waste disk space (kontact and trojita have duplicated code), but only one version is used at one time. And it does not need to relink every binary after single change (e.g version string)

Looks like we're in violent agreement here, then :). I also like #3.

How would you like to ship the basic plugins (passwords-in-qsettings and probably also abook-addressbook) -- as a dlopen()ed plugin, or via Q_IMPORT_PLUGIN?

--
Trojitá, a fast Qt IMAP e-mail client -- http://trojita.flaska.net/

Reply via email to